mybatis学习笔记02-动态sql
时间:2019-10-26
本文章向大家介绍mybatis学习笔记02-动态sql,主要包括mybatis学习笔记02-动态sql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
动态sql
- sql
insert
<insert id="addUser" parameterType="User"> <selectKey resultType="Integer" keyColumn="id" order="AFTER" keyProperty="id"> select last_insert_id(); </selectKey> insert into t_user(id, `name`, age) values (#{id},#{name},#{age}); </insert>
- id: 唯一值, 一般对应mapper接口中的方法名
- parameterType: 传入的参数, 因为在核心配置文件里面配置了别名, 所以直接写的类名
- #{val}: 中间的字符串可以是任意值, 但是如果参数是对象的话, 必须是属性值
- selectKey 中, keyColumn是列名, keyProperty是属性名
- order表示的是数据库是先生成 id 再插入数据还是先插入数据再生成 id, mysql写AFTER就好
update
<update id="modifyUserById" parameterType="User"> update t_user set name = #{name}, age = #{age} where id = #{id}; </update>
delete
<delete id="deleteUserById" parameterType="Integer"> delete from t_user where id = #{id}; </delete>
- 此处#{}中间可以随便写
- select
selectList
<select id="getUsers" resultType="User"> select * from t_user; </select>
- resultType: 返回结果类型
selectOne
<select id="getUserById" parameterType="Integer" resultType="User"> select * from t_user where id = #{id}; </select>
模糊查询
<select id="getUsersByName" parameterType="String" resultType="cn.ann.bean.User"> select * from t_user where name like '%'#{name}'%'; <!-- select * from t_user where name like '%${name}%'; select * from t_user where name like #{name}; --> </select>
- #{name}
- "%"#{name}"%"
- '%\({name}%' ![\'%\){name}%'](https://images.cnblogs.com/cnblogs_com/ann-zhgy/1558457/o_$%7B%7D.png)
- 以上三种写法都可以得到预期的结果, 但是从截图我们可以看到, a和b用的是预编译(PrepareStatement对象), c使用的是字符串拼接(Statement)
- b中必须使用 " " 包裹 % 才有效, 另外, b写法在idea中有红色波浪线, 不知道是啥原因
- #{name}
- 动态sql
- 准备: 创建queryVo类
- queryVo 是sql语句条件的集合, 里面存储了执行sql时需要用到的条件
- sql片段
创建
<sql id="query"> select * from t_user </sql>
- 引用
<include refid="query"/>
- 注意:
- 创建和引用的id要一致
- sql片段相当于是文本的替换, 所以不要加分号(;)
- 注意:
if
<select id="getUserByCondition" resultType="User" parameterType="User"> select * from t_user where 1=1 <if test="name != null"> and name = #{name} </if> <if test="age != null"> and age = #{age} </if> </select>
- test里面写添加即可. 注意: 字段需要和参数对象的属性名一致
where
<select id="getUserByCondition" resultType="User" parameterType="QueryVo"> select * from t_user <where> <if test="user.name != null"> and name = #{user.name} </if> <if test="user.age != null"> and age = #{user.age} </if> </where> </select>
- 用where标签包裹之后, 上面的sql语句就不能写where了
- where里面的sql语句的and只能写在前面, 不能写在后面
foreach
<select id="getUsersByIdsVo" parameterType="QueryVo" resultType="User"> <include refid="query"/> <where> <foreach collection="ids" open="id in (" close=");" separator=", " item="id"> #{id} </foreach> </where> </select>
- 因为传入的是QueryVo, 所以forEach的collection属性的值是属性名即可
- 两个坑
当传入的参数是数组时
<select id="getUsersByIds" parameterType="Integer" resultType="User"> <include refid="query"/> <where> <foreach collection="array" open="id in (" close=");" separator=", " item="id"> #{id} </foreach> </where> </select>
- forEach的collection属性的值是必须是array
当传入的参数是列表时
<select id="getUsersByIdList" parameterType="Integer" resultType="User"> <include refid="query"/> <where> <foreach collection="list" open="id in (" close=");" separator=", " item="id"> #{id} </foreach> </where> </select>
- forEach的collection属性的值必须是list
- 准备: 创建queryVo类
原文地址:https://www.cnblogs.com/ann-zhgy/p/11743149.html
- "开门待客"还是“送货上门”?
- 同步一个数据库要发多少个数据包?
- BP神经网络识别性别
- 为or、in平反——or、in到底能不能利用索引?
- BP神经网络续1
- 隐藏在程序旮旯中的“安全问题”
- SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
- 能自己“跑”的表单控件,思路,雏形,源码。vs2005版本
- 在SQLMAP中使用动态SQL
- 使用OQL“语言”构造ORM实体类的复杂查询条件
- AdoHelper使用MySQL存储过程示例
- 使用8位字节的编码格式将字节流安全的转换成String
- 同样的SQL语句在查询分析器执行很快,但是网站上执行超时的诡异问题
- PDF.NET数据开发框架操作MySQL实体类操作实例
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- TRTC Android端开发接入学习之实现实时屏幕分享(四)
- Vue使用组件递归实现评论盖楼功能笔记
- 自监督注意力在密集光流估计中的应用
- SpringBoot+MyBatis+Spring 技术整合实现商品模块的CRUD操作
- 什么?面试官让我用ArrayList实现一个阻塞队列?
- A little fun with InnoDB multi-versioning(14.有关InnoDB多版本中的一个小问题)
- 聊聊java中的哪些Map:(八)ConcurrentSkipListMap源码分析
- littlevgl(Lvgl)最新版V7.4移植
- TiKV 源码解析系列文章(二十)Region Split 源码解析
- 轻松构建Tomcat源码
- Flutter中Contrainer 组件的宽高限制分析
- 10张图带你深入理解Docker容器和镜像
- 手摸手教你撸一个微服务框架-关于服务端的处理
- 聊聊claudb的string command
- windows下安装nodejs