【javaweb】学习日记Day9 - Mybatis 基础操作

目录

一、删除

(1)在mapper接口执行sql删除语句

① 注解后sql语句没有提示怎么办?

(2)测试层 

(3)开启mybatis日志

(4)预编译SQL 

二、新增

(1)新增信息

(2)主键返回

三、更新

四、查询

(1)简单查询

当字段名与属性名不一致时,mybatis不封装

​ ① 解决办法1

 ② 解决办法2

(2)条件查询

五、定义XML映射文件

(1)在resource文件下创建【与mapper接口所在包名一致】的目录文件 

(2)在该目录下新建file文件

(3)在xml文件中搭建基础结构

① 获取接口全类名方法

(4)配置sql语句

① 定义方法名后,如何快速在xml文件中生成对应标签?

六、动态SQL

(1)if

(2)foreach

(3)sql&include


一、删除

(1)在mapper接口执行sql删除语句

① 注解后sql语句没有提示怎么办?

@Mapper
public interface EmpMapper {//根据id删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);
}

(2)测试层 

@SpringBootTest
class MybatisCrudApplicationTests {@Autowiredprivate EmpMapper empmapper;@Testpublic void textDelete() {empmapper.delete(17);}
}

(3)开启mybatis日志

在application.properties配置日志

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

(4)预编译SQL 

更高效:采用?占位符,java发送语句的同时发送参数,后续因为缓存已经有编译好的sql语句,直接可以执行

更安全(防止SQL注入):SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法

二、新增

(1)新增信息

!注意:#{}内采用【驼峰命名法】,即_用大写字母替代,eg:dept_id → deptId

@Mapper
public interface EmpMapper {//新增员工@Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +"values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")public void insert(Emp emp);
}
@SpringBootTest
class MybatisCrudApplicationTests {@Autowiredprivate EmpMapper empmapper;@Testpublic void textInsert() {Emp emp = new Emp();emp.setName("tom");emp.setUsername("TOM");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2000,1,1));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setId(1);empmapper.insert(emp);}

(2)主键返回

在数据添加成功后,需要获取插入数据的主键。eg:添加套餐数据时,需要返回套餐id来维护套餐-菜品关系

会将自动生成的主键值,赋值给emp对象的id属性

@Options(keyProperty = "id",useGeneratedKeys = true)
    //新增员工@Options(keyProperty = "id",useGeneratedKeys = true)@Insert("insert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +"values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")public void insert(Emp emp);

三、更新

根据id更新员工信息

@Mapper
public interface EmpMapper {//更新员工@Update("update emp set username = #{username} ,name = #{name},gender = #{gender},image = #{image},job = #{job},entrydate = #{entrydate},dept_id = #{deptId},update_time = #{updateTime} where id = #{id}")public void update(Emp emp);
}
@SpringBootTest
class MybatisCrudApplicationTests {@Autowiredprivate EmpMapper empmapper;@Testpublic void textInsert() {Emp emp = new Emp();emp.setName("kakak");emp.setUsername("88kakk");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2000,1,1));emp.setUpdateTime(LocalDateTime.now());emp.setId(18);emp.setDeptId(1);empmapper.update(emp);}
}

四、查询

(1)简单查询

@Mapper
public interface EmpMapper {//根据id查询员工@Select("select * from emp where id = #{id}")public Emp getById(Integer id);
}
@SpringBootTest
class MybatisCrudApplicationTests {@Autowiredprivate EmpMapper empmapper;@Testpublic void textInsert() {Emp emp = empmapper.getById(19);System.out.println(emp);}
}

当字段名与属性名不一致时,mybatis不封装

 ① 解决办法1

手动注解

@Mapper
public interface EmpMapper {//根据id查询员工@Results({@Result(column = "dept_id",property = "deptId"),@Result(column = "crea_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")})@Select("select * from emp where id = #{id}")public Emp getById(Integer id);
}

 ② 解决办法2

在application.properties开启驼峰命名法开关

# 开启驼峰命名法自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

(2)条件查询

#{}编译后会被?替代,但?不能出现在‘’内,因此我们不能使用#{},而要使用拼接${},但是${}有sql注入风险,因此我们使用concat()字符串拼接函数 

@Mapper
public interface EmpMapper {//根据id查询员工@Select("select * from emp where name like '%${name}%' and gender = #{gender} and entrydate between #{begin} and #{end}")public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
}
@Mapper
public interface EmpMapper {//根据id查询员工@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end}")public List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
}

@SpringBootTest
class MybatisCrudApplicationTests {@Autowiredprivate EmpMapper empmapper;@Testpublic void textList() {List<Emp> empList = empmapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));System.out.println(empList);}
}

五、定义XML映射文件

注解开发简单的sql,xml开发动态sql

(1)在resource文件下创建【与mapper接口所在包名一致】的目录文件 

(2)在该目录下新建file文件

文件名与mapper接口名一致

(3)在xml文件中搭建基础结构

namespace属性和mapper接口全类名一致

MyBatis中文网

① 获取接口全类名方法

<?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"></mapper>

(4)配置sql语句

id与mapper接口中方法名一致,保持返回类型一致

resultType和类名一致

① 定义方法名后,如何快速在xml文件中生成对应标签?

把光标置于方法名上,按alt+回车+回车,直接跳转到xml文件并生成 

六、动态SQL

随着用户的输入或外部条件变化而变化的SQL语句,称为动态SQL

比方说:查询框有姓名,性别,入职时间

用户如果不填某空(缺少某参数),用之前注解sql语句肯定会报错,而动态sql就是解决这一问题的

(1)if

如果test属性成立,则拼接SQL

