Web学习day04

mybatis


目录

mybatis

文章目录

一、查询

1.1结果映射

1.2多条件查询

1.3模糊查询

二、XML

书写规范

三、动态SQL

四、配置文件

4.1settings标签

4.2mappers标签

4.3environments标签

五、案例

5.1数据表

5.2实现类

5.3mapper实现

5.4工具类实现

5.5XML动态SQL实现

5.6XML配置实现

5.7测试实现

5.8pom.xml配置

总结


一、查询

1.1结果映射

开启驼峰映射:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射

字段起别名:SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。

@Results @Result:通过 @Results@Result 进行手动结果映射。

1.2多条件查询

@Param 标注在方法参数的前面,用于声明参数在#{}中的名字

1.3模糊查询

${}性能低,不安全,存在SQL注入问题:

#{}推荐:

二、XML

书写规范

XML文件的名称与Mapper接口名称一致,并且放置在相同包下(同包同名)。

XML文件的namespace属性为Mapper接口全限定名一致。

XML文件中sql语句的id与Mapper 接口中的方法名一致。

XML文件中sql语句的返回类型与Mapper 接口中的方法返回类型一致。

三、动态SQL

<if>

用于判断条件是否成立,如果条件为true,则拼接SQL

<where>

where 元素只会在子元素有内容的情况下才插入where子句

而且会自动去除子句的开头的AND OR

<set>

动态地在行首插入SET关键字,并会删掉额外的逗号(用在update语句中)

<foreach >

用来批量处理的 比如批量删除拼接 in后面的值

<sql>

定义一个sql片段 就是提取公共的sql

<include>

引入sql片段

四、配置文件

4.1settings标签

控制一些全局配置项的开闭

4.2mappers标签

加载Mapper接口位置

4.3environments标签

Druid(德鲁伊):  阿里巴巴提供的数据库连接池技术,国内使用率很高,提供了完善的监控机制

HikariCP:  日本人开发的连接池技术,号称性能之王,速度最快,SpringBoot2.0默认使用此连接池

五、案例

5.1数据表

5.2实现类

代码如下(示例):

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDate;
import java.time.LocalDateTime;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id;private String username;private String password;private String name;private Short gender;private String image;private Short job;//注意:这四个属性跟数据表中的字段不一致private LocalDate ed;private Integer deptId;private LocalDateTime createTime;private LocalDateTime updateTime;
}

5.3mapper实现

代码如下:

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.time.LocalDate;
import java.util.Date;
import java.util.List;public interface EmpMapper {@Select("select * from emp")public List<Emp> findAll();@Select("select * from emp")public List<Emp> findAll1();@Select("select id,username,password,name,gender,image,job,entrydate ed,dept_id,create_time,update_time from emp")public List<Emp> findAll2();@Select("select * from emp")@Results({@Result(column = "entrydate",property = "ed")})public List<Emp> findAll3();@Select("select * from emp where name =#{name} and gender = #{gender} and entrydate between #{begin} and #{end} ")@Results({@Result(column = "entrydate",property = "ed")})public List<Emp> findByCondition(@Param("name") String name,@Param("gender") Integer gender,@Param("begin") LocalDate begin,@Param("end") LocalDate end);@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} ")@Results({@Result(column = "entrydate",property = "ed")})public List<Emp> findByCondition2(@Param("name") String name,@Param("gender") Integer gender,@Param("begin") LocalDate begin,@Param("end") LocalDate end);public Emp findById(Integer id);List<Emp> findByCondition3(@Param("name") String name,@Param("gender") Short gender,@Param("begin") LocalDate begin,@Param("end") LocalDate end);void update(Emp emp);void deleteByIds(@Param("ids") List<Integer> ids);
}

5.4工具类实现

代码如下:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory = null;//保证SqlSessionFactory仅仅创建一次static {try {//读取配置文件InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");//创建SqlSessionFactorysqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);} catch (Exception e) {e.printStackTrace();}}//获取sqlSessionpublic static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}//提交事务 关闭sqlSessionpublic static void close(SqlSession sqlSession) {if (sqlSession != null) {//提交事务sqlSession.commit();//释放资源sqlSession.close();}}
}

5.5XML动态SQL实现

代码如下:

<?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.itheima.mapper.EmpMapper"><sql id="mySql">select * from emp</sql><resultMap id="MyMap" type="com.itheima.domain.Emp"><result column="entrydate" property="ed"/></resultMap><select id="findById" resultMap="MyMap"><include refid="mySql"/>where id = #{id}</select><select id="findByCondition3" resultType="com.itheima.domain.Emp"><include refid="mySql"/><where><if test="name != null and name !=''">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where></select><update id="update">update emp<set><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if><if test="name != null and name != ''">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null and image != ''">image = #{image},</if><if test="job != null">job = #{job},</if><if test="ed != null">entrydate = #{ed},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="createTime != null">create_time = #{createTime},</if><if test="updateTime != null">update_time = #{updateTime},</if></set>where id = #{id}</update><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete></mapper>

