美文网首页
Mybatis 在 Springboot 中的应用

Mybatis 在 Springboot 中的应用

作者: G_Scott | 来源:发表于2019-07-01 23:13 被阅读0次

总步骤---简单应用

  1. pom.xml中增加Mybatis依赖引用
  2. application.yml文件进行mybatis配置
  3. Application.java 文件中扫描mapper映射文件
  4. 书写mapper中po映射接口
  • 其他使用
  1. 使用provider将sql动态化
  2. 使用xml进行配置

一. pom.xml 文件中引用Mybatis

  1. 首先是关键的 mybatis-spring-boot-starter 依赖
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
  1. 查看其它相关依赖
    • mysql-connector-java:mysql数据库链接驱动在这里所以要。
    • spring-boot-starter-jdbc: 因为Mybatis是在jdbc上封装的ORM框架所以mvc中的Mybatis需要依赖,但boot中 mybatis-spring-boot-starter 之中包含了 spring-boot-starter-jdbc 所以不需要重复依赖,具体可以看mybatis-spring-boot-starter的内部依赖。
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

二. application.yml文件进行mybatis配置

  1. 资源库配置
spring:
  datasource:
    username: ***
    password: ***
    url: jdbc:mysql://***.***.***.**:3306/yourdb?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
  1. Mybatis 文件相关配置
mybatis:
  # 扫描映射文件
  mapper-locations: classpath:mapping/*Mapper.xml
  # 解析实体类文件包
  type-aliases-package: com.***.**.POJO
  # 数据库表下划线映射为驼峰方式
  configuration:
    mapUnderscoreToCamelCase: true
  1. 开发环境日志打印
logging:
  level:
    com:
      example:
        mapper : debug

三. Application.java 文件中扫描mapper映射文件

  1. 启动类中使用@MapperScan()注解,或者在具体的映射接口类中使用@Mapper注解,推荐使用前者
@SpringBootApplication
@MapperScan("com.***.**.Mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        log.info("start !!!");
    }
}

四. 书写mapper中po映射接口

  1. 使用注解实现接口持久化
@Insert("INSERT INTO t_you_table (ID, FIELD1, FIELD2, FIELD3, FIELD4) VALUES (#{VALUE1}, #{VALUE2}, #{VALUE3}, #{VALUE3}, #{VALUE4})"
int insertOrder(Order order);
  1. 常用注解有@Insert,@Update,@Select,@Results以及@Result
    如通过@Results处理枚举类型的映射或其他引用JavaBean对象
@Select("SELECT * FROM you_table WHERE id = #{id} ")
@Results(
        {@Result(property = "menuType", column = "menu_type", javaType = MenuTypeEnum.class)},
)
Order getOrder(String id);
  1. 注解大括号{}内可以使用字符串数组。
  2. 关于自定义枚举的支持。
    1. mybatis的枚举使用我用的是#{yourEnum.code},优雅的使用可以mybatisPlus通用枚举

注解方式常用

  1. 查询返回自增ID
@Insert("insert into t_user (name, age) values (#{name}, #{age})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
void insertUser(User user);
// 说明 useGeneratedKeys=true 启用生成键 同jdbc中new GeneratedKeyHolder()
// keyProperty: javabean中的属性
// keyColumn:数据库表中列名
  1. 关联查询
    1. 一对一
@Select("SELECT * FROM `user` where id = #{id}")
@Results({
        @Result(property = "address", column = "address_id",
                one = @One(select = "com.kingboy.repository.address.AddressRepository.findAddressById"))
})
User findUserWithAddress(Long id);
// one = @One:一对一注解 他会将findAddressByIdd的结果赋值给User对象中address属性对象。
// @Result中column的值address_id: 是findAddressById方法的入参,也是查询查询sql返回前的列名。
// property = “address”, 表示要将返回的查询结果赋值给user的address属性 
// @One(select = “方法全路径) 表示我们调用的方法
2. 一对多
@Select("select * from your_table where projectID = #{projectID}")
@Results({
        @Result(property = "projectStageList", column = "projectID",id = true,many = @Many(select = "cn.com.suntree.cmp.mapper.CmpProjectStageMapper.getStageListByProjectID"))
})
CmpProject getProjectByProgectID(Long projectID);
// 就是many方mapper的@Result(property = "stageID",column = "stageID")如果不加,第二层的关联id会是null
  1. Provider处理
  • 注解:@SelectProvider @InsertProvider @UpdateProvider @DeleteProvider
@UpdateProvider(type = PrivilegeProvider.class, method = "updateSalesman")
  • Provider注解中提供了两个必填属性 type和method.
    type配置的是一个包含method属性指定方法的类,这个类必须有空的构造函数。 这个方法的值就是要执行的SQL,并且method属性指定的方法返回值必须是String类型。
// 可以使用mybaits中带有的 类和静态函数进行动态拼接字符串
SQL sql = new SQL(){{ 
// 实际逻辑
}}
// 返回必须是String
return sql.toString();
// 参考代码
public class PrivilegeProvider{
    public String updateSalesman(@Param("M") MerchantSalesDTO merchantSalesDTO){
        SQL sql = new SQL(){{
            UPDATE("merchant_sales");

            if (merchantSalesDTO.getSalesName() != null){
                SET("sales_name = #{M.salesName}");
            }
            if (merchantSalesDTO.getUpper() != null){
                SET("upper = #{M.upper}");
            }
            WHERE("sales_id = #{M.salesId}");
        }};
        return sql.toString();
    }
}
// DTO :数据传输对象,如果系统不是很复杂可以直接使用PO(数据持久化对象)
---
// 当然也可以不用mybatis自带的SQL 静态函数,直接自己拼装字符串
// SQL sql = new SQL(); 
StringBuilder sql = new StringBuilder();
sql.append("SELECT * FROM T_YOUT_TABLE ");
sql.append("WHERE id = #{id} ");
if(a==b){
    sql.append("LIMIT 10")
}
return sql.toString();

相关文章

网友评论

      本文标题:Mybatis 在 Springboot 中的应用

      本文链接:https://www.haomeiwen.com/subject/euslfctx.html