Mybatis学习记录(五)--整合spring开发Dao

mybatis和spring整合,也就是通过spring管理SqlSessionFactory、mapper接口。

一.导入架包

除了spring的包和mybatis的包,还需要导入两者的整合包,目前这个包由mybatis提供

mybatis-spring-1.2.0.jar


二.一些必要的配置文件

1.log4j配置

需要先导入log4j的架包,然后建立log4j.properties

# Global logging configuration
#在开发环境中要设置为DEBUG,不然不会打印出信息
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2.数据库连接参数配置

由于使用druid连接池,所以配置参数也在里面一起配置

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shopdemo?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
jdbc.username=root
jdbc.password=123456

filters:stat

maxActive:20
initialSize:1
maxWait:60000
minIdle:10

timeBetweenEvictionRunsMillis:60000
minEvictableIdleTimeMillis:300000

validationQuery:SELECT ‘x‘
testWhileIdle:true
testOnBorrow:false
testOnReturn:false

maxOpenPreparedStatements:20
removeAbandoned:true
removeAbandonedTimeout:1800
logAbandoned:true

3.applicationContext配置

在这个里面我们主要把mybatis的数据库源和SqlSessionFactory来交给spring管理.这里的连接池使用阿里的druid连接池.

<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 加载数据库配置文件 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--配置数据库连接池Druid-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <!-- 数据库基本信息配置 -->
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="filters" value="${filters}" />
        <!-- 最大并发连接数 -->
        <property name="maxActive" value="${maxActive}" />
        <!-- 初始化连接数量 -->
        <property name="initialSize" value="${initialSize}" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="${maxWait}" />
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="${minIdle}" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
        <property name="validationQuery" value="${validationQuery}" />
        <property name="testWhileIdle" value="${testWhileIdle}" />
        <property name="testOnBorrow" value="${testOnBorrow}" />
        <property name="testOnReturn" value="${testOnReturn}" />
        <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" />
        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="${removeAbandoned}" />
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="${logAbandoned}" />
    </bean>

    <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 加载mybatis的全局配置文件 -->
        <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
    </bean>

</beans>

到此基本配置就完成了


三.整合后开发DAO方法

首先, 通过翻阅源码,我们来整理一下mybatis进行持久化操作时重要的几个类:

  1. SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例。
  2. SqlSessionFactory:创建SqlSession实例的工厂。
  3. SqlSession:用于执行持久化操作的对象,类似于jdbc中的Connection。
  4. SqlSessionTemplate:MyBatis提供的持久层访问模板化的工具,线程安全,可通过构造参数或依赖注入SqlSessionFactory实例。

1.原始dao方法

原始方法就是写好mapper.xml映射,然后写dao接口,再写dao实现类,最后测试.

1.mapper映射

UserMapper.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">
<!--命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。-->
<mapper namespace="UserMapper">
    <!--根据id查询出用户信息(查询一条数据)-->
    <select id="findUserById" parameterType="int" resultType="com.aust.model.User">
        SELECT * FROM user WHERE id=#{id}
    </select>
</mapper>

其次在sqlMapConfig.xml中配置映射

<mappers>
    <mapper resource="mybatis/mapper/UserMapper.xml"/>
</mappers>

2.dao接口

UserDao.java

public interface UserDao {
    public User findUserById(int id);
}

3.dao实现类

这里需要注意的就是在实现类中我们需要使用sqlSession这个变量,因此需要spring提前注入进去,整合包中帮我们提供了SqlSessionDaoSupport这个类,集成他之后,再在spring配置文件中配置下就可以实现注入了,省去了自己写注入代码的烦恼.

UserDaoImp.java

public class UserDaoImp extends SqlSessionDaoSupport implements UserDao {

    @Override
    public User findUserById(int id) {
        SqlSession session = this.getSqlSession();
        User user = session.selectOne("UserMapper.findUserById",id);
        return user;
    }
}

需要在spring中配置注入

    <!--显示注入sqlsessionFactory-->
    <bean class="com.aust.dao.UserDaoImp" id="userDao">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

