Springboot系列-整合Mybatis

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 …

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值