Mybatis框架-程序员宅基地

技术标签: spring  java  intellij-idea  

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>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Java_Mr_Jin/article/details/121797805

智能推荐

c语言用fun函数求最大公约数,C语言程序设计第七次作业(示例代码)-程序员宅基地

文章浏览阅读707次。一、学习内容本次课学习了函数的基本知识,需要大家对如下知识点进行总结:1. 函数定义的基本格式,函数定义和函数原型(声明)的区别何在?2. 函数的调用方式有哪几种3. 什么是形参,什么是实参,函数调用时的参数传递机制是什么?二、实验内容1.定义一个判断素数的函数isprime(int n),利用该函数输出1000以内的所有素数,每行10个,最后输出一共有多少个素数。(每列对齐)2.求两个正整数的最..._调用fun函数求最大公约数

MyBatis-Plus实现多表联查(一对一,一对多使用)_mybatisplus一对多-程序员宅基地

文章浏览阅读3.8k次,点赞56次,收藏33次。在使用mybatis-plus开发需求的时候会发现对于大部分的业务场景来说都会使用到join来进行联表查询,但是mybatis-plus封装的 mapper 不支持 join,如果需要支持就需要自己手动去实现,给大家推荐一个好用的插件(Mybatis-Plus-Join(简称 MPJ)是一个 Mybatis-Plus的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。_mybatisplus一对多

基于JAVA学生信息管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署-程序员宅基地

文章浏览阅读106次。基于JAVA学生信息管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署。springboot基于springboot和vue的酒店管理系统。springboot基于SpringBoot的自助旅游导航系统。springboot基于JSP的企业办公管理系统设计与实现。JSP宠物食品店系统的设计与实现sqlserver。ssm基于Java的幼儿早教系统软件的设计与实现。ssm基于vue的健康餐饮管理系统的设计与实现。ssm基于JAVA的求职招聘网站的设计与实现。

Nginx_Ubuntu-程序员宅基地

文章浏览阅读113次。一. 基本步骤  1.1环境准备    开始前,请确认gcc g++开发类库是否装好,默认已经安装。    注:等待linux下载更新功能准备好了 重启系统 在执行下载安装命令,如执行命令没有问题可以继续往下走      1. 最小Ubuntu安装插件      1. 需要安装        sudo apt-get install build-essen..._snail mock

Android逆向安全-无侵入找关键call之trace日志分析大法_安卓逆向的trace方法-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏9次。标题找关键call是逆向的基本技能和分析目标,找到关键call后便可以进一步利用。在安卓App的逆向分析中,人肉逆向分析虽说不难,但是繁琐,特别是现在App体积动辄几十MB甚至几百MB,反编译出的jar或者smali文件相当多,找关键call无疑是大海捞针。那么有什么方法可以快速找关键call呢?之前介绍过两个方法:一个是插桩日志分析法,一个是借助加固的方法。插桩日志分析法,理解起来比较..._安卓逆向的trace方法

9个亮点助力你轻松建立emlog采集个人博客网站-程序员宅基地

文章浏览阅读604次。emlog采集是一款功能强大的博客管理系统,可以帮助你轻松搭建个人博客网站,分享你的思考和经验。无论你是新手还是老手,emlog采集都能满足你的需求,让你的博客更加专业和有吸引力。以下是emlog采集的9个亮点:1.简单易用emlog采集提供了简洁、直观的界面设计,使得操作变得轻松愉快。

随便推点

苹果手机测试网络速度的软件,‎App Store 上的“网速测试大师-测网速首选”-程序员宅基地

文章浏览阅读8.2k次。网速测试大师(SpeedTest Master)致力于为全球用户提供快速专业的网络测速服务。【最新功能】5G测速、Ping 测试、游戏Ping、一键设备检测。网速测试大师,是您的手机管家,wifi管家,随时随地的测速专家【全新工具】重磅推出史上最强工具箱:Ping测试,游戏Ping,跟踪路由。。。轻松解决任何网络问题【一键测速】只需30秒,快速、准确获得网速测试结果【全网测试】支持各大运营商测速;..._苹果手机测速软件

教了一年少儿编程,说说感想和体验-程序员宅基地

文章浏览阅读7.7k次,点赞24次,收藏115次。近两三年,少儿编程教育迅速崛起,成了 STEM 教育的主要代表。缘起少儿编程这个概念在国内兴起,总有个三四年了。2016 年,曾经有人问:“儿童学习编程是不是为了将来做'程序猿'?”。我当时给的回答是: 编程说白了就是用一种简单的符号语言描述一种解决方案来解决实际问题。编出程序的效果取决于两个方面:1、对于实际业务问题的了解;2、对算法和数据的掌控。 这两者的基..._python编程少儿课程课后评价

22东华大学计算机专硕854考研上岸实录-程序员宅基地

文章浏览阅读5.5k次,点赞21次,收藏72次。22东华大学计算机专硕854考研上岸实录注:本人所有学习笔记都在CSDN个人专栏(数学英语854数据库408等),这样方便个人复习,不用手写浪费时间,错题也是放在word文档中(题目、答案截图),方便纠错复习。(以上为本人所有考研纸质书籍,其他均为电子版资料。一般都是看电子版习题,答案写在演草纸上)一.2021年3~7月 数学第一轮、英语第一轮、408第一轮3月份的时候想报考上海大学,上海大学的专硕是22408,所以我开始着手准备起来。第一阶段我跟的是汤家凤的零基础课程(B站),老汤的确是一个很_东华大学计算机专硕

如何用《玉树芝兰》入门数据科学?-程序员宅基地

文章浏览阅读589次。链接起散落的文章,给《玉树芝兰》数据科学系列教程做个导读,帮你更为高效入门数据科学。(由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的..._玉树芝兰深度学习优酷

macOS使用brew包管理器_brew清理缓存-程序员宅基地

文章浏览阅读2.1k次。macOS使用brew包管理器安装brewbrew权限修复brew常用命令Brew-cask相关命令brew serivces 相关命令brew 指南https://www.cnblogs.com/gee1k/p/10655037.html安装brew#- 该教程适用于macOS10.13以上版本#- 先安装XCode或者Command Line Tools for Xcode。Xcode可以从AppStore里下载安装,Command Line Tools for Xcode需要在终端中输入以下_brew清理缓存

【echarts没有刷新】用按钮切换echarts图表的时候,该消失的图表还在,加个key属性就解决了_echarts 怎么加key值-程序员宅基地

文章浏览阅读789次,点赞6次,收藏2次。【echarts没有刷新】用按钮切换echarts图表的时候,该消失的图表还在,加个key属性就解决了_echarts 怎么加key值

推荐文章

热门文章

相关标签