当前位置:主页 > 软件编程 > JAVA代码 >

Mybatis核心组成部分之SQL映射文件揭秘详解

时间:2020-10-09 22:42:02 | 栏目:JAVA代码 | 点击:

前言

Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。

相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲了Mybatis的搭建以及核心配置的讲解,接下来咱们就一起来看看Mybatis另一个重要的元素-SQL映射文件

首先先介绍一下SQL映射文件的几个顶级元素配置

顶级元素配置

1、Mapper:映射文件的根元素节点,只有一个属性namespace(命名空间),其作用如下

2、cache:配置给定命名空间引用缓存。

3、cache-ref:从其他命名空间引用缓存配置

4、resultMap:用来描述数据库结果集和对象的对象关系(键值对)

5、sql:可以重用的sql块,也可以被其他语句引用。

6、insert:映射插入的语句

7、update:映射更新的语句

8、delete:映射删除的语句

9、select:映射查询的语句

接下来我就逐一的为大家介绍

select:映射查询语句

<!--根据用户名称查询用户列表(模糊查询)-->
<select id="getUserListByUserName" resultType="User" parameterType="string">
select * from user_info where userName like CONCAT('%',#{userName},'%')
</select>

上面这段代码是一个id为getUserListByUserName的映射语句,参数类型为string,返回结果的类型是User,注意参数的传递使用#{参数名},它告诉Mybatis生成PreparedStatement参数,对于JDBC,该参数会被标识为“?”,若采用JDBC来实现,那代码就得换一下方式了

String sql="select * from user_info where userName like CONCAT('%',?,'%')";
PreparedStatement ps=conn.preparedStatement(sql);
ps.setString(1,userName);

从上面两端代码我相信大家都能看出区别,Mybatis节省了大量的代码,我相信大家会喜欢上它的
接下来我来介绍一下select映射语句中的家庭成员吧!

接下来我就用一个实例来向大家演示一下

首先我弄了一个以用户名、用户角色来查询用户列表的功能,咱们先创建UserMapper.java文件

public interface UserMapper {
public List<User> getUserList(Map<String,String> userMap);
}

从上面大家可以看到我用来一个集合来接受返回的结果集,并且传递的参数是一个user对象

下面再来编写UserMapper.xml文件的主体内容

<!--查询用户列表(参数:对象入参)-->
<select id="getUserList" resultType="user" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole=#{userRole} and u.userRole=r.id
</select>

上面便是咱们此次测试的查询映射语句了,这和我在上面说的映射语句区别不大,唯一大点的区别就在于参数类型,这的参数类型我换成了一个Map集合。

接下来就可以去测试了。

@Test
public void getUserList(){
SqlSession sqlSession=null;
List<User> userList=new ArrayList<User>();
try{
sqlSession=MyBatisUtil.createSqlSession();
Map<String,String> userMap=new HashMap<String,String>();
userMap.put("uName","赵");
userMap.put("uRole","3");
userList=sqlSession.getMapper(UserMapper.class).getUserListMap(userMap);
}catch(Exception e){
e.printStackTrace();
}finally{
MyBatisUtil,closeSqlSession(sqlSession);
}
for(User user:userList){
logger.debug("testGetUserList userCode:"+user.getUserCode()+"and userName:"+user.getUserName());
}
}

resultMap

接下来说说resultMap,我们为什么要用resultMap呢?

用小编的话说:当我们要使用的查询映射语句是需要关联多表的时候,那么一个实体类的字段就不够用了,比如User表中有一个部门ID,而部门ID又对应了部门表,我们想查询部门名称而不是查询部门ID,这时候我们就要在User实体类中加入一个部门名称属性,且该属性的类型为部门实体类,

到这我们就需要使用resultMap了

<select id="getUserList" resultMap="user" parameterType="Map">
select u.*,r.roleName from smbms_user u,smbms_role r
where u.userName like CONCAT('%',#{userName},'%')
and u.userRole=#{userRole} and u.userRole=r.id
</select>

<resultMap id="userList" type="User">
<result property="userRole" column="roleName"/>
</resultMap> 

resultMap元素用来描述如何将结果集映射到java对象,此处使用resultMap对列表展示所需的必要字段来进行自由映射。接下来看看resultMap元素的属性值和子节点吧

Mybatis中对查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,那么resultType和resultMap到底有何关联呢?接下里小编就做一下详细的讲解

resultType

resultType直接表示返回类型,包括基础数据库类型和复杂数据类型

resultMap

resultMap则是对外部resultMap定义的引用,对外部resultMap的ID,表示返回结果映射到哪一个resultMap上,它的应用场景一般是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果。

resultType与resultMap的关联

在Mybatis的select元素中,resultType和resultMap本质上是一样的,都是Map数据结构,但需要明确的一点:resultType属性和resultMap属性绝对不能同时存在,只能二者选其一。

接下来说说使用Mybatis实现增删改的操作,其实这几个操作都大同小异(小编认为的)。

insert

<insert id="add" parameterType="User">
INSERT INTO `smbms`.`smbms_user`(`userCode`, `userName`, `userPassword`, `gender`, `birthday`, `phone`, `address`, `userRole`, `createdBy`, `creationDate`)
VALUES (#{userCode}, #{userName}, #{userPassword}, #{gender}, #{birthday}, #{phone}, #{address}, #{userRole}, #{createdBy}, #{creationDate})
</insert>

update

<update id="modify" parameterType="User">
update smbms_user set userCode=#{userCode} where id=#{uId}
</update>

delete

<delete id="del" parameterType="User">
delete from smbms_user where id=#{id}
</delete>

从上面的操作中可以看出其实这三种操作都差不多,其中的属性也都见过哈!那么小编在这就不多做介绍了,上面我所说的都是SQL映射文件最基础的一些东西,后面还有动态SQL之类的我在这就不做介绍了,感兴趣的童鞋可以去查查(我觉得阔以)

您可能感兴趣的文章:

相关文章