mybatis和spring框架的整合

2021-07-08
0

 

 

Mybatis+Sping整合

 

 

  1. mybatis+spring整合
    1. 整合思路

思路:将mybatis框架的对象,交给spring管理。

  1. 把SqlSessionFactory对象,交给spring管理
  2. 把SqlSession对象,交给spring管理
  3. 在原始的dao开发方法中,将dao实现类对象交给spring管理
  4. 在mapper代理开发方法中,把mapper代理对象交给spring管理
  5. 把数据源对象,交给spring管理

 

    1. 整合步骤
      1. 创建项目(mybatis-spring)

 

      1. 加入spring和mybatis框架以及整合包

mybatis框架包

spring框架包

mybaits-spring整合包

数据库驱动包

数据库连接池包(dbcp)

log4j日志包

junit单元测试包

 

      1. 准备配置文件
        1. sqlMapConfig.xml

配置别名

配置加载mapper映射文件(在这里配置的是原始的dao开发方法的配置文件)

<?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="cn.bdqn.ssm.po"/>

</typeAliases>

 

<!-- 配置映射文件 -->

<mappers>

     <mapper resource="sqlmap/User.xml"/>

</mappers>

 

</configuration>

 

        1. applicationContext.xml

配置数据源对象(dataSource)

配置mybatis核心对象(SqlSessionFactory)

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

 

<!-- 配置加载db.properties属性文件 -->

<context:property-placeholder location="classpath:db.properties" />

 

<!-- 配置数据库连接池 -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

     destroy-method="close" >

    

     <property name="driverClassName" value="${db.driverClassName}" />

     <property name="url" value="${db.url}" />

     <property name="username" value="${db.username}" />

     <property name="password" value="${db.password}" />

    

    <!-- 最大连接数量 -->

     <property name="maxActive" value="${db.maxActive}" />

     <!-- 最小空闲连接数量 -->

     <property name="minIdle" value="${db.minIdle}" />

     <!-- 最大空闲连接数量 -->

     <property name="maxIdle" value="${db.maxIdle}" />

     <!-- 初始化连接数数量 -->

     <property name="initialSize" value="${db.initialSize}" />

     <!-- 超时等待时间,以毫秒为单位 -->

     <property name="maxWait" value="${db.maxWait}" />

    

</bean>

 

<!-- 配置SqlSessionFactoryBean -->

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

     <!-- 注入数据源对象 -->

     <property name="dataSource" ref="dataSource"/>

    

     <!-- 加载mybatis框架的主配置文件 -->

     <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>

</bean>

</beans>

 

        1. db.properties

db.driverClassName=com.mysql.jdbc.Driver

db.url=jdbc:mysql://127.0.0.1:3306/dbqn

db.username=root

db.password=root

 

db.maxActive=10

db.minIdle=2

db.maxIdle=5

db.initialSize=5

db.maxWait=6000

 

        1. log4j.properties

# Global logging configuration

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

 

      1. 整合好的项目

 

    1. 原始的dao开发方法
      1. 需求
  1. 根据用户id查询用户
  2. 新增一个用户

 

      1. 需求实现
        1. 准备用户pojo

 

        1. 准备User.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">

<!-- namespace:名称空间,相当于java中的package,用于防止sql语句名称冲突(sql语句隔离) -->

<mapper namespace="test">

<!--说明:myatis框架针对每一种sql语句:新增/修改/删除/查询,提供了对应过的标签:

     insert/update/delete/select来放置

  -->

 

  <!-- 根据用户id查询用户,说明:

    select标签:用于放置查询的sql语句

    id:唯一标识一条sql语句

    parameterType:输入参数的类型

    resultType:返回值的类型(暂时需要记住使用的类的全限定名称)

    #{id}:占位符,相当于jdbc中的问号?

   -->

 <select id="queryUserById" parameterType="int" resultType="user" >

    select * from `user` where id=#{id}

 </select>

 

 <!-- 新增用户,说明:

    insert标签:用于放置新增sql语句

    #{id}:字符串拼接符,当参数传递的是pojo的时候,花括号中的内容是pojo的属性

  -->

  <insert id="insertUser" parameterType="user">

    insert into `user`(username,birthday,sex,address)

    values(#{ username},#{birthday},#{sex},#{address})

  </insert>

 

</mapper>

 

 

        1. 编写用户dao接口

package cn.bdqn.ssm.dao;

 

import cn.bdqn.ssm.po.User;

 

public interface UserDao {

 

//1.根据用户id查询用户

User queryUserById(Integer id);

 

// 2.新增一个用户

void insertUser(User user);

 

}

 

 

        1. 实现用户dao接口

说明:整合包提供了SqlSessionDaoSupport类,我们的dao实现类需要继承SqlSessionDaoSupport类,获取到sqlSession对象。

 

package cn.bdqn.ssm.dao.impl;

 

import org.apache.ibatis.session.SqlSession;

import org.mybatis.spring.support.SqlSessionDaoSupport;

 

import cn.bdqn.ssm.dao.UserDao;

import cn.bdqn.ssm.po.User;

 

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

 

/**

 * 根据用户id查询用户

 */

public User queryUserById(Integer id) {

     // 1.获取sqlSession对象

     SqlSession sqlSession = this.getSqlSession();

    

     // 2.使用sqlSession对象,调用方法执行

     Object user = sqlSession.selectOne("test.queryUserById", id);

    

     /**

      *  释放资源:

      *      与spring整合以后,sqlSession对象交给spring管理,不需要再手动释放(不能)

      */

 

     return (User) user;

}

 

/**

 * 新增一个用户

 */

public void insertUser(User user) {

     // 1.获取sqlSession对象

     SqlSession sqlSession = this.getSqlSession();

    

     // 2.使用sqlSession对象,调用方法执行

     sqlSession.insert("test.insertUser", user);

    

     /**

      *  释放资源:

      *      1.与spring整合以后,sqlSession对象交给spring管理,不需要再手动释放(不能)

      *      2.与spring整合以后,sqlSession对象交给spring管理,不需要再关心事务

      *  (如果配置了spring的事务,使用spring事务;如果没有配置,使用jdbc的事务)

      */

 

}

 

}

 

        1. 在applicationContext.xml文件中,配置用户dao实现类对象

