一、搭建环境
spring和mybatis不同的厂家. 如果要进行整合需要有一个整合包 spring-mybatis的整合包.
整合包中就给了的工厂对象SqlSessionFactoryBean .
实现的步骤:
1.导入jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima.day25_spring_mybatis</groupId>
<artifactId>day25_spring_mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--配置包括spring很多依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!--配置JdbcTemplate-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!--spring的AOP的扩展-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--mybatis核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--Spring和MyBatis的整合包,要进行整合,就要这个包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>
</project>
2.引入配置文件
-
db.properties (复制修改)
-
log4j.properties (复制)
-
SqlMapConfig.xml (我们要改动 空文件)
-
xxxMapper.xml (我要改动)
-
applicationContext.xml (我们要改动)
applicationContext.xml 中的配置
<?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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1.spring加载外部数据源-->
<context:property-placeholder location="classpath:db.properties"/>
<!--2.配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--需要注入连接池对象-->
<property name="dataSource" ref="dataSource"/>
<!--加载SqlMapConfig.xml-->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<!--配置别名-->
<property name="typeAliasesPackage" value="com.itheima.pojo"/>
<!--配置加载映射文件-->
<property name="mapperLocations" value="classpath:User.xml"/>
</bean>
<!--扫描所有类,创建对象-->
<context:component-scan base-package="com.itheima"/>
<!--
配置事务
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置增强-->
<tx:advice id="txAdivce" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
<aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
</aop:config>
<!--
如果使用远程的dao
-->
<!--
如果使用Mapper动态代理如何做
-->
</beans>
3.创建包结构
com.itheima.dao
com.itheima.pojo
4.数据库的创建
CREATE TABLE USER (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) NOT NULL COMMENT '用户名称',
birthday DATE DEFAULT NULL COMMENT '生日',
sex CHAR(1) DEFAULT NULL COMMENT '性别',
address VARCHAR(256) DEFAULT NULL COMMENT '地址'
);
INSERT INTO `user` VALUES (NULL, '王五', '2015-05-10', '2', NULL);
INSERT INTO `user` VALUES (NULL, '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES (NULL, '张小明', '2018-11-11', '1', '郑州');
INSERT INTO `user` VALUES (NULL, '陈小明', '2019-07-20', '1', '广州');
INSERT INTO `user` VALUES (NULL, '张三丰', '2011-04-11', '1', '西安');
INSERT INTO `user` VALUES (NULL, '陈小明', '2019-09-10', '2', '杭州');
INSERT INTO `user` VALUES (NULL, '王五', '2014-07-07', NULL, NULL);
二、使用原始的dao进行整合
需求:
1.根据id查询用户信息
2.根据name模糊查询用户信息
3.添加用户信息
编写了UserDao
package com.itheima.dao;
import com.itheima.pojo.User;
import java.util.List;
public interface UserDao {
//根据id查询User
public User findUserById(int id);
//根据name模糊查询user
public List<User> queryUserByName(String name);
//添加用户
public void addUser(User user);
}
编写UserDaoImpl实现类
package com.itheima.dao;
import com.itheima.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* SqlSessionFactory
* sqlSession (selectOne selectList insert update delete 方法)
*
* 因为我们需要一个SqlSession会话对象来进行数据的查询和增加.
* spirng提供了一个类 SqlSessionDaoSupport ,继承该类,就可以或货到sqlSession.
*
* 可以在方法中 super.getSqlSession() 获取sqlSession对象 (获取到的该对象不能直接使用)
* 我们需要给SqlSessionDaoSupport设置一个工厂对象.
*
*/
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User findUserById(int id) {
SqlSession sqlSession = super.getSqlSession();
//selectOne("namespace的id值.sql的id值",实际的参数)
User user = sqlSession.selectOne("test.findUserById", id);
return user;
}
public List<User> queryUserByName(String name) {
SqlSession sqlSession = super.getSqlSession();
List<User> list = sqlSession.selectList("test.findUserByName", name);
return list;
}
public void addUser(User user) {
SqlSession sqlSession = super.getSqlSession();
sqlSession.insert("test.addUser",user);
}
}
修改applicationContext.xml配置
<?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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1.spring加载外部数据源-->
<context:property-placeholder location="classpath:db.properties"/>
<!--2.配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--需要注入连接池对象-->
<property name="dataSource" ref="dataSource"/>
<!--加载SqlMapConfig.xml-->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<!--配置别名-->
<property name="typeAliasesPackage" value="com.itheima.pojo"/>
<!--配置加载映射文件-->
<property name="mapperLocations" value="classpath:User.xml"/>
</bean>
<!--扫描所有类,创建对象-->
<context:component-scan base-package="com.itheima.dao"/>
<!--
配置事务
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置增强-->
<tx:advice id="txAdivce" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
<aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
</aop:config>
<!--
如果使用原生的dao
-->
<bean id="userDao" class="com.itheima.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--
如果使用Mapper动态代理如何做
-->
</beans>
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="findUserById" resultType="user">
select * from user where id = #{id}
</select>
<!--根据name模糊查询-->
<select id="findUserByName" resultType="user">
select * from user where username like '%${value}%'
</select>
<!--添加用户-->
<insert id="addUser" >
insert into user values(null,#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>
测试Dao
package com.itheima.dao;
import com.itheima.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
public void findUserByIdTest() {
User user = userDao.findUserById(5);
System.out.println(user);
}
@Test
public void queryUserByNameTest() {
List<User> list = userDao.queryUserByName("张");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void addUserTest() {
User user = new User();
user.setUsername("柳岩");
user.setSex("2");
user.setBirthday(new Date());
user.setAddress("北京");
userDao.addUser(user);
}
}
三、mapper动态代理的方式整合 (重点)
需求:
1.根据id查询用户信息
2.根据name模糊查询用户信息
3.添加用户信息
1)新建一个com.itheima.mapper包 -- 存放的是接口
public interface UserMapper {
//根据id查询User
public User findUserById(int id);
//根据name模糊查询user
public List<User> queryUserByName(String name);
//添加用户
public void addUser(User user);
}
2) resources目录下创建一个和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">
<!--
mapper动态代理四个规则:
1.namespace和接口的完全路径名一致
2.sql的id和接口中方法的名称一致
3.sql中的返回值类型和接口的方法返回值类型一致
4.sql中的参数类型和接口中方法的参数类型一致
-->
<mapper namespace="com.itheima.mapper.UserMapper">
<!--根据id查询-->
<select id="findUserById" resultType="user" parameterType="int">
select * from user where id = #{id}
</select>
<!--根据name模糊查询-->
<select id="queryUserByName" resultType="user" parameterType="string">
select * from user where username like '%${value}%'
</select>
<!--添加用户-->
<insert id="addUser" parameterType="user">
insert into user values(null,#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>
applicationContext2.xml 修改
<?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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--1.spring加载外部数据源-->
<context:property-placeholder location="classpath:db.properties"/>
<!--2.配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--需要注入连接池对象-->
<property name="dataSource" ref="dataSource"/>
<!--加载SqlMapConfig.xml-->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<!--配置别名-->
<property name="typeAliasesPackage" value="com.itheima.pojo"/>
</bean>
<!--扫描所有类,创建对象-->
<context:component-scan base-package="com.itheima.dao"/>
<!--
配置事务
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置增强-->
<tx:advice id="txAdivce" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
<aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
</aop:config>
<!--
如果使用Mapper动态代理如何做
MapperScannerConfigurer 整合包中提供的一个扫描类
需要配置basePackage , spring就会扫描该包
1.加载该包下的映射文件 UserMapper.xml
2.创建给包下的所有接口的代理对象
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.mapper"/>
</bean>
</beans>
测试Dao
package com.itheima.mapper;
import com.itheima.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class UserMapperTest {
@Autowired
private UserMapper mapper;
@Test
public void findUserById() {
User user = mapper.findUserById(8);
System.out.println(user);
}
@Test
public void queryUserByName() {
List<User> list = mapper.queryUserByName("丰");
System.out.println(list);
}
@Test
public void addUser() {
User user = new User();
user.setUsername("柯镇恶");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("桃花岛");
mapper.addUser(user);
}
}