SpringBoot-Mybatis

Mybatis

Posted by Haven Tong on 2019-11-07

Spring Boot-Mybatis

1. ORM框架选型

对比项 SPRING DATA JPA MYBATIS
单表操作方式 只需继承,代码量较少,非常方便。而且支持方法名用关键字生成SQL 可以使用代码生成工具,也很方便,但相对JPA单表弱很多。JPA单表操作非常简单
多表关联查询 友好,动态SQL使用不够方便,而且SQL和代码耦合到一起 非常友好,可以有非常直观的动态SQL
自定义SQL SQL写在注解里面,写动态SQL有些费劲 SQL可以写在XML里,独立管理,动态SQL语法也容易书写理解
学习成本 略高 较低,会写SQL就可以

JPA是规范,Hibernate是实现

  • Spring Data JPA 对开发人员更加友好,单表操作非常方便,多表关联也不麻烦
  • mybatis各方面都很优秀,使用范围更广
  • 大型项目建议mybatis

2. 整合MyBatis操作数据库

  • pom.xml
1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
  • mybatis-config.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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>
<!-- 使用Jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 使用列表签替换列别名 -->
<setting name="useColumnLabel" value="true"/>
<!-- 开启驼峰命名转换: Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
  • 同样的内容也可以写在Spring Boot配置文件application.yml中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
username: root
password: Thwf1858
url: jdbc:mysql://localhost:3306/mybatis
driver-class-name: com.mysql.jdbc.Driver
logging:
level:
com.haven.mybatis.mapper: debug
mybatis:
configuration:
map-underscore-to-camel-case: true
use-generated-keys: true
use-column-label: true
  • 注解书写SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.hehe.mapper;
@Mapper
public interface UserMapper {
/**
* 方式1:使用注解编写SQL。
*/
@Select("select * from t_user")
List<User> list();

/**
* 方式2:使用注解指定某个工具类的方法来动态编写SQL.
*/
@SelectProvider(type = UserSqlProvider.class, method = "listByUsername")
List<User> listByUsername(String username);

/**
* 延伸:上述两种方式都可以附加@Results注解来指定结果集的映射关系.
*
* PS:如果符合下划线转驼峰的匹配项可以直接省略不写。
*/
@Results({
@Result(property = "userId", column = "USER_ID"),
@Result(property = "username", column = "USERNAME"),
@Result(property = "password", column = "PASSWORD"),
@Result(property = "mobileNum", column = "PHONE_NUM")
})
@Select("select * from t_user")
List<User> listSample();

/**
* 延伸:无论什么方式,如果涉及多个参数,则必须加上@Param注解,否则无法使用EL表达式获取参数。
*/
@Select("select * from t_user where username like #{username} and password like #{password}")
User get(@Param("username") String username, @Param("password") String password);

@SelectProvider(type = UserSqlProvider.class, method = "getBadUser")
User getBadUser(@Param("username") String username, @Param("password") String password);

}
  • 可以传入参数

    • JavaBean
    • Map
    • 多个参数,需要用@Param注解
  • @Results注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Select("select t_id, t_age, t_name  "
    + "from sys_user "
    + "where t_id = #{id} ")
    @Results(id="userResults", value={
    @Result(property="id", column="t_id"),
    @Result(property="age", column="t_age"),
    @Result(property="name", column="t_name"),
    })
       User selectUserById(@Param("id") String id);

    @Results可以给出一个id,其他方法根据该id可以通过@ResultMap重复使用:

    1
    2
    3
    4
    5
    @Select("select t_id, t_age, t_name  "
    + "from sys_user "
    + "where t_name = #{name} ")
    @ResultMap("userResults")
       User selectUserByName(@Param("name") String name);