SQL映射文详解

SQL映射xml文件是所有sql语句放置的地方,不同于JDBC连接的方法,需要构造方法,写statement和resultset语句才可以调用指定的sql语句,只需要把所有的sql语句写在配置文件中,根据不同的id,可以在类中直接调用这些语句。 文件需要定义一个workspace,一般定义为对应的接口类的路径。 Note:写好的SQL映射文件,需要在Mybatis主配置文件标签mapper中引用。
 

SQL映射文件中的几个顶级元素介绍:

resultMap元素包含以下子元素: 

嵌套结果映射: 

1、association元素

  •  mapper:SQL映射文件的根元素。只有一个属性namespace,用于区分不同的mapper,必须全局唯一。
  • cache:为给定命名空间配置缓存。
  • cache-ref:引用其他命名空间中的缓存配置。
  • resultMap:用来描述查询结果集中的字段和Java实体类属性的对应关系。
  • sql:定义可重用的SQL语句块,可以在其他语句映射中引用,提高编写和维护SQL语句的效率。
  • insert:映射insert语句。
  • update:映射update语句。
  • delete:映射delete语句。
  • select:映射select语句
  •  需要注意:

    Mybatis框架支持面向接口的SQL映射编程,这种情况下,SQL映射文件的开发需要注意以下规则:

  • 习惯上,SQL映射文件与该Mapper接口同名(实体类名+Mapper),并放置在同一包路径下。

  • 以要映射的Mapper接口的完全限定名(即包含包名的完整名称)作为namespace属性的值。

  • 接口中的方法名与映射文件中SQL语句映射的 ID 一一对应。MyBatis框架通过

  • namespace+ID确定和接口方法绑定的SQL语句。

  • 在不同的SQL映射文件中,子元素的ID可以相同

  • 实现多条件查询:

     1、将查询条件封装成Java对象作为入参

  • //示例
     
    //Mapper接口
    public interface sysUserMapper {
    	public List<SysUser> getUserByPojo(SysUser user);
    }
     
    //xml文件
    <select id="getUserByPojo" resultType="cn.mybatis.pojo.SysUser">
            select * from t_sys_user where realName like concat('%',#{realName},'%')
                and roleId = #{roleId}
    </select>
     
    //测试类
     
    @Test
        public void getUserByPojo(){
            SysUser u = new SysUser();
            u.setRealName("刘");
            u.setRoleId(1);
            List<SysUser> list = sqlSession.getMapper(sysUserMapper.class).getUserByPojo(u);
            for (SysUser user:list) {
                System.out.println(user.getId()+"\t"+user.getRealName());
            }
            MyBatisUtil.closeSqlSession(sqlSession);
        }

    2、将查询条件封装成Map对象作为入参

  • //示例
     
    //Mapper接口
    public List<SysUser> getUserByMap(Map<String ,Object> map);
     
    //xml文件
    <select id="getUserByMap" resultType="cn.mybatis.pojo.SysUser" parameterType="map">
            select * from t_sys_user where realName like concat('%',#{rname},'%')
                                       and roleId = #{rid}
    </select>
     
    //测试类
    @Test
        public void getUserByMap(){
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("rname","刘");
            map.put("rid","1");
            List<SysUser> list = sqlSession.getMapper(sysUserMapper.class).getUserByMap(map);
            for (SysUser user:list) {
                System.out.println(user.getId()+"\t"+user.getRealName());
            }
            MyBatisUtil.closeSqlSession(sqlSession);
        }

    3、使用@Param注解实现多参数入参

  • //示例
     
    //根据用户ID和角色的enabled状态获取用户角色
    //@param userId
    //@param enabled
    //@return
     
    List<SysRole> selectRolesByUserIdAndRoleEnabled(
    		@Param("userId")Long userId,
    		@Param("enabled")Integer enabled);
     
    //xml文件
    <select id="selectRolesByUserIdAndRoleEnabled" resultType="SysRole">
    	select
    		r.id,
    		r.role_name roleName,
    		r.enabled,
    		r.create_by createBy,
    		r.create_time createTime
    	from sys_user u
    	inner join sys_user_role ur on u.id = ur.user_id
    	inner join sys_role r on ur.role_id = r.id
    	where u.id = #{userId} and r.enabled = #{enabled}
    </select>
     
    //测试类
     
    @Test
    public void testSelectRolesByUserIdAndRoleEnabled(){
    	SqlSession sqlSession = getSqlSession();
    	try{
    		UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
    		List<SysRole> userList = usermapper.selectRolesByUserIdAndRoleEnabled(1l, 1);
    	} finally{
    		sqlSession.close();
    	}
    }

    使用resultMap元素自定义结果映射:

    //示例
     
    //Mapper接口
    public List<SysUser> getUserListWithRoleName(SysUser sysUser);
     
    //xml文件
    //使用resultMap元素定义结果映射
    <resultMap id="userWithRoleName" type="sysuser">
        <id property="id" column="id">
        <result property="userRoleName" column="roleName"/>
    </resultMap>
     
    //resultMap元素定义的规则封装查询结果
    <select id="getUserListWithRoleName" parameterType="sysuser" resultMap="userWithRoleName">
        select u.*,r.roleName from t_sys_user u,t_sys_role r
        where u.realName like CONCAT ('%',#{realName},'%')
        and u.roleId = #{roleId} and u.roleId = r.id
    </select>

    select元素通过resultMap属性引用resultMap元素定义的映射规则:

    resultMap元素包含以下属性:

  • id:映射规则集的唯一标识,可以被select元素的resultMap属性引用。
  • type:映射的结果类型,这里指定封装成SysUser实例。
  • id:指定和数据表主键字段对应的标识属性。设置此项可以提升MyBatis框架的性能,特别是应用缓存和嵌套结果映射的时候。
  • result:指定结果集字段和实体类属性的映射关系。 
  • association属性
    • resultMap:外部引用 值为id值
    • property:为你在这个类创建的类对象名称
    • javaType:为完整java类名或者别名
  • 子元素
    • id:一般用于主键
    • result元素属性
      • property :属性名
      • column:数据库列名或者别名
      • <!--方法一 未使用resultMap  -->
        	<resultMap type="Bill" id="billListInProvider">
         		<id property="id" column="id"/>
         		<association property="provider" javaType="Provider">
         			<id property="id" column="p_id"/>
         			<result property="proCode" column="proCode"/>
         			<result property="proName" column="proName"/>
         			<result property="proContact" column="proContact"/>
         			<result property="proPhone" column="proPhone"/>
         		</association>
         	</resultMap>
         
        	<!--方法二 使用resultMap  -->
        	<resultMap type="User" id="userRoleResult">
        		<result property="id" column="id"/>
        		<result property="userCode" column="userCode"/>
        		<result property="userName" column="userName"/>
        		<result property="userRole" column="userRole"/>
        		<association property="role" javaType="Role" resultMap="aaaa" />
        	</resultMap>
        	
        	<resultMap type="Role" id="aaaa">
        		<result property="id" column="r_id"/>
        			<result property="roleCode" column="roleCode"/>
        			<result property="roleName" column="roleName"/>
        	</resultMap>

        2、collection元素

      • collection属性
        • resultMap:外部引用 值为id值
        • property:为这个类内的集合名称
        • ofType:完整的类名或别名,就是集合包含的类型
        • 子元素
        • id:一般用于主键
        • result元素属性
          • property :属性名
          • column:数据库列名或者别名
          • <!--方法一 未使用resultMap  -->
            	<resultMap type="Provider" id="providerAndAllBillList">
            		<id property="id" column="p_id"/>
            		<collection property="billList" ofType="Bill">
            			<id property="id" column="id"/>
            			<result property="productName" column="productName"/>
            		</collection>
            	</resultMap>
             
             
             
            	<!--方法二 使用resultMap  -->
            	<resultMap type="Provider" id="providerAndAllBillList">
            		<id property="id" column="p_id"/>
            		<collection property="billList" ofType="Bill" resultMap="billResult"/>
            	</resultMap>
            	<resultMap type="Bill" id="billResult">
            		<id property="id" column="id"/>
            		<result property="productName" column="productName"/>
            	</resultMap>

            resultType和resultMap小结:

          • resultmapresultMap如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
          • resultTyperesultType使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值