Mybatis框架

Mybatis 是spring框架中用于提交数据的一个持久层框架。

它支持动态SQL、存储过程,以及高级映射(一对一,一对多)。降低SQL与程序代码的耦合。

导入Mybatis jar包

   
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.2.0
        

        
        
            mysql
            mysql-connector-java
        
        
        
            org.projectlombok
            lombok
        

进行配置Mybatis的 yml 文件 配置端口号等

#配置端口号
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

设置接口实现类Mapper的xml映射文件  

在映射文件中进行动态取值

1.如果是单个参数使用#{}  获取的参数的值

2.如果是对象的参数则使用#{属性}  获取的是属性值

3.如果是使用Map集合时,则使用#{key} 通过key匹配到value的值

resultTupe:自动进行了封装  resultType只能指出字段名称与属性名称一致时才能自动映射

在其中进行封装  执行SQL语句





 
    

创建pojo类 ,类型名称要与表的名称一致

Mybatis框架_第1张图片

 定义完以上的方法定义UserMapper接口。

使用注解将接口提交给spring容器

Mybatis框架_第2张图片

使用Mybatis进行增删改查

在测试类中需要进行依赖注入,调用接口 使用接口中的方法进行操作

Mybatis框架_第3张图片

 在映射文件中进行执行SQL语句,确认上面的路径是否正确,确认后进行操作

在pojo中的属性名称,映射到xml文件时想要两方对应必须使用 #{} 进行操作。

测试简单的查询where判断

Mybatis框架_第4张图片

 测试便利查询数组中的对应id数据

因为定义的是数组,所以要使用标签进行定义

collection 表示数组的类型    item 定义要遍历的变量     separator 表示用什么分隔数组

Mybatis框架_第5张图片

测试更改数据

需要使用标签  且set也必须使用标签 是为了去除if中多余的逗号。

Mybatis框架_第6张图片

 测试添加数据

使用标签





    
    
        
        
        
    

    


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



Mybatis框架_第7张图片

 删除同理就不多写了。

测试分支结构

与if else同理

Mybatis框架_第8张图片

在增删改查中经常会对多个表进行查询,也就是多表联查

一般都为:一对一  或者 多对一

单表操作使用  resultType

多表关联操作使用   resultMap   就是一个封装的方式

进行一对一需要在pojo类中进行定义需要关联的pojo类

一对一

Mybatis框架_第9张图片

 在映射文件中进行编译

id是名字 与上面相对应 代表调用

type 是你要进行查询的类

autoMapping 代表进行关联

Mybatis框架_第10张图片

 多对一

Mybatis框架_第11张图片

多对一中  关联的标签为

collection

对象的类为 

ofType

Mybatis框架_第12张图片

 Mybatis缓存

 就是将数据进行缓存 再从缓存中进行查询

一级缓存

默认开启,同一个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

二级缓存有两种方式:不能同时存在

第一种:在映射文件中添加二级缓存的标签 

Mybatis框架_第13张图片

第二种:使用注解的形式添加  

 

SysResult

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

R

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 =?

Mybatis-plus中的IService

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

}

WHERE   IF if判断

 

mybatis 遍历for循环

    

你可能感兴趣的:(java,spring,intellij-idea)