Loading... # Sping整合Mybatis ## **目标** 1. **理解Spring整合Mybatis流程和原理** 2. **熟练掌握Spring整合Mybatis** [**官网**](http://mybatis.org/spring/zh/index.html)  ## **一、导入相关依赖** **junit** ``` <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> ``` **mybatis** ``` <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> ``` **mysql-connector-java** ``` <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> ``` **spring相关** ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.10.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.10.RELEASE</version> </dependency> ``` **aspectJ AOP 织入器** ``` <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> ``` **mybatis-spring整合包 【重点】** ``` <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.2</version> </dependency> ``` **配置Maven静态资源过滤问题!** ``` <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> ``` ## **二、编写配置文件** ### **1. 创建User实体类** ``` @Data public class User { private int id; private String name; private String phone; } ``` ### **2. 创建UserMapp接口** ``` public interface UserMapper { List<User> selectUser(); } ``` ### **3. 创建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="com.shida.dao.UserMapper"> <select id="selectUser" resultType="User"> select * from user </select> </mapper> ``` ### **4. 回忆Mybatis** **实现mybatis-config.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> <package name="com.shida.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_01?useSSL=false&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <package name="com.shida.dao"/> </mappers> </configuration> ``` **测试** ``` package com.shida; import com.shida.dao.UserMapper; import com.shida.entity.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * Description: * * @author jiaoqianjin * Date: 2021/3/15 22:39 **/ public class UserTest { @Test public void selectUser() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.selectUser(); for (User user: userList){ System.out.println(user); } sqlSession.close(); } } ``` **回忆结束** ### **5. 引入Spring配置文件beans.xml** **1、引入Spring配置文件beans.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> ``` **2、配置数据源替换mybaits的数据源** ``` <!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_01?useSSL=false&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> ``` **3、配置SqlSessionFactory,关联MyBatis** **在 MyBatis-Spring 中,可使用SqlSessionFactoryBean来创建 SqlSessionFactory。要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中:** **注意:SqlSessionFactory需要一个 DataSource(数据源)。这可以是任意的 DataSource,只需要和配置其它 Spring 数据库连接一样配置它就可以了。** **在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建。** ``` <!--配置SqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--关联Mybatis--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/shida/dao/*.xml"/> </bean> ``` **4、注册sqlSessionTemplate,关联sqlSessionFactory;** **SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。** **模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。** **可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。** ``` <!--注册sqlSessionTemplate , 关联sqlSessionFactory--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--利用构造器注入--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> ``` ### **6、增加Dao接口的实现类** **私有化sqlSessionTemplate** ``` public class UserMapperImpl implements UserMapper { //sqlSession不用我们自己创建了,Spring来管理 private SqlSession sqlSession; public void setSqlSession(SqlSession sqlSession) { this.sqlSession = sqlSession; } public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } } ``` **注册bean实现** ``` <bean id="userMapper" class="com.shida.dao.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean> ``` **最终mybatis-config.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> <package name="com.shida.entity"/> </typeAliases> </configuration> ``` ### **7、测试** ``` public class UserTest { @Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); UserMapper service = (UserMapper) context.getBean("userMapper"); List<User> user = service.selectUser(); System.out.println(JSONUtil.toJsonPrettyStr(user)); } } ``` ## **三、另一种方法**  **改造UserMapperImpl** ``` public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper { // private SqlSessionTemplate sqlSessionTemplate; // // public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { // this.sqlSessionTemplate = sqlSessionTemplate; // } public List<User> selectUser() { UserMapper userMapper = getSqlSession().getMapper(UserMapper.class); return userMapper.selectUser(); } } ``` **修改bean配置** ``` <bean id="userMapper" class="com.shida.dao.UserMapperImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> ``` Last modification:June 3rd, 2021 at 10:47 am © 允许规范转载