<?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="org.aptech.myBatisDemo2.dao.SubjectDao">
<!-- mybatis缓存处理
什么是缓存呢? 就是把查到的数据放到内存里面,下次用的时候就不许要在去查询了
在映射文件中只需要加一个cache标签就可以实现缓存,
缓存主要是用于查询语句,mybatis中的这个缓存是在执行增删改是会刷新数据,把没有的数据踢出去
-->
<cache></cache>
<!--高级结果映射,也称为关联关系映射
多对一:1.单独发送一条查询语句
resultMap,意思是告诉你怎么映射的,不能使用resultType了
2.发送链表语句查询
-->
<!--下面ID的值和 resultMap中的值要一样-->
<!-- 除了id需要单独映射其他列也可以使用autoMapping="true"属性设置,意思是如果属性名
和列名一样自动映射上
-->
<resultMap type="Subject" id="subjectMap2" autoMapping="true">
<!-- 主键要单独映射 -->
<id column="id" property="id"/>
<!--多对一的关联关系映射:发送单独的select语句 -->
<!--property 填写关联的属性名
javaType 告诉上面property是什么类型的
column 把那列的值带回去单独查询
select 是你要调那一条查询语句呢? 上面不是有一个getById查询单个的方法吗,把接口名和方法名都写上,这里写的接口地址是一方的
-->
<association property="user" javaType="User" column="user_id" select="org.aptech.myBatisDemo2.dao.UserDao.getById"></association>
</resultMap>
<select id="getById2" parameterType="int" resultMap="subjectMap2">
select * from tbl_subject where id = #{id}
</select>
<!--多对一的关联关系映射:发送链表语句查询
因为subject的ID和user的ID相同所以给user的ID起了个别名 UID,一会映射好操作
-->
<resultMap type="Subject" id="subjectMap3" autoMapping="true">
<id column="id" property="id"/>
<!-- 多对一关联关系配置的第二中方式 -->
<association property="user" javaType="User">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="email" property="email"/>
</association>
</resultMap>
<select id="getById3" parameterType="int" resultMap="subjectMap3">
select s.*,u.id as uid,u.username,u.email from tbl_subject s
inner join tbl_user u
on
s.user_id = u.id
where s.id = #{id}
</select>
<!-- 一对多关联关系映射 ,第一种方式:发送单独的select -->
<resultMap type="Subject" id="subjectMap4" autoMapping="true">
<id column="id" property="id" />
<!-- 一对多关联关系映射 -->
<!-- 一对多使用的是collection这个标签
property="options" 那个属性是一对多,
javaType="List" 告诉你是什么类型
ofType="Option" 集合里面装的什么
column="id" 带着那个值过去查,这里是带着主键ID
select="org.aptech.myBatisDemo2.dao.OptionDao.getOptionBySid" 里面得写接口的包名,接口名,方法名。。。 这个是,把值传过去了执行那个方法!
-->
<collection property="options" javaType="List" ofType="Option" column="id" select="org.aptech.myBatisDemo2.dao.OptionDao.getOptionBySid">
</collection>
</resultMap>
<!-- 查询单条语句 -->
<select id="getById4" parameterType="int" resultMap="subjectMap4">
select * from tbl_subject where id = #{id}
</select>
<!-- 一对多关联关系映射 ,第二种方式:连表查询 -->
<resultMap type="Subject" id="subjectMap5" autoMapping="true">
<id column="id" property="id"/>
<!-- 多对一关联关系配置的第二中方式 -->
<association property="user" javaType="User">额搜C A审
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="email" property="email"/>
</association>
<!-- 一对多链表使用的标签, -->
<collection property="options" javaType="List" ofType="Option">
<id column="oid" property="id"/>
<result column="opt" property="opt"/>
<result column="disOrder" property="disOrder"/>
</collection>
</resultMap>
<!-- 一方连接多方一般使用的都是外链接,为的就是这个表中没有另一个表的数据怎么办 -->
<select id="getById5" parameterType="int" resultMap="subjectMap5">
select s.*,u.id as uid,u.username,u.email,o.id as oid,o.opt,o.disOrder from tbl_subject s
inner join tbl_user u on s.user_id = u.id
left join tbl_option o on o.subject_id = s.id
where s.id = #{id}
</select>
<!-- 一对多关联关系映射,测设延迟加载,
延迟加载需要一个全局的开关需要配置,在mybatis-config.xml 总文件中配置,
-->
<resultMap type="Subject" id="subjectMap" autoMapping="true">
<id column="id" property="id" />
<!-- 多对一关联关系配置的第二中方式 -->
<!-- fetchType="eager" 这个是表示不延迟,立即加载出数据,
fetchType="lazy" 这个是表示延迟
报错有红线不用管,不影响执行
-->
<association fetchType="eager" property="user" javaType="User" column="user_id" select="org.aptech.myBatisDemo2.dao.UserDao.getById"></association>
<!-- 一对多关联关系映射 -->
<!-- 一对多使用的是collection这个标签
property="options" 那个属性是一对多,
javaType="List" 告诉你是什么类型
ofType="Option" 集合里面装的什么
column="id" 带着那个值过去查,这里是带着主键ID
select="org.aptech.myBatisDemo2.dao.OptionDao.getOptionBySid" 里面得写接口的包名,接口名,方法名。。。 这个是,把值传过去了执行那个方法!
-->
<collection property="options" javaType="List" ofType="Option" column="id" select="org.aptech.myBatisDemo2.dao.OptionDao.getOptionBySid">
</collection>
</resultMap>
<!-- 查询单条语句 -->
<select id="getById" parameterType="int" resultMap="subjectMap">
select * from tbl_subject where id = #{id}
</select>
<!-- 构造查询条件,这样解决了代码复用 -->
<sql id="conditionSql">
<where>
<!-- concat('%'#{condition.title}'%') 是mysql数据库中的一个函数,其他数据库可能有其他的函数可以上网上查询,使用来拼接字符串的 -->
<if test="condition.title != null and condition.title !=''">
and title like concat('%',#{condition.title},'%')
</if>
<if test="condition.user != null and condition.user.id != null and condition.user.id != -1">
and user_id = #{condition.user.id}
</if>
</where>
</sql>
<!-- 按条件查询 -->
<select id="getConditionList" parameterType="Subject" resultMap="subjectMap">
select * from tbl_subject
<!-- 引用sql标签的代码需要使用 include标签 -->
<include refid="conditionSql"/>
</select>
<!-- 按条件分页检索数据 -->
<select id="getPageList" resultMap="subjectMap">
select * from tbl_subject
<!-- 引用sql标签的代码需要使用 include标签 -->
<include refid="conditionSql"/>
limit #{start},#{pageSize}
</select>
<!-- 按条件查询条数 -->
<select id="getPageCount" parameterType="Subject" resultType="int">
select count(1) from tbl_subject
<include refid="conditionSql"/>
</select>
<!-- 批量删除数据
parameterType="java.lang.reflect.Array" 因为是数组类型需要把数组命名空间引用过来
-->
<delete id="batchDelete" parameterType="java.lang.reflect.Array">
delete from tbl_subject
where id in
<!-- item 代表的是每取出一个所叫的名字
open="(" 是以谁开始
close=")" 是以谁结束
separator="," 以什么隔开呢
-->
<foreach collection="ids" item="id" open="(" close=")" separator=",">
<!-- 通过上面一个个的判断,下面的 #{id}最后会拼接成(id,id,id) -->
#{id}
</foreach>
</delete>
</mapper>