SQL映射文件详解

SQL映射文件是什么?

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

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

  •  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可以相同。

MyBatis框架内建的部分别名与Java数据类型的映射关系
别名映射的类型别名映射的类型
booleanBooleanstringString
byteBytebigdecimal或decimalBigDecimal
longLongdateDate
shortShortmapMap
int或integerShorthashmapHashMap
doubleDoublelistList
floatFloatarraylistArrayList

条件查询有两个:单一条件查询(单一很简单没有什么说的)、多条件查询

实现多条件查询:

 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实例。

resultMap元素包含以下子元素: 

  • id:指定和数据表主键字段对应的标识属性。设置此项可以提升MyBatis框架的性能,特别是应用缓存和嵌套结果映射的时候。
  • result:指定结果集字段和实体类属性的映射关系。 
嵌套结果映射: 

1、association元素

  • 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中的属性名一致,该列才可以映射成功。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值