mybatis和spring框架的整合
Mybatis+Sping整合
- mybatis+spring整合
- 整合思路
思路:將mybatis框架的物件,交給spring管理。
- 把SqlSessionFactory物件,交給spring管理
- 把SqlSession物件,交給spring管理
- 在原始的dao開發方法中,將dao實現類物件交給spring管理
- 在mapper代理開發方法中,把mapper代理物件交給spring管理
- 把資料來源物件,交給spring管理
-
- 整合步驟
- 建立專案(mybatis-spring)
- 整合步驟
-
-
- 加入spring和mybatis框架以及整合包
-
mybatis框架包
spring框架包
mybaits-spring整合包
資料庫驅動包
資料庫連線池包(dbcp)
log4j日誌包
junit單元測試包
-
-
- 準備配置檔案
- 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 </typeAliases>
<!-- 配置對映檔案 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers>
</configuration> |
-
-
-
- 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> |
-
-
-
- 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 |
-
-
-
- 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 |
-
-
- 整合好的專案
-
-
- 原始的dao開發方法
- 需求
- 原始的dao開發方法
- 根據使用者id查詢使用者
- 新增一個使用者
-
-
- 需求實現
- 準備使用者pojo
- 需求實現
-
-
-
-
- 準備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> |
-
-
-
- 編寫使用者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);
} |
-
-
-
- 實現使用者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的事務) */
}
} |
-
-
-
- 在applicationContext.xml檔案中,配置使用者dao實現類物件
-
-
<!-- 配置使用者dao實現類物件 --> <bean id="userDao" class="cn.bdqn.ssm.dao.impl.UserDaoImpl"> <!-- 注入sqlSessionFactory物件 --> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> |
-
-
-
- 編寫測試程式碼
-
-
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); } |
-
- mapper代理開發方法
- 需求
- mapper代理開發方法
- 新增一個使用者
-
-
- 需求實現
- 建立mapper介面以及mapper對映檔案
- 準備測試
- 需求實現
-
說明:整合包提供了一個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); } |
-
-
-
- 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> |