mybatis动态sql,关联关系,模糊查询操作语法


<?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>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Male晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值