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);