5.6XML配置实现

代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="mapUnderscoreToCamelCase" value="true"/><!--在控制台输出发送的sql日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!--目前只关注这部分内容,它的作用就是声明要连接的数据信息--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--声明含有sql的接口所在包--><package name="com.itheima.mapper"/></mappers>
</configuration>

5.7测试实现

代码如下:

package com.itheima.test;import com.itheima.domain.Emp;
import com.itheima.mapper.EmpMapper;
import com.itheima.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;public class EmpMapperTest {// 测试查询所有@Testpublic void testFindAll(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = empMapper.findAll();for (Emp emp : empList) {System.out.println(emp);}MybatisUtil.close(sqlSession);}// 测试结果集映射开启驼峰命名规则@Testpublic void testFindAll1(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = empMapper.findAll1();for (Emp emp : empList) {System.out.println(emp);}MybatisUtil.close(sqlSession);}// 测试结果集映射起别名@Testpublic void testFindAll2(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = empMapper.findAll2();for (Emp emp : empList) {System.out.println(emp);}MybatisUtil.close(sqlSession);}// 测试结果集映射手动结果映射@Results @Result@Testpublic void testFindAll3(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = empMapper.findAll3();for (Emp emp : empList) {System.out.println(emp);}MybatisUtil.close(sqlSession);}// 测试条件查询@Testpublic void testFindCondition(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = empMapper.findByCondition("张三丰",1, LocalDate.of(2000,1,1),LocalDate.of(2020,1,1));for (Emp emp : empList) {System.out.println(emp);}MybatisUtil.close(sqlSession);}// 测试模糊查询@Testpublic void testFindCondition2(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = empMapper.findByCondition2("张",1, LocalDate.of(2000,1,1),LocalDate.of(2020,1,1));for (Emp emp : empList) {System.out.println(emp);}MybatisUtil.close(sqlSession);}// 测试根据id查询@Testpublic void testFindById(){SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp1 = empMapper.findById(4);System.out.println(emp1);MybatisUtil.close(sqlSession);}//条件查询@Testpublic void testFindByCondition() {SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);//List<Emp> empList = empMapper.findByCondition3("张", (short) 1, LocalDate.of(2002, 01, 01), LocalDate.of(2023, 12, 31));//List<Emp> empList = empMapper.findByCondition3("张", (short) 1, null, null);List<Emp> empList = empMapper.findByCondition3("", (short) 1, null, null);empList.forEach(e -> System.out.println(e));//lambda方式打印MybatisUtil.close(sqlSession);}//更新@Testpublic void testUpdate() {SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setId(2);emp.setUsername("haha2");emp.setName("sdnajn");emp.setGender( (short) 1);emp.setImage("haha.jpg");emp.setJob((short) 2);emp.setDeptId(1);emp.setCreateTime(LocalDateTime.of(2023, 1, 1, 1, 1,1));emp.setUpdateTime(LocalDateTime.now());empMapper.update(emp);MybatisUtil.close(sqlSession);}//批量删除@Testpublic void deleteByIds() {SqlSession sqlSession = MybatisUtil.getSqlSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);empMapper.deleteByIds(Arrays.asList(13, 14, 15));MybatisUtil.close(sqlSession);}}

5.8pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>day04-01-mybatis</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version></dependency></dependencies></project>

总结

以上就是今天学习的内容。

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

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

相关文章

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统&#xff0c;后端基于Python语言&#xff0c;采用flask-restful开发后端接口&#xff0c;前端采用VueAntDesignVue实现。对其他类似系统的实现&#xff0c;比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

记一下blender曲线阵列

先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器&#xff0c;然后再给他添加一个curve修改器&#xff0c;使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后&#xff0c;死活无法沿着曲线阵列&#xff…

.快速幂.

按位与&#xff08;Bitwise AND&#xff09;是一种二进制运算&#xff0c;它逐位对两个数的二进制表示进行运算。对于每一位&#xff0c;只有两个相应的位都为1时&#xff0c;结果位才为1&#xff1b;否则&#xff0c;结果位为0。如&#xff1a;十进制9 & 5转化为二进制&am…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…

低代码商城构建专家:Mall-Cook

Mall-Cook&#xff1a;用Mall-Cook&#xff0c;让电商创新触手可及- 精选真开源&#xff0c;释放新价值。 概览 Mall-Cook是一个面向未来的商城低代码开发平台&#xff0c;它通过提供直观的可视化界面&#xff0c;让开发者和商家能够快速构建和部署跨平台的电商解决方案。这个…

微信小程序如何实现登陆和注册功能?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

服务器提交记录有Merge branch消除

背景&#xff1a;在共同开发分支release上&#xff0c;你提交了commit&#xff0c;push到服务器上时&#xff0c;发现有人先比你push了&#xff0c;所以你得先pull&#xff0c; 后再push&#xff0c;然而pull后自动产生了一个Merge branch的一个commit&#xff0c;这个commit本…

递归解决换零钱问题--回顾总结之递归的表达能力

前面为了保持叙述的流畅, 没有做太多的引申, 把总结推迟到了后面. 补上一些总结, 以防止出现 “下面呢? 下面没有了” 的尴尬. 方向性问题 虽然题目在一开始就暗示了这一点, 但首先, 我们还是要问, 它能用递归解决吗? 有点怀疑精神是好的, 既要低头走路, 更要抬头看路, 以防…

JDK14新特征最全详解

JDK 14一共发行了16个JEP(JDK Enhancement Proposals&#xff0c;JDK 增强提案)&#xff0c;筛选出JDK 14新特性。 - 343: 打包工具 (Incubator) - 345: G1的NUMA内存分配优化 - 349: JFR事件流 - 352: 非原子性的字节缓冲区映射 - 358: 友好的空指针异常 - 359: Records…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not iterable

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 对非数组类型使用 for...of 循环2. 对非可迭代对象使用扩展运算符3. 在 Promise.all 中传递非可迭代对象4. 使用解构赋值时&#xff0c;右侧值非可迭代 四、解决方案与预防措施1. 确保使用可迭代对象2. 使用…

各种Attention|即插即用|适用于YoloV5、V7、V8、V9、V10(一)

摘要 本文总结了各种注意力&#xff0c;即插即用&#xff0c;方便大家将注意力加到自己的论文中。 SE import torch from torch import nn class SEAttention(nn.Module): """ SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;中的注意力…

C++进阶(while循环——函数应用)

知识点代码框架总结 输入n组数据 &#xff0c;对n组数据里面的每一组进行处理&#xff08;输出、求和 、运算、其他&#xff09; int n;//几组数据cin >> n;//2while(n--){//对每组数据进行处理}看到下面的样例&#xff0c;肌肉型反映出上面的框架//2// 1 2 3// 4 5 6若…

虚拟机:VMware功能,安装与使用

目录 一、虚拟机介绍 二、VMware 1.介绍 2.安装 &#xff08;1&#xff09;根据提示按步骤安装​编辑 &#xff08;2&#xff09;更改软件的安装地址​编辑 &#xff08;3&#xff09;根据自己的需求选择是否需要软件更新​编辑 &#xff08;4&#xff09;根据需求选择…

自动驾驶中的人机互相接管问题讨论

一、背景 人机接管&#xff08;human takeover&#xff09;是指在自动驾驶过程中&#xff0c;当系统遇到超出其处理能力或预设安全阈值的情况时&#xff0c;将控制权交还给驾驶员的过程。这一环节的设计直接关系到自动驾驶技术的实用性与安全性&#xff0c;是目前研究和实践中…

【SQL】MySQL事务的隔离级别和幻读、脏读和不可重复读

事务的隔离级别是数据库管理系统提供的一种功能&#xff0c;用于控制事务之间的相互影响程度。常见的隔离级别包括&#xff1a; 读未提交 (Read Uncommitted)&#xff1a;允许一个事务读取另一个事务未提交的数据。 读已提交 (Read Committed)&#xff1a;一个事务只能读取另一…

Python应用爬虫下载QQ音乐歌曲!

目录&#xff1a; 1.简介怎样实现下载QQ音乐的过程&#xff1b; 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网&#xff1a; https://y.qq.com/&#xff0c;在搜索栏上输入一首歌曲的名称&#xff1b; 如我在上输入最美的期待&#xff0c;按回车来到这个画面 我们首…

[USACO24OPEN] Smaller Averages G (单调性优化dp)

来源 题目 Bessie 有两个长度为 N的数组&#xff08;1≤N≤500&#xff09;。第一个数组的第 i 个元素为 ai​&#xff08;1≤ai​≤10^6&#xff09;&#xff0c;第二个数组的第 i个元素为bi​&#xff08;1≤bi​≤10^6&#xff09;。 Bessie 希望将两个数组均划分为若干非空…

机器学习(五) -- 监督学习(6) --逻辑回归

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;5&#xff09; -- 线性回归2 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM1 前言 tips&#xff1a;标题前有“***”的内…

uniapp 支付宝小程序 芝麻免押 免押金

orderStr参数如下&#xff1a; my.tradePay({orderStr:res, // 完整的支付参数拼接成的字符串&#xff0c;从 alipay.fund.auth.order.app.freeze 接口获取success: (res) > {console.log(免押成功);console.log(JSON.stringify(res),不是JOSN);console.log(JSON.stringify…