转载

spring boot 基础系列——mybatis

之前一直用jpa,正好要看mybatis源码,先学习下怎么用。

Mybatis 初期使用比较麻烦,需要各种配置文件、实体类、Dao 层映射关联、还有一大推其它配置。当然 Mybatis 也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和 Dao 层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理 Dao 层和配置文件等。

1. 引入

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
    <type>pom</type>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.9-rc</version>
    <type>pom</type>
</dependency>
复制代码

2. 配置

Spring Boot 会自动加载 spring.datasource.* 相关配置,数据源就会自动注入到 sqlSessionFactory 中,sqlSessionFactory 会自动注入到 Mapper 中

######################################## jdbc_config ########################################
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/my_test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root

######################################## Hikari数据源 ########################################
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 最小空闲连接数量
spring.datasource.hikari.minimum-idle=5
# 最大连接数 默认10
spring.datasource.hikari.maximum-pool-size=15
# 自动提交
spring.datasource.hikari.auto-commit=true
# 空闲连接存活最大时间 默认600000ms
spring.datasource.hikari.idle-timeout=30000
# 连接池母子
spring.datasource.hikari.pool-name=DatebookHikariCP
# 连接池中连接的最长声明周期 0为永久 默认1800000ms
spring.datasource.hikari.max-lifetime=1800000
# 连接超时时间 默认30000ms
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

######################################## mybatis配置 ########################################
# xml路径, 可以在入口文件处使用注解@MapperScan
# @MapperScan("com.example.demo.mapper")
mybatis.mapper-locations=classpath:**/mapper/*.xml
# model路径
mybatis.type-aliases-package=com.example.demo.model
复制代码

3. 通过下面一个简单的例子看下mybatis怎么用

3.1 entity 存放数据实体(习惯了jpa的写法)

@Data
public class User {
    private Integer Id;
    private String userName;
    private String password;
    private String phone;
}
复制代码

3.3 mapper 存放sql语句

mapper是存放sql的地方,可以使用注解,也可以用xml,下面介绍几种常用注解:

  • @Select 是查询类的注解,所有的查询均使用这个
  • @Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。
  • @Insert 插入数据库使用,直接传入实体类会自动解析属性到对应的值
  • @Update 修改数据,也可以直接传入对象
  • @Delete 删除数据
  • 更多注解

3.3.1 使用注解形式

@Mapper
public interface UserMapper {
    @Insert("insert into t_user (id, user_name, password, phone) values (#{id}, #{userName}, #{password}, #{phone})")
    void insert(User user);

    @Select("select * from t_user")
    @Results({
        @Result(property = "userName", column = "user_name")
    })
    List<User> users();
}
复制代码

3.3.2 使用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.demo.dao.UserDao" >

    <sql id="BASE_TABLE">
        t_user
    </sql>

    <sql id="BASE_COLUMN">
        userId,userName,password,phone
    </sql>

    <insert id="insert" parameterType="com.example.demo.model.User">
        INSERT INTO
        <include refid="BASE_TABLE"/>
        <trim prefix="(" suffix=")" suffixOverrides=",">
            userName,password,
            <if test="phone != null">
                phone,
            </if>
        </trim>
        <trim prefix="VALUES(" suffix=")" suffixOverrides=",">
            #{userName, jdbcType=VARCHAR},#{password, jdbcType=VARCHAR},
            <if test="phone != null">
                #{phone, jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

    <select id="users" resultType="com.example.demo.model.User">
        SELECT
        <include refid="BASE_COLUMN"/>
        FROM
        <include refid="BASE_TABLE"/>
    </select>
</mapper>
复制代码

3.4 test

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
    @Autowired
    UserMapper userMapper;

    @Test
    public void testInsert() {
        User user1 = new User();
        user1.setId(1);
        user1.setUserName("daye1");
        user1.setPassword("mima1");
        user1.setPhone("123");
        User user2 = new User();
        user2.setUserName("daye2");
        user2.setPassword("mima2");
        user2.setPhone("456");
        userMapper.insert(user1);
        userMapper.insert(user2);
    }

    @Test
    public void testUsers() {
        System.out.println(userMapper.users());
    }
}
复制代码

3.5 jpa和mybatis目录对比

jpa mybatis
entity model
repository mapper
service service
原文  https://juejin.im/post/5ea1718ce51d4546b4352b93
正文到此结束
Loading...