1. 程式人生 > >mybatis和spring框架的整合

mybatis和spring框架的整合

 

 

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>