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可以相同。
别名 | 映射的类型 | 别名 | 映射的类型 |
boolean | Boolean | string | String |
byte | Byte | bigdecimal或decimal | BigDecimal |
long | Long | date | Date |
short | Short | map | Map |
int或integer | Short | hashmap | HashMap |
double | Double | list | List |
float | Float | arraylist | ArrayList |
条件查询有两个:单一条件查询(单一很简单没有什么说的)、多条件查询
实现多条件查询:
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小结:
- resultmap:resultMap如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
- resultType:resultType使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。