Spring学习(五)——集成MyBatis

本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3829209.html的Demo程序的基础上将 MyBatis 代码无缝地整合到 Spring 中。

数据库仍然采用前一篇文章中定义的数据库sampledb。

1、修改gradle文件,增加依赖包,代码如下:

apply plugin: 'idea' 
apply plugin: 'java'

repositories { 
    mavenCentral() 
    maven { url "http://repo.spring.io/release" } 
}

dependencies { 
    compile( 
            "org.springframework:spring-context:4.0.5.RELEASE", 
            "org.springframework:spring-web:4.0.5.RELEASE", 
            "org.springframework:spring-webmvc:4.0.5.RELEASE", 
            "org.springframework:spring-context-support:4.0.5.RELEASE", 
            "org.apache.velocity:velocity:1.7", 
            "org.apache.velocity:velocity-tools:2.0", 
            "org.anarres.gradle:gradle-velocity-plugin:1.0.0", 
            "org.springframework:spring-jdbc:4.0.5.RELEASE", 
            "commons-dbcp:commons-dbcp:1.4", 
            "org.springframework:spring-test:4.0.5.RELEASE", 
            "org.testng:testng:6.8.8", 
            "org.mybatis:mybatis:3.2.7", 
            "org.springframework:spring-tx:4.0.5.RELEASE", 
            "org.springframework:spring-orm:4.0.5.RELEASE", 
            "org.mybatis:mybatis-spring:1.2.2" 
    ) 
    testCompile("org.springframework:spring-test:4.0.5.RELEASE") 
    runtime("jstl:jstl:1.2") 
}

task copyJars(type: Copy) { 
    from configurations.runtime 
    into 'lib' // 目标位置 
}

运行命令:gradle copyJars下载。

2、修改Spring配置文件

要在Spring中使用MyBatis,需要在Spring应用上下文中定义至少两样东西:一个SqlSessionFactory和至少一个数据映射器类。

在MyBatis-Spring中,SqlSessionFactoryBean是用于创建SqlSessionFactory.的。要配置这个工厂bean,放置下面的代码在Spring的XML配置文件中:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource"/> 
        <!-- 指定mybatis的总配置文件,订制的environment在spring容器中不再生效--> 
        <property name="configLocation" value="classpath:mybatis-config.xml"/> 
        <!--指定实体类映射文件,可以同时指定某一包以及子包下面的所有配置文件,mapperLocations和configLocation有一个即可, 
        当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件 --> 
        <!--<property name="mapperLocations" value="classpath*:mybatis/*.xml"/>--> 
</bean>

其中dataSource属性用于指定数据源,我们使用上一篇中配置的datasource即可;

configLocation属性用于指定mybatis的总配置文件,订制的environment在spring容器中不再生效;

mapperLocations属性用于指定实体类映射文件,可以同时指定某一包以及子包下面的所有配置文件,mapperLocations和configLocation有一个即可,

当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件。

 配置SQLSession模板:

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

数据映射器的配置方式有三种,我们选择扩展性比较好的一种,即1个总映射文件+n个子映射文件的形式。见下面步骤:

3、增加一个总的数据映射文件

在resources文件夹下创建一个mybatis-config.xml文件,用来保存所有持久层接口的数据映射文件信息,代码如下:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration 
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
        "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
    <typeAliases> 
        <typeAlias type="domain.User" alias="User" /> 
    </typeAliases> 
    <mappers> 
        <mapper resource="mybatis/user-mapper.xml" /> 
    </mappers> 
</configuration>

4、为每个持久层接口增加一个映射文件

为User接口定义一个映射文件user-mapper.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="domain.User">
    <resultMap id="UserMap" type="User">
        <id property="userId" column="user_id" />
        <result property="userName" column="user_name" jdbcType="VARCHAR"/>
        <result property="password" column="password" jdbcType="VARCHAR"/>
        <result property="lastIp" column="last_visit" jdbcType="VARCHAR"/>
        <result property="lastVisit" column="last_ip" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="getUserByUserName" parameterType="string" resultMap="UserMap">
        SELECT *
        FROM t_user  WHERE user_name = #{userName}
    </select>
    
    <!--<select id="findAll" resultMap="UserMap" fetchSize="1">-->
        <!--SELECT * FROM t_user-->
    <!--</select>-->

    <!--<select id="count" resultType="int">-->
        <!--SELECT COUNT(*) FROM t_user;-->
    <!--</select>-->    
</mapper>

5、持久层接口定义和实现

在dao文件夹下新建接口类IUserDao:

public interface IUserDao { 
    public User getUserByUserName(String userName); 
}

修改类UserDao,使其实现IUserDao接口:

@Repository 
public class UserDao implements IUserDao {

@Autowired
public SqlSessionTemplate sqlSession; … @Override public User getUserByUserName(String userName) { return (User)sqlSession.selectOne("domain.User.getUserByUserName", userName); } }

修改类UserService:

@Service 
public class UserService {

          …

public User getUserByUserName(String userName) { 
        return userDao.getUserByUserName(userName); 
    } 
}

6、单元测试

在测试类UserServiceTest中增加单元测试函数:

@Test 
    public void getUserByUserName() { 
        User user = userService.getUserByUserName("admin"); 
        assertEquals(user.getUserName(), "admin"); 
    }

运行测试类,测试通过。

7、运行网站

将LoginController类中的loginCheck函数中调用findUserByUserName()函数的地方改为调用getUserByUserName(),运行Tomcat,验证记录日志正确。

注意:如果lib中的jar包未自动输出到out目录,请手动拷贝过去。

源码下载:https://files.cnblogs.com/wenjingu/VelocityDemo4.0.zip lib中的jar包上传时已删除,请运行命令:gradle copyJars下载。

posted on 2014-07-07 17:19  顾文锦  阅读(1266)  评论(0编辑  收藏  举报