mybatis新知识

本文介绍了MyBatis中的动态SQL基础,如`<foreach>`和`<where>`标签的使用,解释了为何使用`1=1`,以及`JDBCType`的作用。还探讨了`useGeneratedKeys`在插入操作中的优势,`@Param`注解在参数传递中的重要性,以及`resultMap`映射复杂查询结果的场景。同时,文章讨论了`concat()`函数在SQL查询中的应用,MyBatis中`order by`动态参数的使用,以及如何获取数据库的随机或最新数据。
摘要由CSDN通过智能技术生成

分页插件
github.pageHelper

动态sql基础

foreach 因为通常集合 数组什么的都是以(1,2,3)的形式存在

select 。。。 where 字段 in  
if< test="集合名!=null" > 
< foreach  collection="集合名" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>

set是在有内容的时候插入到第一个 会把最后一个的逗号给去掉

知道select count(*)那select sum(id) 是什么?

select sum() 是求一列的字段值

为什么使用< where > 1=1

where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

  • where 是当后面的< if > 成功了它才会出现 如果没有成功的就不出现
    但是1=1 就会让where永远出现 而且即使后面的if没有一个成功的 那么就是没有条件可以拼接在where后面也不会出错
  • 2.where是加在第一个if成功的语句的前面的
    每加一个条件,都要判断前面有没有where 条件,如果没有就写where …,有就写and语句,因此此时用1=1可以简化了应用程序的复杂度。
  • 那么在每一个不为空的查询条件面前,
    都必须判断有没有where字句,当前查询条件用不用去掉and 或者 or。
    如果上来就是1=1 确保了有where字句 已经在第一个出现的地方加where,后面的都不用再判断前面是否有where字句了
<insert id="insert" parameterTyper="..." 
 useGeneratedKeys="true" keyProperty="accountId">
insert into <include refid="table"/>
where account_ID=#{accountID,JdbcType=INTEGER} 

为什么要使用JDBCTYPE

B站颜群讲jdbctype
当传给标签的参数的数据类型不能处理的时候 :
最简单比如你传了个null类型 或者人家要integer你给string
就会默认走你设置的jdbctype的类型 避免出错
一般CRUD时pojo属性给数据库字段赋值都会用到

在mybatis中配置jdbctype原因是 更新或者插入等不希望赋给字段内容为空即无效的类型


JDBCTYPE是数据库中字段的类型,看看都有那些

为什么insert的时候useGeneratedKeys

注意!!!!!用了这个insert的时候就不用在自己手动添加主键了 直接越过主键去为其他字段赋值吧

useGeneratedKeys="true" keyProperty="articleId"
useGeneratedKeys设置为 true 时,
表示如果插入的atricle表的articleId以自增列为主键,
则允许 JDBC 支持自动生成主键,并可将自动生成的主键articleId返回。

如果当前的表是以自增列为主键 那我们使用这个useGeneratedKeys就是
不用去传主键他会自动的帮我们生成主键并且返回给其插入的主键字段具体指

useGeneratedKeys参数只针对 insert 语句生效,默认为 false

在这里插入图片描述
在这里插入图片描述

为什么要使用@param

B站颜群讲的@param
在传递多个参数的时候 mapper.xml的标签中直接写参数名是会报错的
只能用param1~ 或者arg0等 但是不宜读 为了宜读在参数前面加上@Param(“代替名") 直接使用代替名就可以进行sql赋值

@param的用法

注意一下@Param()括号里为对象的时候必须写parameterType 并且调用属性的时候要 对象.属性
@param将表单中name属性中的value值,赋值给方法中的形式参数

为什么要使用resultmap

B站颜群讲的resultmp
resultmap在标签当中只是一个“映射” 并不是返回值 一开始被标签中的resultmap和mapper接口的返回值list 类型不一致弄蒙了 原因是根本没有理解resultmap的工作原理

resultMap作为返回结果类型

resultMap2

  • 使用 resultMap 对列表展示所需的必要字段来进行自动映射,特别是当数据库的字段名和实体类entity中的属性名不一致的情况下。或者需要做复杂的联合查询以便自由控制映射结果。
  • 数据库里的都有加"-"例如,字段名/列名 column 是 article-title,而 Atrical 对象的属性名(property)为 articleTitle ,此时就需要做映射。 在这里插入图片描述

什么是concat()函数

最常用的情况是查询的时候把返回结果 通过concat()函数字符串拼接后变成我们想要的查询结果

 select name from  table where address="江西"
 select concat("名字是:",name,的人住在江西 )from  table where address="江西"

还有在模糊查询的时候常用 具体的好处我也没弄清楚 但是好像就是工作都这样写 把参数包裹起来 然后再前后拼接形成%#{id}% 这样我们参数就在里面一直变换
可能从前是需要手动的改变值like 后面直接跟"%id%" 放的参数都不会被真正改变会出错误吧
链接1:concat()模糊查询

链接2:ORACLE 只能接收contat(参数1,参数2)中有2个
一般情况我们模糊查询都是
like “fish%” 以fish开头
like “%M” 以M结尾
在这里插入图片描述
在这里插入图片描述

为什么MyBatis排序时使用order by 动态参数时,用$而不是# 或者说用字符串

ORDER BY `article`.`article_order` DESC

有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

获得数据库中指定数量的随机数据 order by rand() limit #{limit}

在这里插入图片描述

获得数据库中最新更新时间的数据 max(字段名)

在这里插入图片描述

模板

  • 通常返回大量数据的时候要记得limit 以及排序
  • 排序都是按照最火 最新的order by article_order desc, article_id desc , status asc
    但是在种类 或者标签这种属性的排序是按照 tag_id asc 升序 我想应该是升序的会把父标签 父种类先显示出来
  • 返回的是总数的时候记得判断status 很多时候计算总数的时候只要status=1
<select id=" "  resultType=" " >
select  <include refid=""/>  from <include refid=""/> 
<where>
<if test="  !=null"> 数据字段=#{pojo属性,jdbcType=全大写属性} </if>
<if test="  !=null"> 数据字段=#{pojo属性,jdbcType=全大写属性} </if>
</where>
order by  表.order desc ,表.id desc
 limit #{limit}或者分页limit #{pageStart},#{pageSize}
</select>

<insert id="" paramertType=" " userGeneratedKey="true" 
keyPropert=" id">
insert into <include refid="">(,,,) 
values(#{第一个非主键的属性,jdbcType=},#{属性,jdbcType=},,)
</insert>
<update id="" parameterType="" >
update <include refid=" "> 
<SET>
<if test="!=null">字段名=#{属性},</if>
<if test="!=null">字段名=#{属性},</if>
</SET>
where =#{,jdbcType=}
</update>
<delete id="" parameterType="">
delete from <include refid=""> where 
<if test="!=null">   =#{属性名,jdbcType=}</if>

<delete> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值