Mybatis整合Spring

来源:互联网 发布:homer软件 编辑:程序博客网 时间:2024/05/21 17:26

Mybatis整合spring

1.整合思路

1.sqlSessionFactory对象应该放到spring容器中作为单例存在。
2.传统的dao开发非那根是中应该从spring容器中获取SqlSession对象。
3.Mapper代理形式中,应该从spring容器红直接获得mapper的代理对象
4.数据库的链接以及数据库连接池事务管理都交给spring容器来完成。
整合所需要的jar包。
1.spring的jar包
如图:
2.mybatis的jar包
这里写图片描述
3.spring+mybatis的整合包
mybatis-spring.jar
4.mysql包

dbcp连接池

    <!-- dbcp数据源 -->                <context:property-placeholder location="classpath:db.properties" />                <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"                    destroy-method="close">                    <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="maxActive" value="10" />                    <property name="maxIdle" value="5" />                </bean>

5.加入配置文件
1)mybatisspring的配置文件
数据库连接以及连接池
事务管理
sqlSessionFactory对象配置到spring容器

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!-- 设置别名 -->    <typeAliases>        <!-- 2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 -->        <package name="cn.itcast.mybatis.pojo" />    </typeAliases></configuration>

配置applicationContext.xml
SqlSessionFactoryBean属于mybatis-spring这个jar包
对于spring来说,mybatis是另外一个架构,需要整合jar包

在项目中加入mybatis-spring-1.2.2.jar的源码

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">   <!-- 加载配置文件 -->   <context:property-placeholder location="classpath:db.properties" />    <!-- 数据库连接池 -->    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"        destroy-method="close">        <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="maxActive" value="10" />        <property name="maxIdle" value="5" />    </bean>    <!-- 配置SqlSessionFactory -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <!-- 配置mybatis核心配置文件 -->        <property name="configLocation" value="classpath:SqlMapConfig.xml" />        <!-- 配置数据源 -->        <property name="dataSource" ref="dataSource" />    </bean></beans>

5.3.3.3.db.properties

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8jdbc.username=rootjdbc.password=root

log4j.properties

# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

这里写图片描述

Dao开发

两种dao的实现方式:
1、原始dao的开发方式
2、使用Mapper代理形式开发方式
a)直接配置Mapper代理
b)使用扫描包配置Mapper代理
需求:
1.实现根据用户id查询
2.实现根据用户名模糊查询
3.添加用户
第一步 创建pojo