<!-- 配置用户dao实现类对象 -->

<bean id="userDao" class="cn.bdqn.ssm.dao.impl.UserDaoImpl">

     <!-- 注入sqlSessionFactory对象 -->

     <property name="sqlSessionFactory" ref="sqlSessionFactory"/>

</bean>

 

 

 

        1. 编写测试代码

package cn.bdqn.ssm.test;

 

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import cn.bdqn.ssm.dao.UserDao;

import cn.bdqn.ssm.po.User;

 

/**

 * @ClassName: UserDaoTest

 * @Description:用户dao开发方法测试

 * @author  老师 

 * @date 2018-4-9 下午2:40:34

 * 

 */

public class UserDaoTest {

 

/**

 * 测试根据用户id查询用户

 */

@Test

public void queryUserByIdTest(){

    

     // 1.加载spring配置文件,创建spring容器

     ApplicationContext context =

             new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");

    

     // 2.从容器中,获取用户dao对象

     UserDao userDao = (UserDao) context.getBean("userDao");

    

     User user = userDao.queryUserById(2);

     System.out.println(user);

    

}

 

}

 

 

测试新增用户:

 

/**

 * 测试新增一个用户

 */

@Test

public void insertUserTest(){

     // 1.加载spring配置文件,创建spring容器

     ApplicationContext context =

             new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");

    

     // 2.从容器中,获取用户dao对象

     UserDao userDao = (UserDao) context.getBean("userDao");

    

     // 创建用户对象

     User user = new User();

     user.setUsername("李云龙");

     user.setBirthday(new Date());

     user.setSex("1");

     user.setAddress("独立团");

    

     userDao.insertUser(user);

}

 

 

    1. mapper代理开发方法
      1. 需求
  1. 新增一个用户

 

      1. 需求实现
        1. 创建mapper接口以及mapper映射文件
        2. 准备测试

说明:整合包提供了一个MapperFactoryBean类,用于配置mapper代理对象。

<!-- 配置用户mapper代理对象 -->

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

     <!-- 注入sqlSessionFactory对象 -->

     <property name="sqlSessionFactory" ref="sqlSessionFactory"/>

    

     <!-- 注入被代理接口 根据接口生成代理对象 -->

     <property name="mapperInterface" value="cn.bdqn.ssm.mapper.UserMapper"/>

</bean>

 

 

 

 

 

测试新增用户:

/**

 * 测试新增用户

 */

@Test

public void insertUserTest(){

    

     // 1.加载spring配置文件,创建spring容器

     ApplicationContext context =

             new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");

    

     // 2.从容器中获取mapper代理对象

     UserMapper mapper = (UserMapper) context.getBean("userMapper");

    

     // 创建用户对象

     User user = new User();

     user.setUsername("楚云飞");

     user.setBirthday(new Date());

     user.setSex("1");

     user.setAddress("国军");

    

     mapper.insertSelective(user);

}

 

 

        1. mapper代理对象配置方式二【重点】

<!-- mapper代理对象配置方式二【重点】 -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

     <!-- 注入要扫描的包,说明:

         1.如果有多个包,在同一个父包下,配置父包即可

         2.不在同一个父包,以半角逗号进行分割:,(cn.bdqn.ssm.mapper,cn.bdqn.ssm.mapper)

         3.在企业项目中,推荐使用包扫描方式(mapper扫描器)

      -->

     <property name="basePackage" value="cn.bdqn.ssm.mapper"/>

</bean>

 

https://blog.csdn.net/linshaolun0701/article/details/82992621

相关信息

评论