试试整合一下“MySpring”?
哈哈我是灵魂画手(我就这个图都能画半个小时😅)
Spring + Mybatis
学习了框架Spring和Mybatis 那我们需要把他们两个合并起来一起用 因为在Spring中的对象交予Spring容器管理 Mybatis原版的用法就无法与Spring契合 但是官方提供了一种无缝契合到Spring中的方法
首先导入包: 注意 包是有要求的 不同版本需要使用的包也不同 但是用法是一样的
MyBatis-Spring | MyBatis | Spring Framework | Spring Batch | Java |
---|---|---|---|---|
2.0 | 3.5+ | 5.0+ | 4.0+ | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
整合两个框架的方式有两种,但是第二种只是第一种的简化版 实现原理和过程还是第一种
所以第一种要掌握透彻
导包:
<dependencies>
<!-- Spring + Mybatis整合的依赖包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- Mybatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- SpringJDBC包 spring框架连接数据库用到 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.17</version>
</dependency>
<!-- lombok包 工具包 主要是使用到创建实体类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!-- mysql和java的连接包 jdbc -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
规则:
<build>
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
方式一:
首先编写相应的实体类和接口
实体类:User
package cn.mianju.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class User {
private String name;
private int age;
}
接口:UserMapper
package cn.mianju.mapper;
import cn.mianju.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> getUsers();
}
然后在编写 Mybatis 的配置和方法
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="cn.mianju.mapper.UserMapper">
<select id="getUsers" resultType="cn.mianju.pojo.User">
select * from user;
</select>
</mapper>
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">
<!-- 大部分配置都在Spring的applicationContext.xml中配置 所以这里这需要注册mapper就好 -->
<configuration>
<mappers>
<mapper resource="cn/mianju/mapper/UserMapper.xml"/>
</mappers>
</configuration>
配置Spring 配置文件
相比于普通的mybatis 这里多一个接口的实现类 UserMapperImpl
UserMapperImpl:
package cn.mianju.mapper;
import cn.mianju.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class UserMapperImpl implements UserMapper{
SqlSessionTemplate sqlSession;
//声明set方法后使用set注入
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
//方法的运行就在这里 Spring需要调用实现类的对象就是这个
@Override
public List<User> getUsers() {
//而这里调用的则是Mybatis中xml配置实现的方法
return sqlSession.getMapper(UserMapper.class).getUsers();
}
}
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 数据源配置 这就是原本在mybatis-config.xml中配置的-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.117.128:3306/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- mybatis的sqlSeesion工厂类注册-->
<bean id="sqlSeesionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 将工厂类传入 用构造器注入方式-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSeesionFactory"/>
</bean>
<!-- 实现类 一定要把 SqlSessionTemplate 给注入进去 我第一次就忘记了 😅-->
<bean id="userMapper" class="cn.mianju.mapper.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
</beans>
测试
MyTest:
import cn.mianju.mapper.UserMapper;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
System.out.println(userMapper.getUsers());
}
}
解析:
-
首先正常new出一个 context 来get他的bean
-
get的bean是实现类 但是类型是接口的 applicationContext.xml 中的配置如下
-
<!-- 实现类 一定要把 SqlSessionTemplate 给注入进去 我第一次就忘记了 😅--> <bean id="userMapper" class="cn.mianju.mapper.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
-
-
然后获得到 这个接口实现类的对象后 调用这个实现类的方法
-
//方法的运行就在这里 Spring需要调用实现类的对象就是这个 @Override public List<User> getUsers() { //而这里调用的则是Mybatis中xml配置实现的方法 return sqlSession.getMapper(UserMapper.class).getUsers(); }
-
-
而这个实现类中的
sqlSession.getMapper(UserMapper.class).getUsers();
的方法调用的是Mybatis的xml的实现-
<mapper namespace="cn.mianju.mapper.UserMapper"> <select id="getUsers" resultType="cn.mianju.pojo.User"> select * from user; </select> </mapper>
-
方式二:
方式一的底层和实现原理和方式一 是一样的 只是在方式一的基础上简化了不少
使用非常简单 首先我们来看官网的介绍 就两块代码
实现类和接口
首先 实现类和接口 必须要有
接口 UserMapper2
package cn.mianju.mapper2;
import cn.mianju.pojo.User;
import java.util.List;
public interface UserMapper2 {
List<User> getUsers();
}
实现类 UserMapper2Impl
package cn.mianju.mapper2;
import cn.mianju.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapper2Impl extends SqlSessionDaoSupport implements UserMapper2 {
@Override
public List<User> getUsers() {
return getSqlSession().getMapper(UserMapper2.class).getUsers();
}
}
注意 现在这里不再需要创建 SqlSessionTemplate 这个对象了,只需要继承 SqlSessionDaoSupport 这个类
就能调用这个类中的 getSqlSession 方法
Mybatis的相关配置
UserMapper2.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">
<!-- Dao(mapper)的实现 namespace是接口的位置 resultType是返回类型 -->
<mapper namespace="cn.mianju.mapper2.UserMapper2">
<select id="getUsers" resultType="cn.mianju.pojo.User">
select * from user;
</select>
</mapper>
这一块和上面是一样的
然后就是在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>
<mappers>
<mapper resource="cn/mianju/mapper/UserMapper.xml"/>
<mapper resource="cn/mianju/mapper2/UserMapper2.xml"/>
</mappers>
</configuration>
Spring的相关配置
还有 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 数据源配置-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.117.100:3306/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- mybatis的sqlSeesion工厂类注册-->
<bean id="sqlSeesionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 注册这个实现类 并且将sqlSessionFactory这个类给他注入进去-->
<bean id="userMapper2" class="cn.mianju.mapper2.UserMapper2Impl">
<property name="sqlSessionFactory" ref="sqlSeesionFactory"/>
</bean>
</beans>
相比于方式一 在这里不需要再定义sqlSession的bean 就只需要将sqlSessionFactory这个工厂类给他赋值就可以
测试类
MyTest:
import cn.mianju.mapper.UserMapper;
import cn.mianju.mapper2.UserMapper2;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper2 userMapper = context.getBean("userMapper2", UserMapper2.class);
System.out.println(userMapper.getUsers());
}
}
和之前的一样
总结
要将Spring和Mybatis整合起来
- 首先要导入对应的包 根据版本号导包
- 整合方式有两种
- 方式一会更全面更详细
- 方式二会更简便 但是实现的过程也是方式一
- 方式一需要掌握熟练