整合Mybatis
- 导入依赖
- mysql
<!--spring操作数据库需要一个Spring-jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.8.RELEASE</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency>
- junit
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency>
- mybatis
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency>
- spring
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.8.RELEASE</version> </dependency>
- aop
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency>
- Spring-mybatis
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency>
- 整合
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- Spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!--spring操作数据库需要一个Spring-jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.5</version> </dependency>
- mysql
- 编写配置文件
-
测试
1. 回忆Mybatis
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper.xml
- 测试
2. Mybatis-Spring
首先要说:
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,
它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源,如果创建一个池,用池来管理Connection,这样就可以重复使用Connection。
有了池我们就不用自己来创建Connection,而是通过池来获取Connection对象。
当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
这里我们常用的连接池有两种,分别是:DBCP连接池和C3P0连接池
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper mapper = context.getBean("userMapper", UserMapper.class);
//关于这里为什么用UserMapper接口而不是实现类,因为我们是面向接口编程,用接口来上转型
- 整理思路:
- 首先,相比较原来单独mybatis,使用Spring是为了节省我们新建对象的麻烦,那么为了省去这些麻烦,比如SqlSessionFactory,读取配置文件,创建Sqlssion等,我们需要将他们配置到Spring的配置文件里
-
Spring配置文件首先需要两个东西,第一个是DataSouece,spring操作数据库需要一个Spring-jdbc包,这一步的目的是将原来mybatis核心配置文件里的环境配置挪到这里
<!--DateSource:使用Spring的数据源替换Mybatis的配置 c3p0,dbcp druid 这里使用Spring提供的jDBC --> <bean id="dataSouece" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/> <property name="username" value="root"/> <property name="password" value="zhaosiyu123"/> </bean>
- 第二个东西,是SqlSessionFactory,使用SqlSessionFactoryBean包,这里来绑定上方的数据源以及mybatis的核心配置文件,以及Mapper映射器,也可以在这里绑定
<!--SqlSessionFactory--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSouece"/> <!--绑定Mybatis的配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/zhaox/mapper/*.xml"/> </bean>
- 有了SqlSessionFactory,我们接下来就需要创建SqlSession,SqlSession在Spring里是一个SqlSessionTemplate对象,他没有set方法,所以只能用构造函数注入,参数就是SqlSessionFactory,相当于原来mybatis里sqlSessionFactory.openSession();这一步。
<!--就是我们使用的SqlSessionTemplate--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能使用构造器注入,因为他没有Set方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
- 在原来进行测试的时候,我们还是需要新建mapper类,因此在Spring里我们就需要新建一个专门用来操作mapper的类,也就是mapper实现类。我们通过在实现类里设置一个SqlSessionTemplate属性,并设置set方法,方便我们在bean里注册(初始化时为其赋值)
public class UserMapperImpl implements UserMapper { //我们的所有操作原来都使用SqlSession来来执行,现在都使用SqlSessionTemplate private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
- 万事俱备,只欠东风,准备测试类直接调用方法就可以了
-
简化操作:
- DateSource,SqlSessionFactory(设置,别名优化最好留在Mybatis)
- 使用XXXXTemplate:创建SqlSession(以后会遇到,Redis,Thyme等)
- 将Mybatis的配置和工具类里SqlSessionFactory的一些操作全部丢给Spring,让Spring得到一个整合的SqlSessionTemplate,在这个类里之前的全部动作都被整合
- 创建一个接口实现类,这个类里有之前的SqlSessionTemplate,还需要一个Set方法方便注入,这样可以直接得到SqlSessionTemplate
- 获得Mapper,使用Mapper直接使用方法
- Mybatis与Mybatis-Spring的区别:
- 后者可以将Mybatis 的配置文件完全挪走
- 后者可以完全不需要新建对象,只需要再Spring中配置bean就可以了
- 但是这就需要我们新建一个实现类,因为原来我们调用得到的mapeer是一个接口类型,而Spring是不支持创建一个接口bean的!所以我们需要创建一个实现类,封装mapper的操作,然后再由Spring注册这个实现类,通过实现类来进行方法的调用
3. Mybatis-Spring(使用SqlSessionDaoSupport)
在上面的整合中,我们需要在实现类里注入一个SqlsessionTemplate,这有一些麻烦,这里我们可以让实现类继承一个类SqlSessionDaoSupport。
继承之后我们可以直接使用这个父类的方法得到SqlSession,当然sqlSessionFactory也是需要注入的
<bean id="userMapper2" class="com.zhaox.mapper.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
这样我们就不需要SqlsessionTemplate来获得SqlSession了。
Comments | NOTHING