Mybatis整合spring

1. Mybatis整合spring

1.1 整合思路

  1. SqlSessionFactory对象应该放到spring容器中作为单例存在。
  2. 传统dao的开发方式中,应该从spring容器中获得sqlsession对象。
  3. Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
  4. 数据库的连接以及数据库连接池事务管理都交给spring容器来完成。

1.2 整合需要的jar包

  1. spring的jar包
  2. Mybatis的jar包
  3. Spring+mybatis的整合包。
  4. Mysql的数据库驱动jar包。
  5. 数据库连接池的jar包。

1.3 整合的步骤

第一步:创建一个java工程。
第二步:导入jar包。(上面提到的jar包)
第三步:mybatis的配置文件sqlmapConfig.xml
第四步:编写Spring的配置文件
1) 数据库连接及连接池
2) 事务管理(暂时可以不配置)
3) sqlsessionFactory对象,配置到spring容器中
4) mapeer代理对象或者是dao实现类配置到spring容器中。
第五步:编写dao或者mapper文件
第六步:测试。

SqlMapConfig.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>
          <package name="com.dml.pojo"/>
    </typeAliases>

    <!-- 引入配置文件 -->
    <mappers>
        <mapper resource="User.xml"/>
    </mappers>
</configuration>

ApplicationContext.xml

<?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>

    <!-- 整合后会话工厂归spring管理 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定mybatis核心配置文件 
            spring配置:要加classpath
        -->
        <property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
        <!-- 指定会话工厂使用的数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置原生Dao实现   class必须指定dao实现类的全路径名 -->
    <bean id="userDao" class="com.dml.dao.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>


    <!-- mapper接口代理的实现 -->
    <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        配置mapper接口的全路径名称
        <property name="mapperInterface" value="com.dml.mapper.UserMapper"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean> -->

    <!-- 使用包扫描的方式批量引入Mapper
        扫描后引用的时候可以使用类名,首字母小写.
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定要扫描的包全路径名称,如果有多个包用英文状态下的逗号分隔 -->
        <property name="basePackage" value="com.dml.mapper"></property>
    </bean>
</beans>

db.properties

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

1.4 Dao的开发

三种dao的实现方式:
1、传统dao的开发方式
2、使用mapper代理形式开发方式
3、使用扫描包配置mapper代理。

1.4.1 传统dao的开发方式

接口+实现类来完成。需要dao实现类需要继承SqlsessionDaoSupport类
UserDao.java

public interface UserDao {
    //通过id查找用户
    public User findUserById(Integer id);
    //通过模糊查询名字查找用户
    public List<User> findUserByName(String userName);
}

UserDaoImpl.java

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{

    //通过id查找用户
    public User findUserById(Integer id) {
        //SqlSession是线程不安全的,所以它的最佳使用范围在方法体内
        SqlSession openSession = this.getSqlSession();
        User user = openSession.selectOne("test.findUserById",id);

        //整合后会话归spring管理,所以不需要关闭,否则报错
//      openSession.close();
        return user;
    }

    //通过模糊查询名字查找用户
    public List<User> findUserByName(String userName) {
        SqlSession openSession = this.getSqlSession();
        List<User> list = openSession.selectList("test.findUserByName", userName);
        return list;
    }
}

配置dao
ApplicationContext.xml

<!-- 配置原生Dao实现   class必须指定dao实现类的全路径名 -->
    <bean id="userDao" class="com.dml.dao.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

测试UserDaoTest.java

public class UserDaoTest {
    private ApplicationContext applicationContext;

    @Before
    public void setUp() throws Exception{
        applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    }

    @Test
    public void testFindUserById() throws Exception{
        //获取UserDao对象
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");

        User user = userDao.findUserById(1);
        System.out.println(user);
    }
}

1.4.2 Mapper代理形式开发dao

UserMapper.xml
UserMapper.java
与之前是一样的

配置mapper代理

方法1:

<!-- mapper接口代理的实现 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        配置mapper接口的全路径名称
        <property name="mapperInterface" value="com.dml.mapper.UserMapper"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

方法2:

<!-- 使用包扫描的方式批量引入Mapper
        扫描后引用的时候可以使用类名,首字母小写.
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定要扫描的包全路径名称,如果有多个包用英文状态下的逗号分隔 -->
        <property name="basePackage" value="com.dml.mapper"></property>
    </bean>

测试UserMapperTest.java

public class UserMapperTest {
    private ApplicationContext applicationContext;

    @Before
    public void setUp() throws Exception{
        applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
    }

    @Test
    public void testFindUserById() throws Exception{
        UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");

        User user = userMapper.findUserById(1);
        System.out.println(user);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值