Spring入门——day5
一 . 回忆 Mybatis
1 . 导入相关 jar包:junit、mybatis、mysql、spring相关、aop织入
mybatis-spring【新知识点】
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.16</version> </dependency> <!--spring操作数据库需要 spring-jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.16</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.2</version> </dependency> </dependencies>
2 . 流程:
1 . 编写实体类 pojo
package com.ma.pojo; import lombok.Data; @Data public class User { private int id; private String name; private String pwd; }
2 . 编写 mybatis 的核心配置文件 (连接数据库和注册mapper)
<?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.ma.pojo"/> </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?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--注册接口--> <mappers> <mapper class="com.ma.dao.UserMapper"/> </mappers> </configuration>
3 . 编写接口
package com.ma.dao; import com.ma.pojo.User; import java.util.List; public interface UserMapper { public List<User> selectUser(); }
4 . 编写接口对应的 Mapper.xml(要执行的查询语句)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ma.dao.UserMapper"> <select id="selectUser" resultType="user"> select * from mybatis.user; </select> </mapper>
5 . 回 核心配置文件 注册接口
<!--注册接口--> <mappers> <mapper class="com.ma.dao.UserMapper"/> </mappers>
5 . 测试
import com.ma.dao.UserMapper; import com.ma.pojo.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; //import org.apache.ibatis.io.Resources; public class Mytest { @Test public void test() throws IOException { //工具类(把 mybatis-utils的代码移到了此处) /*使用mybatis必须使用 SqlSessionFactory 的对象,所以之前是用 * utils包 下的 mybatis-utils 工具类 * 获取实例化 SqlSessionFactory 的对象 来创建 sqlSession * 通过sqlSession.XXX 来使用 SQL语句*/ String resources = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resources); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sessionFactory.openSession(true); //获取接口 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //调用接口中的方法 List<User> users = mapper.selectUser(); for (User user : users) { System.out.println(user); } } }
二 . 整合mybatis(Mybatis-Spring)
需要在Spring的配置文件中定义至少两个东西:SqlSessionFactory 和 至少一个数据映射器
方法一:SqlSessionTemplate
1 . Spring来管理数据源
将mybatis核心配置文件中 连接数据库的代码,写到了spring的配置文件中(applicationContext)

2 . 以前我们是通过工具类或者右侧代码来 new一个sqlSessionFactory ,再通过sqlSessionFactory 来创建 sqlSession,来进行操作

整合的话,就直接用 SqlSessionTemplate 代替 sqlSession,在 bean下注册并使用构造器注入到 sqlSessionFactory中
3 . 把 Spring 整合Mybatis之后会比原来多出一个 接口的 实现类 UserMapperImpl
因为 Spring接管了所有创建和调用对象的操作,无法注册接口只能注册实现类,所以便多了一个接口的实现类
但是mybatis 的对象它无法自动创建,所以只能在实现类中手动写一个 set方法(相当于 Service层的操作)
这个实现类的作用就是通过接口的对象来做原来 mybatis 做的事情
public class UserMapperImpl implements UserMapper { /*原来的所有操作都用sqlSession来执行,现在用 SqlSessionTemplate*/ private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } @Override public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
方法二:SqlSessionDaoSupport
用于提供一个 SqlSession,调用 getSqlSession 方法 会得到一个 SqlSessionTemplate
方法一是需要手动在 接口的实现类中 手动创建 SqlSessionTemplate的对象,然后手动写一个 set方法,
public class UserMapperImpl implements UserMapper { /*原来的所有操作都用sqlSession来执行,现在用 SqlSessionTemplate*/ private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } @Override public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
方法二直接通过 继承 SqlSessionDaoSupport类 就可以代替上面的操作了
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper { @Override public List<User> selectUser() { SqlSession sqlSession = getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); //精简操作:return getSqlSession().getMapper(UserMapper.class).selectUser() } }
同时 spring-dao 中的如下代码也被省略
<!--SqlSessionTemplate:就是 sqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能使用构造器来注入sqlSessionFactory,因为他没有set方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
转为在 bean 中配置如下
<bean id="userMapper2" class="com.ma.dao.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
浙公网安备 33010602011771号