Day68
Posted 五条人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day68相关的知识,希望对你有一定的参考价值。
MyBatis传参
业务逻辑就用pojo,临时传过来的东西塞进map中。
1)、单个参数:
基本类型:
#{随便写},因为只传了一个参数,随便写都可以
传pojo
2)、多个参数
取值:#{参数名} 是无效的。
可用--->>0,1(参数的索引)或者是param1、param2。
原因:只要传入了多个参数:mybatis会自动的将这些参数封装在一个map中;
封装时使用的key就是参数的索引和参数的第几个表示
Map<String,Object> map = new HashMap<>();
map.put("1","传入值");map.put(“2”,“传入值”);
# {key}就是从这个map中取值;
3)、@Param:----->>>为参数指定key;命名参数
多个参数的解决方案:可以告诉mybatis不要乱封装,封装成map的时候使用的key用我们自己定义的key。
@Param("id")Integer id ,@Param("empname")String empname
4)、传入pojo(javaBean)
取值:#{pojo的属性名}
5)、传入map:将多个要使用的参数封装起来。
取值:#{key}
new一个map,往map里面put东西
然后把map传入进去。
拓展:多个参数;自动封装map
method01(@Param("id")Integer id ,String empname,Employee employee)
Integer id --> #{id}
String empname---->>>#{param2}
Employee employee (取出这个里面的email) ----->>>#{param3.email}
无论传入什么参数,都要能正确的取出值:
----->> #{key/属性名}
{key}取值的时候可以设置一些规则:
实际开发中:---->>>只需要把这个设定好:---->>> jdbcType = 指定使用哪些数据库
在mybatis里面,有两种取值方式:
-->> #{属性名}:是参数预编译的方式,参数的位置都是?替代,参数都是预编设置进去的;安全,不会有sql注入问题
-- >>${属性名}:不是参数预编译;而是直接和sql语句进行拼串;不安全。
sql语句只有参数位置是支持预编译的。
当表名需要动态查询,就需要用${}。表名不支持#{}
MyBatis返回List
如果返回的是集合,resultTpye = 写的是集合里面元素的类型。
查询多个的情况下:---->>>>集合里面写元素的类型。
@MapKey(”id“)写在方法上-->> 查出来的记录的id的值作为key来封装这个map。
自定义结果集
自己定义每一列数据和javaBean的映射规矩
<!--
type="";指定哪个javaBean自定义封装规则:全类名
id ="" ;唯一标识, 让别名后面引用。
-->
这里sorry,是指定使用自定义的映射规矩。查出数据后,封装结果的时候,用sorry自定义的规则。
<select id = "getCatById" resultMap="sorry">
sql语句
</select>
<resultMap type="com.sorrymaker.sorry" id="sorry">
<!--指定主键列的对应规则:主键列用id,普通列用result。
colum ="id" : -- 指定那一列是主键列。
property ="" : 指定cat的哪个属性封装id这一列数据。
-->
<id property ="id" column ="id"/>
<!-- 普通列-->
<result property ="name" column = "cName"/>
<result property ="age" colum = "cAge" />
<result property ="gender" column ="cgender"/>
</resultMap>
多表联合查询时候
用自定义封装规则,这样子比较方便。
association:复杂的类型关联
表示联合了一个对象。
<!--
type="";指定哪个javaBean自定义封装规则:全类名
id ="" ;唯一标识, 让别名后面引用。
-->
这里sorry,是指定使用自定义的映射规矩。查出数据后,封装结果的时候,用sorry自定义的规则。
<select id = "getCatById" resultMap="sorry">
sql语句
</select>
<resultMap type="com.sorrymaker.sorry" id="sorry">
<!--指定主键列的对应规则:主键列用id,普通列用result。
colum ="id" : -- 指定那一列是主键列。
property ="" : 指定cat的哪个属性封装id这一列数据。
-->
<id property ="id" column ="id"/>
<!-- 普通列-->
<result property ="name" column = "cName"/>
<result property ="age" colum = "cAge" />
<result property ="gender" column ="cgender"/>
<!--用association,联合查询。 -->
<association property ="lock" javaType ="全类名">
<id property="id" column ="id"/>
<result property ="lockName" column = "lockname"/>
</association>
</resultMap>
collection:复杂的结果集
专门用于定义集合元素的封装。
javaType :指定对象类型;assciation
ofTpye : 指定集合里面的元素类型;collection
1-1关联:一个key开一个lock
1-n关联:外键一定放在n的一端。
n-n关联:中间表存储对应关系。
延迟加载和按需加载
这里是全局配置。局部配置会覆盖掉全局配置
<settings>
<!--开启延迟加载开关-->
<setting name ="lazyLoadingEnabled" value="true"/>
<!-- 开启按需加载-->
<setting name ="aggressiveLazyLoading" value ="true"/>
</settings>
推荐:用连接查询,最合适。
动态SQL
< if >if标签
<!--test = " ",编写判断条件。
<if test="id!=null">:取出传入的javaBean属性的id值,判断是否为空
<if test="name!=null and name !="" "> 空字符串判断。
<if test = " or ">
-->
<if test = ""></if>
< Where >
可以帮我们去除掉前面添加的and;去不掉后面的and
< trim >
截取字符串
perfix :为我们下面的sql整体添加一个前缀。
perfixOverrides :取出整体字符串前面多余的字符串。
suffix:为整体添加一个后缀。
suffixOverrides :后面哪个多了可以去掉。
遍历集合
collection="":指定要遍历的集合的key
separator =”“ :每次遍历的元素的分隔符
open="" : 以什么开始。
close ="" :以什么结束
item ="" :给每次遍历出的元素起一个变量名方便引用。
index ="" :索引。给索引起变量名。如果遍历的是一个list;index:指定的变量保存了当前的索引
如果遍历的是一个map;index:指定的遍历就是保存了当前遍历元素的key
<foreach collection ="ids" close=")" item="id_item" open="(" separator=",">
</foreach>
< choose >
< set >
以上是关于Day68的主要内容,如果未能解决你的问题,请参考以下文章