Mybatis 真正强大的地方在于 SQL 映射语句, 这也是它的魅力所在. 相对于它强大的功能, SQL 映射文件的配置却非常简单, 我上篇文章语句讲了 Mybatis 的搭建以及核心配置的讲解, 接下来咱们就一起来看看 Mybatis 另一个重要的元素 - SQL 映射文件
首先先介绍一下 SQL 映射文件的几个顶级元素配置
顶级元素配置
Mapper: 映射文件的根元素节点, 只有一个属性 namespace(命名空间), 其作用如下
用于区分不同的 mapper, 全局唯一
绑定 DAO 接口, 即面向接口编程. 当 namespace 绑定某一接口之后, 就可以不用写该接口的实现类, Mybatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句. 因此 namespace 的命名必须要跟接口名同名
cache: 配置给定命名空间引用缓存.
cache-ref: 从其他命名空间引用缓存配置
resultMap: 用来描述数据库结果集和对象的对象关系 (键值对)
sql: 可以重用的 sql 块, 也可以被其他语句引用.
insert: 映射插入的语句
update: 映射更新的语句
delete: 映射删除的语句
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 映射语句中的家庭成员吧!
id: 命名空间中唯一的标识符, 可以被用来引用这条语句
parameter: 表示查询语句传递参数的类型的完全限定名或别名. 它支持基础数据类型和复杂数据类型, 就比如咱们上面用到的 string 就是一个基础数据类型, 当然你会发现这的 string 的 s 是小写, 其实它只是一个别名, 还是代表 String, 只不过它属于一个内建的类型别名, 那么以此类推, 对于普通的 Java 类型, 也有许多的内建类型别名, 并且它们对大小写不明感, 介意大家去阅读以下 Mybatis 的帮助文档.
resultType: 查询语句返回结果类型的完全限定名或别名, 别名的使用方式与 parameterType 的使用方式是一致的
接下来我就用一个实例来向大家演示一下
首先我弄了一个以用户名, 用户角色来查询用户列表的功能, 咱们先创建 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 元素的属性值和子节点吧
id 属性: 唯一标识符, 此 id 值用于 select 元素 resultMap 属性的引用
type 属性: 表示该 result 的映射结果类型
result 子节点: 用于标识一些简单属性, 其中 column 属性表示从数据库中查询的字段名, property 则表示查询出来的字段对应的值赋给实体对象的哪个属性.
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 之类的我在这就不做介绍了, 感兴趣的童鞋可以去查查 (我觉得阔以),ok, 以上就是本章所介绍的, 感谢大家的观赏!
来源: https://www.cnblogs.com/MagicLoser/p/9927822.html