8. Mybatis
<delete id="deleteStudentById" >
<!--
#{id} 当参数对象为基本数据格式的时候#{}中可以填写任意的内容来获取参数数据例如#{xxx}
基本数据格式,数字 字符串,日期等非实体类非集合的非数组的数据类型
-->
delete from t_student where id=#{ty} </delete>
9.<!--
select 标签 用于执行数据库查询的
属性
resultType或resultMap 二选一 必须拥有其中的一个,用于通知MyBatis将查询结果封装到什么样的对象中
resultType 表示结果类型,它使用MyBatis的默认封装规则将查询结果封装到指定的对象中,
这个封装规则是,将显示列名所对应的数据封装到resultType所指定的这个对象中与这个显示列名同名的属性中
-->
<select id="selectStudentById" resultType="com.bjpowernode.domain.Student">
select * from t_student where id=#{id}
</select>
<!--
注意
无论是resultType还是resultMap都表示的是查询结果中的一条记录的封装对象,
如果调用selectList方法那么resultType或resultMap就表示集合中的泛型对象
-->
12.使用Mapper动态代理优化MyBatis
步骤
1.删除dao实现类以及对应的包
2.修改SQL映射文件的namespace必须与接口的全限定名相同,SQL映射的id必须与接口的方法名完全相同
3.使用SqlSession对象中的getMapper(Class cla) 方法获取接口对应的动态代理对象,参数为接口的Classs
这时调用接口中的方法即可自动执行SQL语句
注意:
1.使用Mapper动态代理以后,MyBatis在执行查询时会调用selectList和selectOne方法,如果方法的返回值为List集合则调用selectList方法否则调用selectOne方法
2.SQL映射的数据封装对象resultType或resultMap的内容必须语句接口的返回值类型相同,或与List集合中的泛型相同
3.在执行更新操作时,接口的方法的返回值只能是void 或整数表示影响的记录条数
4. Dao接口中的方法不能重载,因为每个方法需要对应一个SQL映射id
13.<!--
where 动态SQL
如果where 标签中拥有内容 那么将会在SQL语句的当前位置添加一个where 关键字,并将标签中的内容追加语句中的where关键字的后面,
并自动 删除紧挨着where的and 或or 关键字
-->
15.<!--
foreach 动态SQL 循环
属性
collection 需要被迭代的数组或List集合,如果参数对象为数组则填写array ,如果参数对象为List集合则填写list
如果参数对象为实体类或Map集合时则填写实体类中的属性名 或Map集合的key,但注意这个属性或key对应的数据必须是数组或List集合
item 为被迭代的数组或List集合中的当前元素对象,这个属性值可以直接通过#{}直接获取元素的数据,拼接到SQL中,
如果这个元素为实体类或Map集合使用语法#{obj.属性名}或#{obj.key}获取对应的数据追加到SQL中
如果这个元素为数组或List集合时继续使用foreach进行嵌套循环
item属性的取值内容为 任意内容
open 迭代时的开始标记字符,这个内容只能出现1次,内容任意填写,该属性为可选属性
close 迭代时的结束标记字符,这个内容只能出现1次,内容任意填写,该属性为可选属性
separator 多个元素的分割字符 ,这个内容将出现多次,内容任意填写,该属性为可选属性
-->
<foreach collection="list" item="obj" open="(" close=")" separator=",">
#{obj}
</foreach>
***
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.dao.StudentDao">
<!-- sql 动态SQL ,
SQL语句的片段,这个片段可以是SQL语句的任何一个部分,这个SQL片段不能够独立运行,必须被某个SQL映射标签利用include子标签引入
属性
id 这个SQL片段的唯一标识 ,内容任意填写, 但不能重复
注意:SQL语句提取抽象时,不要过分的抽象例如不要将单独的select 放到单独的sql片段中
-->
<sql id="searchStudentWhere">
<where>
<if test="name!=null and name.trim!=''">
and name like '%' #{name} '%'
</if>
<if test="startAge!=null and startAge>18">
and age>#{startAge}
</if>
<if test="endAge!=null and 60>endAge">
and #{endAge}>age
</if>
</where>
</sql>
<select id="searchStudent" resultType="stu">
select * from t_student
<include refid="searchStudentWhere"/>
</select>
</mapper>
***
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.dao.StudentDao">
<select id="searchStudent" resultType="stu">
select * from t_student
<where>
<!--
choose 动态SQL 选择标签类似Java中的 swtich...case...default语句块
-->
<choose>
<!-- when 条件表达式,当属性test的表达式为真则进入这个when将when中的语句拼接到SQL语句的当前位置,然后直接跳出choose其他的when将不再执行 -->
<when test="name!=null and name.trim!=''">
and name like '%' #{name} '%'
</when>
<when test="startAge!=null and startAge>18">
and age>#{startAge}
</when>
<when test="endAge!=null and 60>endAge">
and #{endAge}>age
</when>
<!--otherwise 当所有的when都为假的时候将otherwise中的语句拼接到SQL语句的当前位置 -->
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
</mapper>
-->字符串拼接注意事项
'+obj.id+'= 变量
'obj.id' =字符串
\"变量\" =字符串