Mybatis 是spring框架中用于提交数据的一个持久层框架。
它支持动态SQL、存储过程,以及高级映射(一对一,一对多)。降低SQL与程序代码的耦合。
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
mysql
mysql-connector-java
org.projectlombok
lombok
#配置端口号
server:
port: 8091
#管理数据源
spring:
datasource:
#高版本驱动使用
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
#设定用户名和密码
username: root
password: root
#SpringBoot整合Mybatis
mybatis:
#指定别名包
type-aliases-package: com.jt.pojo
#扫描指定路径下的映射文件
mapper-locations: classpath:/mappers/*.xml
#开启驼峰映射
configuration:
map-underscore-to-camel-case: true
# 一二级缓存默认开始 所以可以简化
#打印mysql日志
logging:
level:
com.jt.mapper: debug
在映射文件中进行动态取值
1.如果是单个参数使用#{} 获取的参数的值
2.如果是对象的参数则使用#{属性} 获取的是属性值
3.如果是使用Map集合时,则使用#{key} 通过key匹配到value的值
resultTupe:自动进行了封装 resultType只能指出字段名称与属性名称一致时才能自动映射
在其中进行封装 执行SQL语句
定义完以上的方法定义UserMapper接口。
使用注解将接口提交给spring容器
在测试类中需要进行依赖注入,调用接口 使用接口中的方法进行操作
在映射文件中进行执行SQL语句,确认上面的路径是否正确,确认后进行操作
测试简单的查询where判断
测试便利查询数组中的对应id数据
因为定义的是数组,所以要使用标签
collection 表示数组的类型 item 定义要遍历的变量 separator 表示用什么分隔数组
测试更改数据
需要使用标签
测试添加数据
使用
insert into ds_form_gd_resource_info_all value (5 ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null ,null,#{sjk},#{bf},#{zjj},#{zcp},#{sjp} )
删除同理就不多写了。
与if else同理
一般都为:一对一 或者 多对一
单表操作使用 resultType
多表关联操作使用 resultMap 就是一个封装的方式
进行一对一需要在pojo类中进行定义需要关联的pojo类
在映射文件中进行编译
id是名字 与上面相对应 代表调用
type 是你要进行查询的类
autoMapping 代表进行关联
多对一中 关联的标签为
collection
对象的类为
ofType
就是将数据进行缓存 再从缓存中进行查询
默认开启,同一个SqlSesion级别共享的缓存,在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库,当然,若第一次和第二次相同的SQL查询之间,执行了DML(INSERT/UPDATE/DELETE),则一级缓存会被清空,第二次查询相同SQL仍然会走数据库
一级缓存在下面情况会被清除
在同一个SqlSession下执行增删改操作时(不必提交),会清除一级缓存
SqlSession提交或关闭时(关闭时会自动提交),会清除一级缓存
对mapper.xml中的某个CRUD标签,设置属性flushCache=true,这样会导致该MappedStatement的一级缓存,二级缓存都失效(一个CRUD标签在mybatis中会被封装成一个MappedStatement)
在全局配置文件中设置
默认开启(官网进行的声明),通过多线程操作同一个业务让同一个SqlSessionFactory创建多个
SqlSession操作数据库。第二次相同业务SqlSessionFactory创建的SqlSession 就会使用上一次创建的SqlSession存放于缓存区的数据
springBoot是默认不使用一级缓存的 需要添加注释 @Transactional 事物注解 就可以开启一级缓存,使用同一个SqlSession
二级缓存有两种方式:不能同时存在
第一种:在映射文件中添加二级缓存的标签
第二种:使用注解的形式添加
package com.jt.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult implements Serializable {
private Integer status; //200业务执行成功 201业务执行失败
private String msg; //服务器的提示信息
private Object data; //封装后台返回值
public static SysResult fail(){
return new SysResult(201,"业务执行失败",null);
}
public static SysResult success(){
return new SysResult(200,"业务执行成功",null);
}
//服务器返回业务数据
public static SysResult success(Object data){
return new SysResult(200,"业务执行成功",data);
}
public static SysResult success(String msg,Object data){
return new SysResult(200,msg,data);
}
}
package com.wx.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.HashMap;
import java.util.Map;
@Data
@Accessors(chain = true)
public class R {
private Integer code; //响应码
private String message; //响应消息
private Map data = new HashMap<>();
public static R ok(){
R r = new R();
r.setCode(200);
r.setMessage("成功");
return r;
}
public static R error(){
R r = new R();
r.setCode(201);
r.setMessage("失败");
return r;
}
public R data(String key, Object value){
this.data.put(key, value);
return this;
}
}
UPDATE zh_randomly SET countt =( CASE WHEN countt IS NULL THEN 1 ELSE countt + 1 END ) WHERE id =?
service层中继续IService并将对象放入
public interface ProductService extends IService {
serviceImpl中进行实现和继承
@Service
public class ProductServiceImpl extends ServiceImpl implements ProductService {
完成上面的继承和实现后,service层也可以进行直接调用mybatis-plus的增删改查API
@Service
public class ProductServiceImpl extends ServiceImpl implements ProductService {
@Override
public Map getAll() {
Product product = baseMapper.selectById(1);
System.out.println("查询 = " + product);
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.le("id","1");
List products = baseMapper.selectList(queryWrapper);
System.out.println("查询list = " + products);
baseMapper.insert();
baseMapper.delete();
baseMapper.update();
Map map = new HashMap<>();
map.put("product",product);
map.put("products",products);
return map;
}
}
在controller中通过注入Service也可直接调用API
@CrossOrigin
@RestController
@RequestMapping("/api/product")
@Api(tags = "商品管理")
public class ProductController {
@Resource
private ProductService productService;
@GetMapping("/list")
public R list(){
List list = productService.list();//得到所有数据
return R.ok().data("productList",list);
}
@ApiOperation("测试IService")
@GetMapping("/l")
public R l(){
List list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
List products = productService.listByIds(list);//多个id得到数据
Map all = productService.getAll();
return R.ok().data("products",products);
}
}