public class User {    private int id;    private String username;// 用户姓名    private String sex;// 性别    private Date birthday;// 生日    private String address;// 地址get/set。。。}

5.4.2.传统dao的开发方式
原始的DAO开发接口+实现类来完成。
需要dao实现类需要继承SqlsessionDaoSupport类

5.4.2.1.实现Mapper.xml
编写User.xml配置文件,如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="test">    <!-- 根据用户id查询 -->        <select id="queryUserById" parameterType="int" resultType="user">        select * from user where id = #{id}    </select>    <!-- 根据用户名模糊查询用户 -->    <select id="queryUserByUsername" parameterType="string"        resultType="user">        select * from user where username like '%${value}%'    </select>    <!-- 添加用户 -->    <insert id="saveUser" parameterType="user">        <selectKey keyProperty="id" keyColumn="id" order="AFTER"            resultType="int">            select last_insert_id()        </selectKey>        insert into user        (username,birthday,sex,address)        values        (#{username},#{birthday},#{sex},#{address})    </insert></mapper>

5.4.2.2.加载Mapper.xml
在SqlMapConfig如下图进行配置:

这里写图片描述

5.4.2.3.实现UserDao接口

public interface UserDao {    /**     * 根据id查询用户     *      * @param id     * @return     *   */    User queryUserById(int id);    /**     * 根据用户名模糊查询用户列表     *      * @param username     * @return     */    List<User> queryUserByUsername(String username);    /**     * 保存     *      * @param user     */    void saveUser(User user);}

5.4.2.4.实现UserDaoImpl实现类编写DAO实现类,实现类必须集成SqlSessionDaoSupport
SqlSessionDaoSupport提供getSqlSession()方法来获取SqlSession

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {    @Override    public User queryUserById(int id) {        // 获取SqlSession        SqlSession sqlSession = super.getSqlSession();        // 使用SqlSession执行操作        User user = sqlSession.selectOne("queryUserById", id);        // 不要关闭sqlSession        return user;    }    @Override    public List<User> queryUserByUsername(String username) {        // 获取SqlSession        SqlSession sqlSession = super.getSqlSession();        // 使用SqlSession执行操作        List<User> list = sqlSession.selectList("queryUserByUsername", username);        // 不要关闭sqlSession        return list;    }    @Override    public void saveUser(User user) {        // 获取SqlSession        SqlSession sqlSession = super.getSqlSession();        // 使用SqlSession执行操作        sqlSession.insert("saveUser", user);        // 不用提交,事务由spring进行管理        // 不要关闭sqlSession    }}

5.4.2.5.配置dao
5.4.2.5.配置dao
把dao实现类配置到spring容器中,如下图
这里写图片描述

5.4.2.6.测试方法
创建测试方法,可以直接创建测试Junit用例。
如下图所示进行创建。

public class UserDaoTest {    private ApplicationContext context;    @Before    public void setUp() throws Exception {        this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");    }    @Test    public void testQueryUserById() {        // 获取userDao        UserDao userDao = this.context.getBean(UserDao.class);        User user = userDao.queryUserById(1);        System.out.println(user);    }    @Test    public void testQueryUserByUsername() {        // 获取userDao        UserDao userDao = this.context.getBean(UserDao.class);        List<User> list = userDao.queryUserByUsername("张");        for (User user : list) {            System.out.println(user);        }    }    @Test    public void testSaveUser() {        // 获取userDao        UserDao userDao = this.context.getBean(UserDao.class);        User user = new User();        user.setUsername("曹操");        user.setSex("1");        user.setBirthday(new Date());        user.setAddress("三国");        userDao.saveUser(user);        System.out.println(user);    }}

5.4.3.Mapper代理形式开发dao

编写UserMapper.xml配置文件,如下:(注意一定要把UseMapper.xml与UserMapper接口放在同一个目录下,这样方便代码运行时候容易找到否则很容易出错)

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.itcast.mybatis.mapper.UserMapper">    <!-- 根据用户id查询 -->    <select id="queryUserById" parameterType="int" resultType="user">        select * from user where id = #{id}    </select>()    <!-- 根据用户名模糊查询用户 -->    <select id="queryUserByUsername" parameterType="string"        resultType="user">        select * from user where username like '%${value}%'    </select>    <!-- 添加用户 -->    <insert id="saveUser" parameterType="user">        <selectKey keyProperty="id" keyColumn="id" order="AFTER"            resultType="int">            select last_insert_id()        </selectKey>        insert into user        (username,birthday,sex,address) values        (#{username},#{birthday},#{sex},#{address})    </insert></mapper>

5.4.3.2.实现UserMapper接口

public interface UserMapper {    /**     * 根据用户id查询     *      * @param id     * @return     */    User queryUserById(int id);    /**     * 根据用户名模糊查询用户     *      * @param username     * @return     */    List<User> queryUserByUsername(String username);    /**     * 添加用户     *      * @param user     */    void saveUser(User user);}

5.4.3.3.配置mapper代理在applicationContext.xml添加配置
MapperFactoryBean也是属于mybatis-spring整合包

<!-- Mapper代理的方式开发方式一,配置Mapper代理对象 --><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">    <!-- 配置Mapper接口 -->    <property name="mapperInterface" value="cn.itcast.mybatis.mapper.UserMapper" />    <!-- 配置sqlSessionFactory -->    <property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean>

5.4.3.4.测试方法

public class UserMapperTest {    private ApplicationContext context;    @Before    public void setUp() throws Exception {        this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");    }    @Test    public void testQueryUserById() {        // 获取Mapper        UserMapper userMapper = this.context.getBean(UserMapper.class);        User user = userMapper.queryUserById(1);        System.out.println(user);    }    @Test    public void testQueryUserByUsername() {        // 获取Mapper        UserMapper userMapper = this.context.getBean(UserMapper.class);        List<User> list = userMapper.queryUserByUsername("张");        for (User user : list) {            System.out.println(user);        }    }    @Test    public void testSaveUser() {        // 获取Mapper        UserMapper userMapper = this.context.getBean(UserMapper.class);        User user = new User();        user.setUsername("曹操");        user.setSex("1");        user.setBirthday(new Date());        user.setAddress("三国");        userMapper.saveUser(user);        System.out.println(user);    }}

方式二:扫描包形式配置mapper

!-- Mapper代理的方式开发方式二,扫描包方式配置代理 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    <!-- 配置Mapper接口 -->    <property name="basePackage" value="cn.itcast.mybatis.mapper" /></bean>