springmvc、jpa(hibernate)、mybatis组合框架搭建(二)——加入mybatis以及json返回值

来源:互联网 发布:java程序设计教程 实验 编辑:程序博客网 时间:2024/06/07 03:50
上次我们搭建了一个基本的mvc框架,这次,我们接通mybatis,并且,让返回值可以是json格式的。

mybatis

首先,我们要加入mybatis的spring配置文件spring-mybatis.xml,然后再spring-context.xml里引入它,参照上次的spring-mvc.xml的引入就好。以下,是这个文件里的内容。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xsi:schemaLocation="http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd                        http://www.springframework.org/schema/context                        http://www.springframework.org/schema/context/spring-context-3.1.xsd                        http://www.springframework.org/schema/mvc                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">    <!-- 数据源 org.apache.commons.dbcp.BasicDataSource com.alibaba.druid.pool.DruidDataSource -->    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">        <property name="driverClassName" value="${jdbc.driver}" />        <property name="url" value="${jdbc.url}" />        <property name="username" value="${jdbc.username}" />        <property name="password" value="${jdbc.password}" />        <!-- 初始化连接大小 -->        <property name="initialSize" value="0" />        <!-- 连接池最大使用连接数量 -->        <property name="maxActive" value="20" />        <!-- 连接池最小空闲 -->        <property name="minIdle" value="0" />        <!-- 获取连接最大等待时间 -->        <property name="maxWait" value="60000" />        <property name="validationQuery"><value>SELECT 1</value></property>        <property name="testOnBorrow" value="false" />        <property name="testOnReturn" value="false" />        <property name="testWhileIdle" value="true" />        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->        <property name="timeBetweenEvictionRunsMillis" value="6000" />        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->        <property name="minEvictableIdleTimeMillis" value="25200000" />        <!-- 打开removeAbandoned功能 -->        <property name="removeAbandoned" value="true" />        <!-- 1800秒,也就是30分钟 -->        <property name="removeAbandonedTimeout" value="1800" />        <!-- 关闭abanded连接时输出错误日志 -->        <property name="logAbandoned" value="true" />        <!-- 监控数据库 -->        <!-- <property name="filters" value="stat" /> -->        <!--<property name="filters" value="mergeStat" />-->    </bean>    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dataSource" />        <!-- 自动扫描mapping.xml文件 -->        <property name="mapperLocations" value="classpath:mybatis/mapper/**/*.xml"></property>    </bean>    <!-- DAO接口所在包名,Spring会自动查找其下的类 -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">        <property name="basePackage" value="nature.demo.dao" />        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>    </bean>    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->    <bean id="transactionManager"          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource" />    </bean></beans>
    可以看到的是,首先是对dataSource数据源的配置,这里我们用的是阿里的druid的数据源,原因就是网上盛传它最快,具体再测吧。这里有个很深的坑,坑了我很久,注意变量,尤其是${jdbc.username},这里我之前是${username},本来说贪省事,加多的配置再改,结果坑了很久,注意${username}这个变量拿的是当前系统的登录用户的用户名。所以,我都加了jdbc前缀,就都拿到我自己配的值了。    然后大家看下面的sqlSessionFactory的配置,里面mapperLocation的配置,指明了我扫描对应的mapper的配置文件的地方,所以我这里建立了resources/mybatis/mapper目录,里面放了demoMapper.xml文件。    后面org.mybatis.spring.mapper.MapperScannerConfigurer配置了我去哪里扫描dao接口文件,然后,用谁来解析dao接口    transactionManager是事务的配置,在这个demo里面没有用到。    为了支撑这段配置,我们需要建立对应的到接口,mapper.xml,maven依赖。我们建立了nature.demo.dao.DemoDao和demoMapper.xml

nature.demo.dao.DemoDao如下:

package nature.demo.dao;import java.util.List;import java.util.Map;/** * Created by nature on 17-7-26. */public interface DemoDao {    public List<Map<String,Object>> demoSelect();}

demoMapper.xml文件如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="nature.demo.dao.DemoDao">    <select id="demoSelect" resultType="java.util.HashMap">    select * from demo  </select></mapper>

pom.xml中加入的依赖如下:

<dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis</artifactId>    <version>${version.mybatis}</version></dependency><dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis-spring</artifactId>    <version>1.2.2</version></dependency><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.34</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.0.7</version></dependency>

nature.properties中加入的属性配置如下:

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/testjdbc.username=rootjdbc.password=123456

至此,我们已经可以访问数据库了。然后,我们在之前的DemoController中加入对应的方法来访问数据库,如下:

package nature.demo.controller;import nature.demo.dao.DemoDao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;import java.util.List;import java.util.Map;/** * Created by nature on 17-7-25. *  nature的demo * */@Controller@RequestMapping("/demo")public class DemoController {    @Resource    private DemoDao demoDao;    /**     * 单纯验证     * @return     */    @ResponseBody    @RequestMapping("/ping")    public String ping(){        return "pong";    }    @ResponseBody    @RequestMapping("/demoselect")    public List<Map<String,Object>> demoSelect(){        return demoDao.demoSelect();    }}
    如上面代码,我们加了demoSelect。如果这个时候,你访问http://localhost:8080/demo/demoselect,会发现,数据查出来了,但是,无法返回,会报错。因为,无法将List<Map<String,Object>>转化成json。需要加入一段配置,让@ResponseBody可以正常的将结果实体转化成json。我们在spring-mvc.xml中加入如下配置:
  <!--使用jsonconverter,避免IE执行AJAX时,返回JSON出现下载文件 -->    <bean id="mappingJackson2HttpMessageConverter"          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">        <property name="supportedMediaTypes">            <list>                <bean class="org.springframework.http.MediaType">                    <constructor-arg index="0" value="text"/>                    <constructor-arg index="1" value="plain"/>                    <constructor-arg index="2" value="UTF-8"/>                </bean>            </list>        </property>    </bean>    <!--接口返回中文乱码问题-->    <mvc:annotation-driven>        <mvc:message-converters>            <bean class="org.springframework.http.converter.StringHttpMessageConverter">                <property name="supportedMediaTypes">                    <list>                        <value>application/json;charset=UTF-8</value>                        <value>text/html;charset=UTF-8</value>                    </list>                </property>            </bean>        </mvc:message-converters>    </mvc:annotation-driven>
    网上查到的很多资料用的配置Converter的方法,用到的类都是过期的,最后找到这个,有效,并且未过期,具体未研究,再说吧,后面对返回值格式控制的时候再说吧。

需要加入的依赖如下:

<!-- 使用Json所依赖的jar包 --><dependency>    <groupId>com.fasterxml.jackson.core</groupId>    <artifactId>jackson-databind</artifactId>    <version>2.5.4</version></dependency>
阅读全文
0 0