Springboot系列-整合Mybatis
前言:上篇博客主要介绍了springboot整合JdbcTemplate,也提到了相对于mybatis将JdbcTemplate的优势所在,在操作上JdbcTemplate虽然简单,但是在方便以及使用层次上却不如Mybatis,这也是Mybatis如此受青睐的原因,而且在springboot中,mybatis的配置上也做了进一步的简化,基本可以做到开箱即用
接下来通过springboot对于Mybatis框架的整合,分别对mybatis的配置以及使用方法上进行实战分析
1.工程创建
首先创建工程,选择 Web、SQL下的Mybatis Framework ,如下图:
创建完成之后,在pom.xml文件中添加Druid等依赖,具体如下:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
以上 xxx-spring-boot-starter 模式,表示该 starter 是由第三方提供的,MyBatis 和 Druid 依赖的命名和其他库的命名不太一样;
MyBatis 的使用和 JdbcTemplate 基本一致在application.properties配置文件配置数据源
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/template?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
2.mybatis基本使用
1.以上配置完成之后我们来通过实际操作介绍Mybatis的用法,首先创建一个User实体类如下:
public class User {
private Integer id;
private String username;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2.然后在mapper层创建一个UserMapper,如下:
@Mapper
public interface UserMapper {
//查询user表所有信息
@Select("select * from user")
List<User> getAllUser();
//使用@Results注解来映射查询结果集到实体类属性,一般用于数据库字段名与实体类对应的属性名不一致时
@Results({
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "address",property = "address")
})
@Select("select id,username,address from user where id = #{id}")
User getUserById(Integer id);
@Select("select * from user where username like contact('%',#{username},'%')")
List<User> getUserByName(String username);
@Insert("insert into user (username,address) value (#{username},#{address})")
//通过@SelectKey注解可以查询上一条数据自动生成的主键
@SelectKey(statement = "select last_insert_id()",keyProperty = "id",before = false,resultType = Integer.class)
Integer addUser(User user);
@Update("update user set username = #{username},address = #{address} where id = #{id}")
Integer updateUserById(User user);
@Delete("delete from user where id = #{id}")
Integer deleteUserById(Integer id);
}
以上对于数据的增删改查都是通过注解SQL的方式来操作的,注意这里的 @SelectKey 注解可以实现主键回填的功能,即当数据插入成功后,插入成功的数据 id 会赋值到 user 对象的id 属性上
3.UserMapper创建完成之后,还有一个最关键的地方就是需要配置Mapper扫描,此配置有两种方式,一种是如上面在UserMapper上加@Mapper注解,另一种方式就是直接在启动类添加Mapper扫描,如下:
@SpringBootApplication
@MapperScan(basePackages = "com.example.mybatis.mapper")
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
到此基本的mybatis配置使用就完成了,同志们可以自行建一个controller进行增删改查的测试
3.Mapper映射
上面说到,除了使用注解的方式操作SQL之外,还可以通过XML的方式尤其是在SQL逻辑比较复杂的时候,绝大多数开发者都倾向于 XML 方式开发
1.首先还是创建个UsersMapper,通过注解方式扫描
@Mapper
public interface UsersMapper {
List<User> getUserAll();
Integer updateUserById(User user);
Integer addUser(User user);
Integer deleteUserById(Integer id);
}
2.然后创建 UsersMapper.xml 文件,和注解方式的原理一样,将接口中方法对应的 SQL 直接写在 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.example.mybatis.mapper">
<select id="getAllUser" resultType="com.example.mybatis.entity.User">
select * from t_user;
</select>
<insert id="addUser" parameterType="ocom.example.mybatis.entity.User">
insert into user (username,address) values (#{username},#{address});
</insert>
<update id="updateUserById" parameterType="com.example.mybatis.entity.User">
update user set username=#{username},address=#{address} where id=#{id}
</update>
<delete id="deleteUserById">
delete from user where id=#{id}
</delete>
</mapper>
3.那么刚刚新建 .xml 文件放在哪呢?有两个位置可以放,第一种是直接放在 UsesrMapper 所在的包下面,也就是和UsersMapper同级,放到该位置会被自动扫描到,但是缺点是xml 资源在项目打包时会被忽略掉;所以,如果 UsersMapper.xml 放在包下,需要在 pom.xml 文件中再添加如下配置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
第二种方式就是放在resource目录下,此位置打包时不会被忽略,但必须在resources 目录下创建和 Mapper 接口包目录相同的目录层级,这样才能确保打包后 XML 和 Mapper 接口处于一起,否则 XML 文件将不能被自动扫描,所以此时也可以在application.properties里添加配置类实现扫描如下:
//自定义指定mybatis的扫描路径
mybatis.mapper-locations=classpath:mapper/*.xml
4.mybatis多数据源
1.mybatis多数据源配置和上篇博客将的JdbcTemplate基本一致,首先在application.properties下配置数据库信息,如下:
spring.datasource.one.url=jdbc:mysql://127.0.0.1:3306/template?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.one.username=root
spring.datasource.one.password=123456
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://127.0.0.1:3306/template1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.two.username=root
spring.datasource.two.password=123456
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
2.配置完成之后,提供两个DataSource进行配置,如下:
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.one")
DataSource dsOne(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
DataSource dsTwo(){
return DruidDataSourceBuilder.create().build();
}
}
3.接下来是mybatis的配置,mybatis的配置要提供两个Bean,因此两个数据源将在两个类分开配置,第一个数据源配置如下:
@Configuration
@MapperScan(basePackages = "com.example.mybatis.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MybatisConfigOne {
@Resource(name = "dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactory1(){
SqlSessionFactory sessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsOne);
sessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate(){
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
以上首先MybatisConfigOne是一个配置类,里面配置了扫描mapper1包的路径,即该包下的 Mapper 接口将操作 dsOne 中的数据,对应的 SqlSessionFactory 和 SqlSessionTemplate 分别是 sqlSessionFactory1 和 sqlSessionTemplate1,在 MyBatisConfigOne 内部,分别提供 SqlSessionFactory 和 SqlSessionTemplate 即可, SqlSessionFactory 根据 dsOne 创建,然后再根据创建好的SqlSessionFactory 创建一个 SqlSessionTemplate
4.第一个数据源配置完成后,同理,再来配置第二个数据源如下:
@Configuration
@MapperScan(basePackages = "com.example.mybatis.mapper2",sqlSessionFactoryRef = "sqlSessionFactory2",sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MybatisConfigTwo {
@Resource(name = "dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactory2() {
SqlSessionFactory sessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsTwo);
sessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() {
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
到此mybatis多数据源配置就完成了,然后只需要在刚才指定的路径提供不同的mapper包即可,Service 中注入不同的 Mapper 就可以操作不同的数据源,接着我们来简单的创建多数据源配置下的mapper
5.在com.example.mybatis.mapper1下的mapper如下:
@Mapper
public interface UserMapperOne {
List<User> getAllUser();
}
对应mapper1的 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.example.mybatis.mapper1">
<select id="getAllUser" resultType="com.example.mybatis.entity.User">
select * from user;
</select>
</mapper>
6.在com.example.mybatis.mapper2下的mapper如下:
@Mapper
public interface UserMapperTwo {
List<User> getAllUser();
}
对应mapper2的 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.example.mybatis.mapper2">
<select id="getAllUser" resultType="com.example.mybatis.entity.User">
select * from user;
</select>
</mapper>
在此之后,就可以service中注入不同的mapper来操作不同的数据源了,然后最后附上一张此篇博客从头到此我创建的文件目录位置如下:
结语:关于mybatis的配置、使用以及mybatis多数据源的配置就介绍到这了,到此关于JdbcTemplate和mybatis的配置、使用以及多数据源配置已经介绍完,下篇博客将介绍最后一个数据持久化方案 JPA …