Day68

Posted 五条人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day68相关的知识,希望对你有一定的参考价值。

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 :后面哪个多了可以去掉。

 

< foreach >

遍历集合

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的主要内容,如果未能解决你的问题,请参考以下文章

关于No migrations to apply.

day 68 django 之api操作

Day68:COOKIE与SESSION

day06-jsp

《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件