总步骤---简单应用
- pom.xml中增加Mybatis依赖引用
- application.yml文件进行mybatis配置
- Application.java 文件中扫描mapper映射文件
- 书写mapper中po映射接口
- 使用provider将sql动态化
- 使用xml进行配置
一. pom.xml 文件中引用Mybatis
- 首先是关键的 mybatis-spring-boot-starter 依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
- 查看其它相关依赖
- 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配置
- 资源库配置
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
- Mybatis 文件相关配置
mybatis:
# 扫描映射文件
mapper-locations: classpath:mapping/*Mapper.xml
# 解析实体类文件包
type-aliases-package: com.***.**.POJO
# 数据库表下划线映射为驼峰方式
configuration:
mapUnderscoreToCamelCase: true
- 开发环境日志打印
logging:
level:
com:
example:
mapper : debug
三. Application.java 文件中扫描mapper映射文件
- 启动类中使用@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映射接口
- 使用注解实现接口持久化
@Insert("INSERT INTO t_you_table (ID, FIELD1, FIELD2, FIELD3, FIELD4) VALUES (#{VALUE1}, #{VALUE2}, #{VALUE3}, #{VALUE3}, #{VALUE4})"
int insertOrder(Order order);
- 常用注解有@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);
- 注解大括号{}内可以使用字符串数组。
- 关于自定义枚举的支持。
- mybatis的枚举使用我用的是#{yourEnum.code},优雅的使用可以mybatisPlus通用枚举
注解方式常用
- 查询返回自增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:数据库表中列名
- 关联查询
- 一对一
@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
- 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();
- 作者:G_Scott
- 时间:2019.07.01
- 参考:
网友评论