分页插件
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()括号里为对象的时候必须写parameterType 并且调用属性的时候要 对象.属性
@param将表单中name属性中的value值,赋值给方法中的形式参数
为什么要使用resultmap
B站颜群讲的resultmp
resultmap在标签当中只是一个“映射” 并不是返回值 一开始被标签中的resultmap和mapper接口的返回值list 类型不一致弄蒙了 原因是根本没有理解resultmap的工作原理
- 使用
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>