Mybatis框架

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

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

导入Mybatis jar包

   <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--小辣椒包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

进行配置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语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace是mybatis映射文件的唯一标识,与接口对应-->
<mapper namespace="com.jt.mapper.EmpMapper"> <!--确认要进行执行的接口-->
    <!--id 表示接口方法 与接口方法一一对应
        resultType 返回值结果类型

        要与接口的方法名 以及返回pojo文件的路径名一致将pojo文件的属性与sql属性想匹配
        根据路径找到标签进行执行sql语句
    -->
</mapper>

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

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

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

使用Mybatis进行增删改查

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

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

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

测试简单的查询where判断

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

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

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

测试更改数据

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

 测试添加数据

使用<insert>标签

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.jt.dao.ZJInfoDao">
    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="com.jt.dao.SjkInfoDao" id="sjkInfoMap">
        <result property="id" column="id"/>
        <result property="gdResourceId" column="gd_resource_id"/>
        
    </resultMap>
<!--    查询-->
    <select id="getZJInfoByResource" resultType="java.util.Map">
        select * from ds_form_gd_resource_info where GD_ID = #{resourceId}
    </select>
<!--添加-->
<insert id="insert">
    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} )
</insert>

</mapper>

 删除同理就不多写了。

测试分支结构

与if else同理

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

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

单表操作使用  resultType

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

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

一对一

 在映射文件中进行编译

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

type 是你要进行查询的类

autoMapping 代表进行关联

 多对一

多对一中  关联的标签为

collection

对象的类为 

ofType

 Mybatis缓存

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

一级缓存

默认开启,同一个SqlSesion级别共享的缓存,在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库,当然,若第一次和第二次相同的SQL查询之间,执行了DML(INSERT/UPDATE/DELETE),则一级缓存会被清空,第二次查询相同SQL仍然会走数据库

一级缓存在下面情况会被清除

在同一个SqlSession下执行增删改操作时(不必提交),会清除一级缓存
SqlSession提交或关闭时(关闭时会自动提交),会清除一级缓存
对mapper.xml中的某个CRUD标签,设置属性flushCache=true,这样会导致该MappedStatement的一级缓存,二级缓存都失效(一个CRUD标签在mybatis中会被封装成一个MappedStatement)
在全局配置文件中设置 <setting name="localCacheScope" value="STATEMENT"/>,这样会使一级缓存失效,二级缓存不受影响


二级缓存

默认开启(官网进行的声明),通过多线程操作同一个业务让同一个SqlSessionFactory创建多个
SqlSession操作数据库。第二次相同业务SqlSessionFactory创建的SqlSession  就会使用上一次创建的SqlSession存放于缓存区的数据

springBoot是默认不使用一级缓存的  需要添加注释 @Transactional 事物注解 就可以开启一级缓存,使用同一个SqlSession

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

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

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

 

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<String, Object> 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<Product> {

serviceImpl中进行实现和继承


@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {

完成上面的继承和实现后,service层也可以进行直接调用mybatis-plus的增删改查API

@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {


    @Override
    public Map<String, Object> getAll() {

        Product product = baseMapper.selectById(1);
        System.out.println("查询 = " + product);

        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        queryWrapper.le("id","1");
        List<Product> products = baseMapper.selectList(queryWrapper);
        System.out.println("查询list = " + products);
        
        baseMapper.insert();
        baseMapper.delete();
        baseMapper.update();
        

        Map<String, Object> 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<Product> list = productService.list();//得到所有数据
        return  R.ok().data("productList",list);
    }


    @ApiOperation("测试IService")
    @GetMapping("/l")
    public R l(){
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        List<Product> products = productService.listByIds(list);//多个id得到数据


        Map<String, Object> all = productService.getAll();

        return  R.ok().data("products",products);
    }

}

WHERE   IF if判断

 <select id="findGys" resultType="java.util.Map">
        select * from rc_lbj
        <where>
            <if test=" offices != ''">
                and offices like concat('%', #{offices}, '%')
            </if>
            

            <if test="listF  != ''">

                <if test="maxF  != '' and maxF  != '0'">
                    and lbj_mark_all >= #{listF} and lbj_mark_all <![CDATA[ <= ]]> #{maxF}
                </if>

            </if>

            <if test="state != ''">
                and status = #{state}
            </if>
            and del_flag = '0'

        </where>
    </select>

mybatis 遍历for循环

    <select id="selectListById" parameterType="map" resultType="java.util.Map">
        select * from ${database}

        <where>
            <if test="id != null and id != ''">
                and zid IN
                <foreach collection="id" index="id" item="id" separator="," open="(" close=")">
                    #{id}
                </foreach>
            </if>
        </where>
        ORDER BY create_time DESC

    </select>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值