<mapper namespace="com.itheima.mapper.EmpMapper"><!--    resultType:单条记录所封装的类型--><select id="list" resultType="com.itheima.pojo.Emp">select *from emp<where><if test="name != null">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>order by update_time desc</select></mapper>

(2)foreach

批量删除

  • collection:遍历的集合
  • item:遍历出来的元素
  • separator:分隔符
  • open:遍历开始前拼接的SQL片段
  • close:遍历结束后拼接的SQL片段
<mapper namespace="com.itheima.mapper.EmpMapper">
<!--    批量删除员工(18,19,20)--><delete id="deleteByIds">delete from emp where id in<foreach collection="ids" item="x" separator="," open="(" close=")">#{x}</foreach></delete>
</mapper>
@SpringBootTest
class MybatisCrudApplicationTests {@Autowiredprivate EmpMapper empmapper;@Testpublic void textList() {List<Integer> ids = Arrays.asList(13,14,15);empmapper.deleteByIds(ids);}
}

(3)sql&include

sql标签可以择出重复使用的语句,并用include在所需要的地方引/

<mapper namespace="com.itheima.mapper.EmpMapper"><sql id="commonSelect">select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_timefrom emp</sql><!--    resultType:单条记录所封装的类型--><select id="list" resultType="com.itheima.pojo.Emp"><include refid="commonSelect"/><where><if test="name != null">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>order by update_time desc</select></mapper>

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

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

相关文章

C++QT day2

作业 1> 封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&…

【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER(一)

文章目录 TASK系列解析文章前言PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER功能介绍PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER相关配置PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER流程确定优化变量定义目标函数定义约束ProcessSetUpStatesAndBoundsOptimizeByQPCheckSpeedLimitF…

it运维监控管理平台,统一运维监控管理平台

随着系统规模的不断扩大和复杂性的提高&#xff0c;IT运维管理的难度也在逐步增加。为了应对这一挑战&#xff0c;IT运维监控管理平台应运而生。本文将详细介绍IT运维监控管理平台的作用和优势以及如何选择合适的平台。 IT运维监控管理平台的作用管理平台 IT运维监控管理平台是…

把握市场潮流,溯源一流品质:在抖in新风潮 国货品牌驶过万重山

好原料、好设计、好品质、好服务……这个2023&#xff0c;“国货”二字再度成为服饰行业的发展关键词。以消费热潮为翼&#xff0c;越来越多代表性品类、头部品牌展现出独特价值&#xff0c;迎风而上&#xff0c;在抖音电商掀起一轮轮生意风潮。 一个设问是&#xff1a;在抖音…

Xubuntu16.04系统中解决无法识别exFAT格式的U盘

问题描述 将exFAT格式的U盘插入到Xubuntu16.04系统中&#xff0c;发现系统可以识别到此U盘&#xff0c;但是打不开&#xff0c;查询后发现需要安装exfat-utils库才行。 解决方案&#xff1a; 1.设备有网络的情况下 apt-get install exfat-utils直接安装exfat-utils库即可 2.设备…

当AI遇到IoT:开启智能生活的无限可能

文章目录 1. AI和IoT的融合1.1 什么是人工智能&#xff08;AI&#xff09;&#xff1f;1.2 什么是物联网&#xff08;IoT&#xff09;&#xff1f;1.3 AI和IoT的融合 2. 智能家居2.1 智能家居安全2.2 智能家居自动化 3. 医疗保健3.1 远程监护3.2 个性化医疗 4. 智能交通4.1 交通…

[.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试

场景 有个Service类&#xff0c;自己在内部实现生产者/消费者模式。即多个指令输入该服务后对象后&#xff0c;Service内部有专门的消费线程执行传入的指令。每个指令的执行间隔为1秒。这里有两部分组成&#xff0c; 工作线程的载体。new Thread与Task.Run。执行等待的方法。…

抓包工具fiddler的基础知识

目录 简介 1、作用 2、使用场景 3、http报文分析 3.1、请求报文 3.2、响应报文 4、介绍fiddler界面功能 4.1、AutoResponder(自动响应器) 4.2、Composer(设计请求) 4.3、断点 4.4、弱网测试 5、app抓包 简介 fiddler是位于客户端和服务端之间的http代理 1、作用 监控浏…

【狂神】SpringMVC笔记(一)之详细版

1.Restful 风格 概念&#xff1a; 实现方式&#xff1a; 使用PathVariable 在url相同的情况下&#xff0c;会根据请求方式的不同来执行不同的方法。 使用RestFull风格的好处&#xff1a;简洁、高效、安全 2、接受请求参数及数据回显 2.1、请求参数 方式一&#xff1a;这里…

Java ArrayList

简介 ArrayList类示一个可以动态修改的数组&#xff0c;与普通数组的区别是它没有固定大小的限制&#xff0c;可以添加和删除元素。 适用情况&#xff1a; 频繁的访问列表中的某一元素只需要在列表末尾进行添加和删除某些元素 实例 ArrayList 是一个数组队列&#xff0c;提…

伦敦金的走势高低的规律

伦敦金市场是一个流动性很强的市场&#xff0c;其价格走势会在诸多因素的影响下&#xff0c;出现反复的上下波动&#xff0c;如果投资者能够在这些高低走势中找到一定的规律&#xff0c;在相对有利的时机入场和离场&#xff0c;就能够通过不断的交易&#xff0c;累积大量的财富…

阿里云服务器退款规则_退款政策全解析

阿里云退款政策全解析&#xff0c;阿里云退款分为五天无理由全额退和非全额退订两种&#xff0c;阿里云百科以云服务器为例&#xff0c;阿里云服务器包年包月支持五天无理由全额退订&#xff0c;可申请无理由全额退款&#xff0c;如果是按量付费的云服务器直接释放资源即可。阿…