Mybatis整合spring
整合思路
1、SqlSessionFactory對象應該放到spring容器中作為單例存在。
2、傳統dao的開發方式中,應該從spring容器中獲得sqlsession對象。
3、Mapper代理形式中,應該從spring容器中直接獲得mapper的代理對象。
4、數據庫的連接以及數據庫連接池事務管理都交給spring容器來完成。
整合需要的jar包
1、spring的jar包
2、Mybatis的jar包
3、Spring+mybatis的整合包。
4、Mysql的數據庫驅動jar包。
5、數據庫連接池的jar包。
配置文件
SqlMapConfig.xml
配置文件是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><!-- 2. 指定掃描包,會把包內所有的類都設置別名,別名的名稱就是類名,大小寫不敏感 --><package name="cn.itcast.mybatis.pojo" /></typeAliases></configuration>applicationContext.xml
SqlSessionFactoryBean屬于mybatis-spring這個jar包
如何查看SqlSessionFactoryBean源碼?
對于spring來說,mybatis是另外一個架構,需要整合jar包。
在項目中加入mybatis-spring-1.2.2.jar的源碼,如下圖
效果,如下圖所示,圖標變化,表示源碼加載成功:
整合Mybatis需要的是SqlSessionFactoryBean,位置如下圖:
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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://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.xsdhttp://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><!-- 配置SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 配置mybatis核心配置文件 --><property name="configLocation" value="classpath:SqlMapConfig.xml" /><!-- 配置數據源 --><property name="dataSource" ref="dataSource" /></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=rootlog4j.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的實現方式:
1、原始dao的開發方式
2、使用Mapper代理形式開發方式
a) 直接配置Mapper代理
b) 使用掃描包配置Mapper代理
需求:
1. 實現根據用戶id查詢
2. 實現根據用戶名模糊查詢
3. 添加用戶
創建pojo
public class User {private int id;private String username;// 用戶姓名private String sex;// 性別private Date birthday;// 生日private String address;// 地址get/set。。。 }傳統dao的開發方式
原始的DAO開發接口+實現類來完成。
需要dao實現類需要繼承SqlsessionDaoSupport類
實現Mapper.xml
編寫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"> <mapper namespace="test"><!-- 根據用戶id查詢 --><select id="queryUserById" parameterType="int" resultType="user">select * from user where id = #{id}</select><!-- 根據用戶名模糊查詢用戶 --><select id="queryUserByUsername" parameterType="string"resultType="user">select * from user where username like '%${value}%'</select><!-- 添加用戶 --><insert id="saveUser" parameterType="user"><selectKey keyProperty="id" keyColumn="id" order="AFTER"resultType="int">select last_insert_id()</selectKey>insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address})</insert></mapper>加載Mapper.xml
在SqlMapConfig如下圖進行配置:
實現UserDao接口
public interface UserDao {/*** 根據id查詢用戶* * @param id* @return*/User queryUserById(int id);/*** 根據用戶名模糊查詢用戶列表* * @param username* @return*/List<User> queryUserByUsername(String username);/*** 保存* * @param user*/void saveUser(User user);}實現UserDaoImpl實現類
編寫DAO實現類,實現類必須集成SqlSessionDaoSupport
SqlSessionDaoSupport提供getSqlSession()方法來獲取SqlSession
配置dao
把dao實現類配置到spring容器中,如下圖
測試方法
創建測試方法,可以直接創建測試Junit用例。
如下圖所示進行創建。
編寫測試方法如下:
public class UserDaoTest {
private ApplicationContext context;
}
Mapper代理形式開發dao
編寫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"> <mapper namespace="cn.itcast.mybatis.mapper.UserMapper"><!-- 根據用戶id查詢 --><select id="queryUserById" parameterType="int" resultType="user">select * from user where id = #{id}</select><!-- 根據用戶名模糊查詢用戶 --><select id="queryUserByUsername" parameterType="string"resultType="user">select * from user where username like '%${value}%'</select><!-- 添加用戶 --><insert id="saveUser" parameterType="user"><selectKey keyProperty="id" keyColumn="id" order="AFTER"resultType="int">select last_insert_id()</selectKey>insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})</insert> </mapper>實現UserMapper接口
public interface UserMapper {/*** 根據用戶id查詢* * @param id* @return*/User queryUserById(int id);/*** 根據用戶名模糊查詢用戶* * @param username* @return*/List<User> queryUserByUsername(String username);/*** 添加用戶* * @param user*/void saveUser(User user); }方式一:配置mapper代理
在applicationContext.xml添加配置
MapperFactoryBean也是屬于mybatis-spring整合包
測試方法
public class UserMapperTest {private ApplicationContext context;@Beforepublic void setUp() throws Exception {this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");}@Testpublic void testQueryUserById() {// 獲取MapperUserMapper userMapper = this.context.getBean(UserMapper.class);User user = userMapper.queryUserById(1);System.out.println(user);}@Testpublic void testQueryUserByUsername() {// 獲取MapperUserMapper userMapper = this.context.getBean(UserMapper.class);List<User> list = userMapper.queryUserByUsername("張");for (User user : list) {System.out.println(user);}}@Testpublic void testSaveUser() {// 獲取MapperUserMapper userMapper = this.context.getBean(UserMapper.class);User user = new User();user.setUsername("曹操");user.setSex("1");user.setBirthday(new Date());user.setAddress("三國");userMapper.saveUser(user);System.out.println(user);} }方式二:掃描包形式配置mapper
<!-- Mapper代理的方式開發方式二,掃描包方式配置代理 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 配置Mapper接口 --><property name="basePackage" value="cn.itcast.mybatis.mapper" /> </bean>每個mapper代理對象的id就是類名,首字母小寫
練習代碼保存
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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://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.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"><!-- 加載配置文件 --><context:property-placeholder location="classpath:db.properties" /><context:component-scan base-package="com.itcast.dao"></context:component-scan><!-- 數據庫連接池 --><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><!-- 配置SqlSessionFactory --><bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 配置mybatis核心配置文件 --><property name="configLocation" value="classpath:SqlMapConfig.xml" /><!-- 依賴注入 -配置數據源 --><property name="dataSource" ref="dataSource" /></bean><!-- 原始DAO開發 配置UserDaoImpl --><bean name="userDao" class="com.itcast.dao.UserDaoImpl"><!-- 配置sqlSessionFactory --><property name="sqlSessionFactory" ref="sqlSessionFactory"></property></bean><!-- mybatis中mapper動態代理 --><!-- <bean name="mapperFactoryBean" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="sqlSessionFactory" ref="sqlSessionFactory"></property><property name="mapperInterface" value="com.itcast.mapper.mapper" /></bean> --><!-- 增強版mapper動態代理 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 此時不需要寫得到sqlSessionFactory,因為sqlsessionfactory配置在spring容器當中它自動會去找 --><property name="basePackage" value="com.itcast.mapper"></property></bean> </beans>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><!-- 2. 指定掃描包,會把包內所有的類都設置別名,別名的名稱就是類名,大小寫不敏感 --><package name="com.itcast.dao" /></typeAliases><mappers><mapper resource="UserMapper.xml"/><!-- 當DAO用傳統的DAO開發的時候不能用其他的方式導入mapper.xml文件只能用package --><package name="com.itcast.mapper"/></mappers> </configuration>mapper.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"><mapper namespace="com.itcast.mapper.mapper"><!-- 通過ID查詢一個用戶 --><select id="queryUserById" parameterType="Integer" resultType="com.itcast.pojo.User"><!-- <include refid="selector"></include> -->select * from user where id = #{id}</select> </mapper>mapper.java
package com.itcast.mapper1;import com.itcast.pojo1.User;public interface mapper {public User queryUserById(Integer id); }原始DAO開發方式代碼
UserDao.java
package com.itcast.dao;import com.itcast.pojo1.User;public interface UserDao {public User queryUserById(Integer id);public Integer countUser(); }UserDaoImpl.java
package com.itcast.dao;import org.apache.ibatis.session.SqlSession; import org.mybatis.spring.support.SqlSessionDaoSupport;import com.itcast.pojo1.User;public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {@Overridepublic User queryUserById(Integer id) {SqlSession session = super.getSqlSession();User user = session.selectOne("queryUserById", id);return user;}@Overridepublic Integer countUser() {SqlSession session = super.getSqlSession();Integer s = session.selectOne("countUser");return s;} }測試類
package com.itcast.test;import javax.annotation.Resource;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import com.itcast.dao.UserDao; import com.itcast.mapper1.mapper; import com.itcast.pojo1.User; /*@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml")*/ public class TestUserDaoDemo1 {@Resource(name="userDao")public UserDao userDao;private ApplicationContext context;/*傳統DAO開發方式*/@Testpublic void testDemo() {this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");UserDao userDao = (UserDao) context.getBean("userDao");User user = userDao.queryUserById(1);System.out.println(user);}/*mapper動態代理,不需要寫實現類只需要寫接口即可*/@Testpublic void testDemo1() {this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");UserDao userDao = (UserDao) context.getBean("userDao");Integer s = userDao.countUser();System.out.println(s);}/*mapper動態代理增強版,解決了上述方式中多個mapper文件都需要手動導入*/@Testpublic void testDemo2() {this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");/*有兩種方式可以加載mapper 通過文件名字或者是mapper.class*/mapper bean = (mapper) context.getBean("mapper");User user = bean.queryUserById(1);System.out.println(user);} }總結
以上是生活随笔為你收集整理的Mybatis整合spring的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种分类器小结
- 下一篇: redis主从搭建和分片集群搭建