4.junit测试

    ApplicationContext context = null;

    @Before
    public void init(){
        //得到spring容器
        context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    @Test
    public void findUserByIdTest(){
        //从spring容器中获取bean
        UserDaoImp daoImp = (UserDaoImp) context.getBean("userDao");
        //执行查询
        User user = daoImp.findUserById(18);
        System.out.println(user.toString());
    }


2.mapper代理方法

代理方法和之前一样,不需要写实现类,现在是有spring自动创建实现类.

1.mapper.xml文件

需要注意的就是namespace需要写上mapper接口的类路径名

<?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">
<!--命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。-->
<mapper namespace="com.aust.dao.UserMapper">
    <!--根据id查询出用户信息(查询一条数据)-->
    <select id="findUserById" parameterType="int" resultType="com.aust.model.User">
        SELECT * FROM user WHERE id=#{id}
    </select>
</mapper>

2.UserMapper.java

mapper接口,用于spring来创建管理

public interface UserMapper {
    public User findUserById(int id);
}

3.spring配置管理mapper

    <!--配置mapper方式-->
    <!--MapperFactoryBean用于根据mapper接口创建动态代理对象的工厂-->
    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!--mapperInterface要创建代理的接口对象-->
        <property name="mapperInterface" value="com.aust.dao.UserMapper"/>
        <!--sqlSessionFactory配置-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

4.junit测试类

    ApplicationContext context = null;

    @Before
    public void init(){
        //得到spring容器
        context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    @Test
    public void findUserByIdTest(){
        UserMapper userMapper = (UserMapper) context.getBean("userMapper");
        User user = userMapper.findUserById(18);
        System.out.println(user.toString());
    }

5.带来的问题

此方法问题需要针对每一个mapper来配置,这样的话,如果很多mapper则配置相当繁琐.因此就可以用扫描器来配置mapper,不过需要遵循一些约定.

    <!--mapper批量扫描,扫描出来的mapper会自动创建代理对象,并在spring容器中注册
        遵循约定:需要将mapper.java和mapper.xml放在同一个包中,且名称一致
        自动扫描注册的bean名称为mapper接口类名(首字母小写)
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--配置要扫描的包,如果有多个包需要用逗号隔开-->
        <property name="basePackage" value="com.aust.dao"/>
        <!--使用beanname来配置,防止提前加载而加载不到相应的bean-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

3.基于sqlSessionTemplate开发

1.UserDao

public class UserDao {
//使用SqlSessionTemplate
    private SqlSessionTemplate sessionFactory;
//这里实现set方法,用于spring的注入
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sessionFactory = sqlSessionTemplate;
    }

    public User findUserById(int id){
        User user = sessionFactory.selectOne("userMapper.findUserById",id);
        return user;
    }
}

2.spring配置

    <!--sqlSession模板,本身线程安全-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
    </bean>
    <bean class="com.aust.dao.userDao" id="userDao">
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>

3.junit测试

    ApplicationContext context = null;

    @Before
    public void init(){
        //得到spring容器
        context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    @Test
    public void findUserByIdTest(){
        UserDao userDao = (userDao) context.getBean("userDao");
        User user = userDao.findUserById(18);
        System.out.println(user.toString());
    }

这种方式和第一种方式差不多,不同的就是sqlSession获得的方式.

时间: 2024-09-30 03:31:36

Mybatis学习记录(五)--整合spring开发Dao的相关文章

JAVA学习笔记(五十二)- 开发DAO层的经典实现

StudentDAO接口,定义学生相关的操作 /* * StudentDAO接口,定义学生相关的操作 */ public interface StudentDAO { //添加学生 public void addStudent(Student stu); //删除学生 public void deleteStudent(int id); //修改学生 public void updateStudent(Student stu); //查询所有学生 public List<Student> ge

Spring Boot学习记录(三)--整合Mybatis

Spring Boot学习记录(三)–整合Mybatis 标签(空格分隔): spring-boot 控制器,视图解析器前面两篇都已弄好,这一篇学习持久层框架整合. 1.数据源配置 数据源使用druid,maven引入相关依赖,包括spring-jdbc依赖,mysql依赖 1.转换问题 配置的过程要学会为什么这样配置,而不是只学会了配置.这里我们可以和以前的配置方式对比: 以前版本 <!--配置数据库连接池Druid--> <bean id="dataSource"

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

Mybatis学习记录(二)--Mybatis开发DAO方式

mybatis开发dao的方法通常用两种,一种是传统DAO的方法,一种是基于mapper代理的方法,下面学习这两种开发模式. 写dao之前应该要对SqlSession有一个更加细致的了解 一.mybatis的SqlSession使用范围 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产

Mybatis学习笔记(二) 之Dao开发

使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法,常用还是Mapper接口开发. SqlSession的使用范围 SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等.通过SqlSessionFactory创建SqlSession,而SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建. 1.SqlSessionFactoryBuilder

Mybatis学习记录(三)--Mybatis配置文件详解

关于mybatis的配置文件,主要有两个,一个是SqlMapperConfig.xml文件一个是mapper.xml文件,分别对这两个进行深入全面学习. 一.SqlMapperConfig.xml文件 1.标签概况 在SqlMapperConfig.xml中主要有以下标签,其中环境集合environments和spring整合后废除不用.objectFactory和plugins不经常使用. properties(属性) settings(全局配置参数) typeAliases(类型别名) ty

mybatis学习记录

转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibat

mybatis学习记录------4

一 mybatis开发dao的方法 1 SqlSessionFactoryBuilder: 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder.在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可. 2 SqlSessionFactory 通过

搭建Spring + SpringMVC + Mybatis框架之三(整合Spring和Mybatis)

整合Spring和SpringMVC 之前已经整合了spring和mybatis,现在在此基础上整合SSM. 项目目录: 思路:SpringMVC的配置文件独立,然后在web.xml中配置整合. (1)配置spring-mvc.xml 主要是自动扫描控制器,视图模式. <?xml version="1.0" encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/sch