MyBatis见解4

10.MyBatis的动态SQL

10.5.trim标签

trim标签可以代替where标签、set标签

  • mapper
//修改public void updateByUser2(User user);
<update id="updateByUser2" parameterType="User">update user<!-- 增加SET前缀,忽略,后缀 --><trim prefix="SET" suffixOverrides=","><if test="birthday!=null">birthday=#{birthday},</if><if test="sex!=null and username != '' ">sex=#{sex},</if><if test="address!=null and username != '' ">address=#{address},</if></trim>where id=#{id}</update>

insert 用法

void addUser(User user);
<insert id="addUser" parameterType="user">INSERT INTO user<!--trim标签一定要包括if标签,作用:prefix:加上前缀,“(”suffix:加上后缀,“)”prefixOverrides:去除多余的前缀内容suffixOverrides:去除多余的后缀内容,“,”--><trim prefix="(" suffix=")" suffixOverrides=","><if test="username!=null and username!=''">username,</if></trim><trim prefix="VALUES(" suffix=")" suffixOverrides=","><if test="username!=null and username!=''">#{username},</if></trim></insert>

10.6.foreach标签

foreach标签的常见使用场景是集合进行遍历

  • mapper
    //批量删除public void deleteUserByIds(@Param("ids") List<Integer> ids);//批量添加public void insertUsers(@Param("userList") List<User> userList);
    //批量删除public void deleteUserByIds(@Param("ids") List<Integer> ids);//批量添加public void insertUsers(@Param("userList") List<User> userList);
  • 测试
 @Testpublic void testDeleteUserByIds(){UserDao userDao = sqlSession.getMapper(UserDao.class);List<Integer> ids = new ArrayList();ids.add(50);ids.add(64);ids.add(67);userDao.deleteUserByIds(ids);}@Testpublic void testInsertUsers(){UserDao userDao = sqlSession.getMapper(UserDao.class);long start = System.currentTimeMillis();List<User> userList = new ArrayList<>();for(int i = 0 ;i < 10000; i++) {User user = new User();user.setUsername("刘德华");user.setPassword("111");user.setBirthday(new Date());user.setSex("男");user.setAddress("香港");//userDao.insertUser(user);userList.add(user);}userDao.insertUsers(userList);long end = System.currentTimeMillis();System.out.println("一万条数据总耗时:" + (end-start) + "ms" );sqlSession.commit();}

10.7.sql标签

sql元素标签用来定义可重复使用的SQL代码片段,使用时只需要用include元素标签引用即可

  • mapper
    //复杂条件查询public List<User> findByUser3(User user);
    <!-- 定义SQL片段 --><sql id="query_user_where"><if test="username!=null and username != ''">and username=#{username}</if><if test="birthday!=null">and birthday=#{birthday}</if><if test="sex!=null and sex != ''">and sex=#{sex}</if><if test="address!=null and address != ''">and address=#{address}</if></sql><select id="findByUser3" resultType="User">select * from user<where><include refid="query_user_where"></include></where></select>
  • 测试
    @Testpublic void testFindAll3(){UserDao userDao = sqlSession.getMapper(UserDao.class);User user = new User();user.setAddress("香港");user.setUsername("刘德华");List<User> userList = userDao.findByUser3(user);for(User u : userList){System.out.println(u);}}

11.MyBatis的缓存

创建工程:
在这里插入图片描述

11.1缓存介绍

  • 为什么使用缓存?

    首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少IO、硬盘读写次数、提高效率

  • Mybatis中的一级缓存和二级缓存?

    • 一级缓存:

      它指的是mybatis中的SqlSession对象的缓存。当我们执行完查询之后,查询的结果会同时存在在SqlSession为我们提供的一块区域中。当我们再次查询同样的数据,mybatis会先去SqlSession中查询是否有,有的话直接拿出来使用。当SqlSession对象消失时,Mybatis的一级缓存也就消失了。

    • 二级缓存:

      它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessioFactory对象创建的SqlSession共享其缓存。
      在这里插入图片描述

11.2.一级缓存

11.2.1.mapper

public interface UserDao {//根据id查询用户信息public User findUserById(Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.UserDao"><select id="findUserById" resultType="User" parameterType="int">select * from user where id=#{id}</select>
</mapper>

11.2.2.测试一级缓存

    @Testpublic void testFindUserById() throws Exception{SqlSession sqlSession1 = sqlSessionFactory.openSession();UserDao userDao = sqlSession1.getMapper(UserDao.class);User user1 = userDao.findUserById(41);//执行查询System.out.println("第一次查询:" + user1);User user2 = userDao.findUserById(41);//不执行查询System.out.println("第二次查询:" + user2);SqlSession sqlSession2 = sqlSessionFactory.openSession();userDao = sqlSession2.getMapper(UserDao.class);User user3 = userDao.findUserById(41);//执行查询System.out.println("第三次查询:" + user1);}

11.2.3.一级缓存的分析

一级缓存是SqlSession范围的缓存,当调用SqlSession的commit(),close()等方法时,就会清空一级缓存。
在这里插入图片描述

  1. 第一次发起查询用户id为 1 的用户信息,先去找缓存中是否有id为 1 的用户信息,如果没有,从数据库查询用户信息。 得到用户信息,将用户信息存储到一级缓存中。

  2. 如果sqlSession去执行 commit操作(执行插入、更新、删除),清空 SqlSession 中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读

  3. 第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

11.2.4.测试清空一级缓存

xxxxxxxxxx     @Test    public void testFindUserById() throws Exception{        UserDao userDao = sqlSession.getMapper(UserDao.class);        User user1 = userDao.findUserById(41);//执行查询        System.out.println("第一次查询:" + user1);        User user2 = userDao.findUserById(41);//不执行查询        System.out.println("第二次查询:" + user2);        sqlSession.commit();                User user3 = userDao.findUserById(41);//执行查询        System.out.println("第三次查询:" + user1);    }

11.3.二级缓存

11.3.1.pojo

注意:当我们在使用二级缓存时,所缓存的类一定要实现java.io.Serializable接口,这种就可以使用序列化方式来保存对象。

public class User implements Serializable {private Integer id;private String username;private String password;private Date birthday;private String sex;private String address;//set get... ...
}   

11.3.2.开启二级缓存

  1. 在SqlMapConfig.xml 文件开启二级缓存
<settings><!-- 开启二级缓存的支持 --><setting name="cacheEnabled" value="true"/>
</settings>
  1. 配置相关的Mapper映射文件
<mapper namespace="com.by.dao.UserDao"><!-- 开启二级缓存的支持 --><cache></cache>

11.3.3.测试二级缓存

    @Testpublic void testSecondUserById(){SqlSession sqlSession1 = sqlSessionFactory.openSession();UserDao userDao = sqlSession1.getMapper(UserDao.class);User user1 = userDao.findUserById(41);//执行查询System.out.println("第一次查询:" + user1);sqlSession1.commit();//二级缓存在sqlSession.commit()或者sqlSession.close()之后生效SqlSession sqlSession2 = sqlSessionFactory.openSession();UserDao userDao2 = sqlSession2.getMapper(UserDao.class);User user2 = userDao2.findUserById(41);//不执行查询System.out.println("第二次查询:" + user2);}

11.3.4.二级缓存分析

二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存结构图:
在这里插入图片描述

11.3.5.测试清空二级缓存

@Test
public void testSecondUserById(){SqlSession sqlSession1 = sqlSessionFactory.openSession();UserDao userDao = sqlSession1.getMapper(UserDao.class);User user1 = userDao.findUserById(43);//执行查询System.out.println("第一次查询:" + user1);sqlSession1.commit();SqlSession sqlSession3 = sqlSessionFactory.openSession();UserDao userDao3 = sqlSession3.getMapper(UserDao.class);userDao3.deleteUserById(41);sqlSession3.commit();SqlSession sqlSession2 = sqlSessionFactory.openSession();UserDao userDao2 = sqlSession2.getMapper(UserDao.class);User user2 = userDao2.findUserById(43);不执行查询System.out.println("第二次查询:" + user2);sqlSession2.commit();sqlSession2.close();
}

12.MyBatis的注解开发-了解

创建工程:
在这里插入图片描述

12.1.注解开发的缺点

MyBatis可以在接口中直接添加MyBatis注解,完成CRUD。

但注解模式属于硬编码到.java文件中,失去了使用配置文件外部修改的优势,可结合需求选用。

12.2.mapper

public interface UserDao {/*** 查询所有用户* @return*/@Select("select * from user")public List<User> findAll();/*** 保存操作* @param user* @return*/@Insert("insert into user(username,sex,birthday,address)values(#{username},+"#{sex},#{birthday},#{address})")@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before =false,statement = { "select last_insert_id()" })int saveUser(User user);/*** 更新操作* @param user* @return*/@Update("update user set username=#{username},address=#{address}," +"sex=#{sex},birthday=#{birthday} where id =#{id} ")void updateUser(User user);/*** 删除用户* @param id* @return*/@Delete("delete from user where id = #{id} ")void deleteUser(Integer id);/*** 查询使用聚合函数* @return*/@Select("select count(*) from user ")int findTotal();/*** 根据id查询用户* @return*/@Select("select * from user where id = #{id} ")public User findById(Integer id);/*** 一对多* @return*/@Results(id="resultMap",value= {@Result(id=true,column="id",property="id"),@Result(column="username",property="username"),@Result(column="sex",property="sex"),@Result(column="address",property="address"),@Result(column="birthday",property="birthday"),@Result(column="id",property="accounts",many=@Many(select="com.by.dao.AccountDao.findByuId",fetchType= FetchType.LAZY))})@Select("select * from user")public List<User> findAll2();
}
public interface AccountDao {@Results(id="accountMap",value= {@Result(id=true,column="id",property="id"),@Result(column="uid",property="uid"),@Result(column="money",property="money"),@Result(column="uid",property="user",one=@One(select="com.by.dao.UserDao.findById",fetchType= FetchType.LAZY))})@Select("select * from account")List<Account> findAll();@Select("select * from account where uid = #{uid} ")List<Account> findByuId(Integer id);
}

12.3.pojo

public class User implements Serializable {private Integer id;private String username;private String password;private Date birthday;private String sex;private String address;private List<Account> accounts;//一对多关系映射private List<Account> accounts;// get set toString方法省略
}	
public class Account implements Serializable {private Integer id;private Integer uid;private Double money;//一对一关系映射private User user;// get set toString方法省略
}

12.4.测试

    @Testpublic void testFindAll() throws Exception{UserDao userDao = sqlSession.getMapper(UserDao.class);List<User> userList = userDao.findAll2();for(User user : userList){System.out.println(user);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224725.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络复习-OSI TCP/IP 物理层

我膨胀了&#xff0c;挂我啊~ 作者简介&#xff1a; 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW&#xff0c;今年是第一年。。 TCP/IP模型 先做两道题&#xff1a; TCP/IP协议模型由高层到低层分为哪几层&#xff1a; 这题…

VScode远程连接服务器,Pycharm专业版下载及远程连接(深度学习远程篇)

Visual Code、PyCharm专业版&#xff0c;本地和远程交互。 远程连接需要用到SSH协议的技术&#xff0c;常用的代码编辑器vscode 和 pycharm都有此类功能。社区版的pycharm是免费的&#xff0c;但是社区版不支持ssh连接服务器&#xff0c;只有专业版才可以&#xff0c;需要破解…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目&#xff0c;当超出 Rasa 现有意图(out_of_scope)的时候&#xff0c;就会执行 ActionGPTFallback&#xff0c;本质上就是利用 Langchain 做了一个 RAG&#xff0c;调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…

js显示前七天的日期,前几天依次类推

1.效果图 2.js代码 function beforetime1() {let now new Date();//想获取前七天日期就减七&#xff0c;前六天就减六&#xff0c;以此类推var date new Date(now.getTime() - 7 * 24 * 3600 * 1000);var y date.getFullYear();var m date.getMonth() 1;m m < 10 ? …

【物联网】光影之谜:RGB-LED传感器引领科技变革之路

​​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《物联网实战 | 数字奇迹记》⏰翰墨致赠&#xff1a;狂风挟雷霆舞苍穹&#xff0c;剑气横扫万里空。英雄豪情铸不朽&#xff0c;激荡壮志燃热风。 ​ 目录 ⛳️1. 初识物联网 ⛳…

TikTok与环保:短视频如何引领可持续生活方式?

在数字时代&#xff0c;社交媒体平台扮演着塑造文化和价值观的关键角色。而TikTok&#xff0c;作为一款全球短视频平台&#xff0c;不仅塑造着用户的娱乐方式&#xff0c;还在悄然地引领着可持续生活方式的潮流。本文将深入探讨TikTok与环保之间的关系&#xff0c;分析短视频如…

【FPGA】分享一些FPGA高速信号处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

顺序表的基本操作(必学)

目录 线性表&#xff1a; 顺序表&#xff1a; 概念和结构&#xff1a; 动态顺序表常用操作实现&#xff1a; 头文件&#xff08;数组顺序表的声明&#xff09;&#xff1a; 各种基本操作总的声明&#xff1a; 顺序表的初始化&#xff1a; 顺序表的销毁 顺序表的打印 …

【Vue2+3入门到实战】(4)Vue基础之指令修饰符 、v-bind对样式增强的操作、v-model应用于其他表单元素 详细示例

目录 一、今日学习目标1.指令补充 二、指令修饰符1.什么是指令修饰符&#xff1f;2.按键修饰符3.v-model修饰符4.事件修饰符 三、v-bind对样式控制的增强-操作class1.语法&#xff1a;2.对象语法3.数组语法4.代码练习 四、京东秒杀-tab栏切换导航高亮1.需求&#xff1a;2.准备代…

大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战

文章目录 大数据深度解析NLP文本摘要技术&#xff1a;定义、应用与PyTorch实战1. 概述1.1 什么是文本摘要&#xff1f;1.2 为什么需要文本摘要&#xff1f; 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 …

2023年国赛高教杯数学建模E题黄河水沙监测数据分析解题全过程文档及程序

2023年国赛高教杯数学建模 E题 黄河水沙监测数据分析 原题再现 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变化和人民生活的影响&#xff0c;以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾等方面都具有重要的理论指导…

mmdetection使用projects/gradio_demo

我用google的colab搭建。 # Check nvcc version !nvcc -V # Check GCC version !gcc --version # install dependencies: (use cu111 because colab has CUDA 11.1) %pip install -U openmim !mim install "mmengine>0.7.0" !mim install "mmcv>2.0.0rc4…

智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜣螂算法4.实验参数设定5.算法结果6.参考文献7.MA…

WPS复选框里打对号,显示小太阳或粗黑圆圈的问题解决方法

问题描述 WPS是时下最流行的字处理软件之一&#xff0c;是目前唯一可以和微软office办公套件相抗衡的国产软件。然而&#xff0c;在使用WPS的过程中也会出现一些莫名其妙的错误&#xff0c;如利用WPS打开docx文件时&#xff0c;如果文件包含复选框&#xff0c;经常会出…

民富购:塑造数字时代下的电商革新与社会责任典范

在数字经济时代,电子商务已经成为建立市场关系、创新产业和服务业态、促进经济增长的重要途径和手段。特别是在中国,新型电子商务的迅猛发展已经改变了生产和生活的方方面面,不仅催生了众多新业态,还通过“互联网”战略让许多传统产业和服务焕发了新的生机。民富购,作为扬羊(广…

【数据结构入门精讲 | 第十七篇】一文讲清图及各类图算法

在上一篇中我们进行了的并查集相关练习&#xff0c;在这一篇中我们将学习图的知识点。 目录 概念深度优先DFS伪代码 广度优先BFS伪代码 最短路径算法&#xff08;Dijkstra&#xff09;伪代码 Floyd算法拓扑排序逆拓扑排序 概念 下面介绍几种在对图操作时常用的算法。 深度优先D…

融资项目——swagger2的注解

1. ApiModel与ApiModelProperty(在实体类中使用) 如上图&#xff0c;ApiModel加在实体类上方&#xff0c;用于整体描述实体类。ApiModelProperty(value"xxx",example"xxx")放于每个属性上方&#xff0c;用于对属性进行描述。swagger2网页上的效果如下图&am…

2023RT-Thread开发者大会

参加了一次RT-Thread的开发者大会&#xff0c;相当有意思&#xff0c;虽然一天奔波挺累&#xff0c;但睡了半天之后简单剪了下22号的视频&#xff0c;也就有时间写自己的参会笔记了。 与openEuler社区不同&#xff0c;RT-Thread社区更专注于嵌入式&#xff0c;与硬件厂商结合…

算法通关村-番外篇排序算法

大家好我是苏麟 , 今天带来番外篇 . 冒泡排序 BubbleSort 最基本的排序算法&#xff0c;最常用的排序算法 . 我们以关键字序列{26,53,48,11,13,48,32,15}看一下排序过程: 动画演示 : 代码如下 : (基础版) class Solution {public int[] sortArray(int[] nums) {for(int i …