当前位置: 首页 > news >正文

IDEA-MyBatis动态sql关联映射

一、表格创建

二、表格查询

1.findall返回整张表

studentdao.java
public List<Student> findAll();
  studentdao.xml
<!--把StudentDao接口里声明的7个方法 一对一地翻译成 SQL,并交给 MyBatis去执行--><select id="findAll" resultMap="demo"> select * from student </select><resultMap id="demo" type="com.qcby.entity.Student">
  Teststudent.java
@Testpublic void findAll() {//代理对象调用方法List<Student> students =  mapper.findAll();for (Student student : students) {System.out.println(student);}}

2.根据id查找

public Student findById(int id);
    <!--     根据id查找 -->
<select id="findById" resultType="com.qcby.entity.Student"  parameterType="java.lang.Integer">
select * from student where id = #{id} </select>
//调用id查找的函数@Testpublic void findById() {Student student = mapper.findById(2);//找id是2的人System.out.println(student);//打印出来的是id=2的所有信息}

3.插入

public int insert(Student student);
    <!--     插入  --><insert id="insert" parameterType="com.qcby.entity.Student">insert into student(name,age,sex) value(#{name},#{age},#{sex}) </insert>
  @Testpublic void insert() {Student student = new Student();//插入需要创建一个新对象student.setName("cici");//set设置后面跟姓名年龄性别student.setAge(20);student.setSex("女");int code = mapper.insert(student);session.commit();事物提交,只有加上这句话才能做修改System.out.println(code);}  

4.删除

public int delete(int id);
    <!--     删除 --><delete id="delete" parameterType="java.lang.Integer">delete from student where id=#{id} </delete>
//删除@Testpublic void delete() {int code = mapper.delete(3);session.commit();System.out.println(code);}

5.模糊查找

#{} 占位符赋值 参数采用预编译 防止sql注入
${} 采用sql拼接 无法防止sql注入#{} 参数是简单类型(基础类型和字符串) 变量可以任意
${} 参数是简单类型(基础类型和字符串) 变量只能用value 如果是其他需要用@Param注入、#{}如果是字符串类型的数据会自动加上''
${}参数是字符串 需要手动加上''如果参数是引用类型,变量是引用类型中的属性,不可任意

90%的情况用#{},只有在目标里面是value的时候采用${}(模糊查找)

    //根据姓名查找   findByName只按姓名模糊查public List<Student> findByName(String name);
    <!--    模糊查找  -->
<select id="findByName" resultType="com.qcby.entity.Student" parameterType="java.lang.String">
、select * from student where name like '%${value}%' 
</select> <!--$只识别value,$里面不能用name-->
 @Testpublic void findStudent() {List<Student> students = mapper.findByName("张");for (Student student : students) {System.out.println(student);

6. 动态 SQL 标签

    //根据姓名年龄性别查找  动态查询:姓名/年龄/性别哪个字段有值就按哪个查public List<Student> search(Student student);

①  <where>  智能前缀 where if
自动处理首个  and  /  or ,避免  WHERE AND …  语法错。

        <!-- where if 针对and和or动态变化 -->select * from student<where><if test="name!=null and name!=''"> name=#{name} </if><if test="age!=null"> and age=#{age} </if><if test="sex!=null"> and sex=#{sex} </if></where></select>

②  <set>  智能后缀
自动去掉尾部多余逗号,防止  SET name=?,  语法错

   <!--     修改  set if动态修改,根据传不传参做拼接 --><update id="update" parameterType="com.qcby.entity.Student"><!-- update student set name = #{name},age=#{age},sex=#{sex} where id = #{id} -->update student<set><if test="name!=null"> name = #{name}, </if><if test="age"> age=#{age}, </if><if test="sex"> sex=#{sex} </if></set>where id = #{id}</update>

③  <if>  判断
test  里写 OGNL 表达式,可用  and/or/null/''  等。
引用类型直接写属性名;简单类型加  @Param  后写参数名。

7.批量操作<foreach>

语法:

xml
<foreach collection="名称" item="元素变量" separator="," open="(" close=")">#{元素变量}
</foreach>
场景collection 取值item 示例
数组@Param("ids") Integer[] ids → collection="ids"#{id}
List@Param("students") List<Student> s → collection="students"#{stu.name}

collection:当前要循环的数组
item要循环的数组每一个元素
separator元素和元素之间用什么做分割
open当前循环以什么开始
close当前循环以什么结束

①批量删除

    //通过数组批量删除public int deleteByArray(@Param("ids") Integer[] ids);
<delete id="deleteByArray">delete from student where id in<foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} 
</foreach></delete>

②批量添加

    //批量添加public int insertMore(@Param("students") List<Student> students);
 <!--     批量添加 -->
<!--  insert into student(name,age,sex) values("李华",20,"女"),
("李华1",20,"女"),("李华2",20,"女") --><insert id="insertMore">insert into student(name,age,sex) values<foreach collection="students" item="stu" separator=","> (#{stu.name},#{stu.age},#{stu.sex}) </foreach></insert>

8. 常见易错点小结

1. 增删改 不要写  resultType ;查询必须写  resultType/resultMap 。
2.  ${}  只能用于非用户输入场景(动态列名、排序);用户输入一律  #{} 。
3.  <set>  /  <where>  自动处理前缀/后缀,但不会补全关键字,别漏  SET  /  WHERE 。
4. 接口方法与 XML  id  必须一字不差,否则绑定失败报  BindingException 。


三、双表查询


文章转载自:

http://kglRFOun.ymwnc.cn
http://FCHkGU1S.ymwnc.cn
http://rz0LsJBL.ymwnc.cn
http://77Ji4SbP.ymwnc.cn
http://EvfqAQU5.ymwnc.cn
http://bmw4irZZ.ymwnc.cn
http://x3ttWFUq.ymwnc.cn
http://evbnP1qW.ymwnc.cn
http://BzsSVEdV.ymwnc.cn
http://g66xrQn6.ymwnc.cn
http://0q7vMvOZ.ymwnc.cn
http://Rz3w8jJu.ymwnc.cn
http://IhdccDQv.ymwnc.cn
http://Ia86AKvR.ymwnc.cn
http://h6AC2udO.ymwnc.cn
http://aQzRPlY8.ymwnc.cn
http://ycE8cT7Y.ymwnc.cn
http://Y08ZaZy5.ymwnc.cn
http://BmmlczPH.ymwnc.cn
http://760n2rBZ.ymwnc.cn
http://9o0cqngi.ymwnc.cn
http://Iwt2XG0U.ymwnc.cn
http://1lgjqbwU.ymwnc.cn
http://cYSRhrW2.ymwnc.cn
http://yEHdvHVq.ymwnc.cn
http://2m1AgveJ.ymwnc.cn
http://HSMg50jU.ymwnc.cn
http://uSkDVJPC.ymwnc.cn
http://uN8unNmC.ymwnc.cn
http://ywaRsk28.ymwnc.cn
http://www.dtcms.com/a/384749.html

相关文章:

  • 【学习】【js】栈数据结构
  • Coze源码分析-资源库-创建知识库-后端源码-核心技术与总结
  • ArcGIS Pro实现基于 Excel 表格批量创建标准地理数据库(GDB)——高效数据库建库解决方案
  • 在openEuler系统 上安装Go语言开发环境
  • 奈奎斯特频率和采样定理的解释
  • 直播APP集成美颜SDK详解:智能美妆功能的开发实战
  • 基于Matlab GUI的心电信号QRS波群检测与心率分析系统
  • 贪心算法应用:5G网络切片问题详解
  • 【117】基于51单片机GSM智能拐杖老人防跌倒报警器【Keil程序+报告+原理图】
  • Rancher 社区双周报|聚焦 Harvester 新特性:网络、存储与虚拟化全面升级
  • CSS视差旋转动效实战
  • Java 设计模式——单例模式6种写法:从原理到 SpringBoot 落地
  • 【自存】懒汉式单例模式中的多线程经典问题
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(4)经典卷积神经网络ResNet的架构讲解
  • 区块链:搭建简单以太坊Geth私有链
  • 数据分析:函数
  • 《投资-57》元宇宙的价值
  • Linux任务调度全攻略
  • 基于springboot的毕业旅游一站式定制系统
  • 创建其他服务器账号
  • 前端-详解ref和$refs
  • C++---变量的多维分类
  • Vue 3 前端工程化规范
  • NLP Subword 之 WordPiece 算法原理
  • 【SQL】MySQL中空值处理COALESCE函数
  • Kafka实时数据管道:ETL在流式处理中的应用
  • VBA数据结构深度解析:字典对象与集合对象的性能终极对决
  • 查看当前虚拟环境中安装的 PyTorch 版本
  • 布尔运算-区间dp
  • WWW‘25一通读 |图Anomaly/OOD检测相关文章(1)