首先创建一个maven模块,在该模块下首先分别搭建出Mybatis的基础运行环境(Mybatis程序能够运行起来,配置项都准备好)和Spring的运行环境(Spring的xml配置文件,实体类等)
package com.kevin.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author : kevin ding
* @date : 2022/1/22 22:55
* @description : 数据库Users对应的实体类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private int age;
private String sex;
private String password;
private String address;
}
package com.kevin.dao;
import com.kevin.pojo.User;
import java.util.List;
/**
* @author : kevin ding
* @date : 2022/1/22 22:59
* @description : UserMapper的抽象类
*/
public interface UserMapper {
// 抽象方法 获取所有的user对象
List<User> getAllUsers();
}
<?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.kevin.dao.UserMapper">
<select id="getAllUsers" resultType="user">
select * from users;
</select>
</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>
<!--开启日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--给实体类起别名-->
<typeAliases>
<package name="com.kevin.pojo"/>
</typeAliases>
<!--在和spring绑定时 在spring-mybatis的配置文件中写过 两边不能同时配置,否则会出错-->
<!--设置mybatis的环境,可以配多套环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置数据源连接参数:DataSource-->
<dataSource type="POOLED">
<!--Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'-->
<!--驱动已经过时,需要使用新的驱动com.mysql.cj.jdbc.Driver-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--在mysql8之后,加上时区的设置-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis01?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"/>
<!--设置自己数据库连接的username和password-->
<property name="username" value="root"/>
<property name="password" value="6298"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kevin/dao/UserMapper.xml"/>
</mappers>
</configuration>
package com.kevin.test;
import com.kevin.dao.UserMapper;
import com.kevin.dao.UserMapperImpl;
import com.kevin.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 org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author : kevin ding
* @date : 2022/1/22 23:07
* @description :
*/
public class MybatisTest {
@Test
public void test1() throws IOException {
String resources = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resources);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> allUsers = mapper.getAllUsers();
for (User user : allUsers) {
System.out.println(user);
}
sqlSession.close();
}
}
Mybatis与Spring进行整合,首先需要在pom文件中导入依赖:mybatis-Spring:使用该依赖,可以将mybatis代码无缝整合到Spring中
<!--mybatis和spring整合的maven依赖-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<?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">
</beans>
在 MyBatis-Spring 中,可使用 SqlSessionFactoryBean
来创建 SqlSessionFactory
。 要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
**注意:**sqlSessionFactory中需要关联属性dataSource数据源,用于连接数据库,与Mybatis中对数据源的配置类似:spring中使用DriverManagerDataSource:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis01?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="6298"/>
</bean>
<!--3. 关联Mybatis内容, 可以通过property属性将mybatis配置文件中的所有设置关联到这里-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/kevin/dao/*.xml"/>
spring 配置文件中的sqlSessionFactory的bean中,可以添加mybatis配置文件中对应的配置,如起别名,映射器,开启日志等(代替mybatis配置中的所有内容“,但是重要的一点是:mybatis配置文件和spring配置文件中对mybatis属性的配置二者只能存在一个,否则会报错
创建sqlSessionTemplate的bean时,需要传入sqlSessionFactory,用于构造器注入到template中
<!--4. 注册sqlSessionTemplate,通过构造器注入方式 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--需要注入sqlSessionFactory 且必须通过构造器注入,因为SqlSessionTemplate中没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
package com.kevin.dao;
import com.kevin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
/**
* @author : kevin ding
* @date : 2022/1/22 23:33
* @description : 需要创建一个UserMapper的实现类,重写接口中的抽象方法
*/
public class UserMapperImpl implements UserMapper {
// 关联sqlSession
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<User> getAllUsers() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.getAllUsers();
}
}
<!--5.dao中创建一个UserMapper接口的实现类,重写其中的抽象方法,并将其注册到spring中-->
<bean id="userMapperImpl" class="com.kevin.dao.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
测试:
@Test
public void combinedSpringAndMybatis1(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
UserMapperImpl userMapperImpl = context.getBean("userMapperImpl", UserMapperImpl.class);
List<User> userList = userMapperImpl.getAllUsers();
for (User user : userList) {
System.out.println(user);
}
}
在测试类中,就只需解析spring的配置文件,获取上下文context,直接获取对应的mapper实现类即可,中间步骤sqlSessionFactory,创建sqlSession等方法通过注册到bean中,由spring帮我们完成(在解析配置文件时内部完成,并且已经包含在上下文context中了)
并且可以发现,在将mybatis整合到spring中之后,mybatis的配置文件中的全部内容都可以整合到sqlSessionFactory的bean中,以后就可以完全不需要创建mybatis的配置文件了。
package com.kevin.dao;
import com.kevin.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
/**
* @author : kevin ding
* @date : 2022/1/22 23:44
* @description :
*/
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> getAllUsers() {
return getSqlSession().getMapper(UserMapper.class).getAllUsers();
}
}
SqlSessionDaoSupport
需要通过属性设置一个 sqlSessionFactory
或 SqlSessionTemplate
。 bean中属性注入:sqlSessionFactory
<!--使用第二种整合方法,需要在bean中注入sqlSessionFactory属性-->
<bean id="userMapperImpl2" class="com.kevin.dao.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
@Test
public void combinedSpringAndMybatis2(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-mybatis.xml");
UserMapperImpl2 userMapperImpl = context.getBean("userMapperImpl2", UserMapperImpl2.class);
List<User> userList = userMapperImpl.getAllUsers();
for (User user : userList) {
System.out.println(user);
}
}
整个spring整合mybatis的过程步骤:
整个环境搭建第一步为先导入所需的所有Maven依赖
创建实体类,Mapper接口,Mapper.xml
创建spring的配置文件
注册dataSources的bean,连接数据源配置
注册sqlSessionFactory的bean,并将dataSource属性注入
关联Mybatis内容, 可以通过property属性将mybatis配置文件中的所有设置关联到sqlSessionFactory的bean中
注册sqlSessionTemplate的bean,注入属性sqlSessionFactory
编写mapper接口的实现类,关联私有化的sqlSessionTemplate,用于获取mapper并对数据库进行操作。
将编写的实现类,注册到spring的配置文件中
测试类完成测试。