mybatis总结1

来源:互联网 发布:java服务器用linux 编辑:程序博客网 时间:2024/06/15 23:10

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的表达式为真则进入这个whenwhen中的语句拼接到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' =字符串

\"变量\" =字符串