MyBatis-02 MyBatis XML方式概述及配置步骤
- 概述
- 一個簡單的權限控制需求
- 創建數據庫表
- 創建實體類
- XML方式概述及步驟
- 1. 首先在src/main/resources下com.artisan.mybatis.xml.mapper目錄下創建5個表各自對應的XML文件
- 2. 然后在src/main/java先創建包com.artisan.mybatis.xml.mapper,接著在該包下面創建XML文件對應的接口類
- 3. Mapper.xml 如何編寫,我們在 MyBatis-01 MyBatis入門篇中已經簡單介紹過了,下面我們以用戶表對應的Mapper接口 UserMapper.java為例來演示下接口的編寫
- 4. 打開UserMapper.xml 文件,輸入如下內容
- 5.準備好這幾個XML映射文件后,需要在 MyBatis全局配置文件中的mapper元素配置所有的mapper
概述
我們通過一個簡單的權限控制需求,采用RBAC(Role-Based Access Control基于角色的訪問控制)方式,通過這個示例我們來學習 MyBatis XML方式的基本用法。
一個簡單的權限控制需求
需求: 一個用戶擁有若干角色,一個角色擁有若干權限。 權限就是對摸個資源或者模塊的某種操作(CRUD). 這樣就構成了“用戶-角色-權限”的授權模型。
在這種模型中,用戶與角色、角色與權限,一般都是多對多的關系
我們先來看下數據模型
創建數據庫表
5張表,創建在mysql數據庫中。
-- ---------------------------- -- Table structure for sys_privilege -- ---------------------------- DROP TABLE IF EXISTS `sys_privilege`; CREATE TABLE `sys_privilege` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '權限ID',`privilege_name` varchar(50) DEFAULT NULL COMMENT '權限名稱',`privilege_url` varchar(200) DEFAULT NULL COMMENT '權限URL',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='權限表';-- ---------------------------- -- Records of sys_privilege -- ---------------------------- INSERT INTO `sys_privilege` VALUES ('1', '用戶管理', '/users'); INSERT INTO `sys_privilege` VALUES ('2', '角色管理', '/roles'); INSERT INTO `sys_privilege` VALUES ('3', '系統日志', '/logs'); INSERT INTO `sys_privilege` VALUES ('4', '人員維護', '/persons'); INSERT INTO `sys_privilege` VALUES ('5', '單位維護', '/companies');-- ---------------------------- -- Table structure for sys_role -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID',`role_name` varchar(50) DEFAULT NULL COMMENT '角色名',`enabled` int(11) DEFAULT NULL COMMENT '有效標志',`create_by` bigint(20) DEFAULT NULL COMMENT '創建人',`create_time` datetime DEFAULT NULL COMMENT '創建時間',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='角色表';-- ---------------------------- -- Records of sys_role -- ---------------------------- INSERT INTO `sys_role` VALUES ('1', '管理員', '1', '1', SYSDATE()); INSERT INTO `sys_role` VALUES ('2', '普通用戶', '1', '1', SYSDATE());-- ---------------------------- -- Table structure for sys_role_privilege -- ---------------------------- DROP TABLE IF EXISTS `sys_role_privilege`; CREATE TABLE `sys_role_privilege` (`role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',`privilege_id` bigint(20) DEFAULT NULL COMMENT '權限ID' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色權限關聯表';為了方便對表進行直接操作,此處沒有創建表之間的外鍵關系。 對于表之間的關系,會通過業務邏輯來進行限制-- ---------------------------- -- Records of sys_role_privilege -- ---------------------------- INSERT INTO `sys_role_privilege` VALUES ('1', '1'); INSERT INTO `sys_role_privilege` VALUES ('1', '3'); INSERT INTO `sys_role_privilege` VALUES ('1', '2'); INSERT INTO `sys_role_privilege` VALUES ('2', '4'); INSERT INTO `sys_role_privilege` VALUES ('2', '5');-- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',`user_name` varchar(50) DEFAULT NULL COMMENT '用戶名',`user_password` varchar(50) DEFAULT NULL COMMENT '密碼',`user_email` varchar(50) DEFAULT 'test@artisan.com' COMMENT '郵箱',`user_info` text COMMENT '簡介',`head_img` blob COMMENT '頭像',`create_time` datetime DEFAULT NULL COMMENT '創建時間',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1035 DEFAULT CHARSET=utf8 COMMENT='用戶表';-- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES ('1', 'admin', '123456', 'admin@artisan.com', '管理員用戶', 0x1231231230, SYSDATE()); INSERT INTO `sys_user` VALUES ('1001', 'test', '123456', 'test@artisan.com', '測試用戶', 0x1231231230, SYSDATE()); -- ---------------------------- -- Table structure for sys_user_role -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` (`user_id` bigint(20) DEFAULT NULL COMMENT '用戶ID',`role_id` bigint(20) DEFAULT NULL COMMENT '角色ID' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶角色關聯表';為了方便對表進行直接操作,此處沒有創建表之間的外鍵關系。 對于表之間的關系,會通過業務邏輯來進行限制-- ---------------------------- -- Records of sys_user_role -- ---------------------------- INSERT INTO `sys_user_role` VALUES ('1', '1'); INSERT INTO `sys_user_role` VALUES ('1', '2'); INSERT INTO `sys_user_role` VALUES ('1001', '2');創建實體類
MyBatis默認遵循“下面線轉駝峰”命名方式的規則,所以在創建實體類時一般都按照這種方式進行創建。
首先看下用戶表對應的實體類SysUser的代碼
package com.artisan.mybatis.xml.domain;import java.io.Serializable; import java.util.Arrays; import java.util.Date; import java.util.List;/*** * * @ClassName: SysUser* * @Description: 用戶表* * @author: Mr.Yang* * @date: 2018年4月13日 下午9:24:21*/ public class SysUser implements Serializable {private static final long serialVersionUID = 5736486618394472355L;/*** 用戶ID*/private Long id;/*** 用戶名*/private String userName;/*** 密碼*/private String userPassword;/*** 郵箱*/private String userEmail;/*** 簡介*/private String userInfo;/*** 頭像*/private byte[] headImg;/*** 創建時間*/private Date createTime;/*** 用戶角色*/private SysRole sysRole;/*** 用戶的角色集合*/private List<SysRole> roleList;// 省略setter和getter方法@Overridepublic String toString() {return "SysUser [id=" + id + ", userName=" + userName + ", userPassword=" + userPassword + ", userEmail=" + userEmail + ", userInfo=" + userInfo + ", headImg=" + Arrays.toString(headImg)+ ", createTime=" + createTime + "]";}}對于SysUser實體類,首先需要注意的是命名方式,它的類名和屬性名都采用了“下面線轉駝峰”方式。 具體采用什么樣的命名方式并不重要(方式一致即可)。 在后面使用這些對象的時候,可以通過resultMap對數據庫中的列和類的字段配置映射關系
在 MyBatis中,關于數據庫字段和Java類型的對應關系,不需要可以的去記,但需要注意的一個特殊的類型,byte[] ,這個類型一般對應數據庫中的BLOB、LONGVARBINARY以及一些二進制流相關的字段類型
注意: 由于Java中的基本類型會有默認值,例如當某個類中存在private int age字段時,創建這個類時,age會有個默認值0。 當使用age屬性時,它總會有值。 因此在某些情況下,便無法實現age為null . 并且在動態SQL的部分,如果使用age !=null 進行判斷,結果總會為true,因而會導致很多隱藏的問題。
所以在實體類中不要使用基本類型。 基本類型包括:byte、int、short、long、float、double、char、boolean
SysRole
package com.artisan.mybatis.xml.domain;import java.io.Serializable; import java.util.Date; import java.util.List;/*** * * @ClassName: SysRole* * @Description: 角色表* * @author: Mr.Yang* * @date: 2018年4月13日 下午9:29:31*/ public class SysRole implements Serializable {private static final long serialVersionUID = 6320941908222932112L;/*** 角色ID*/private Long id;/*** 角色名*/private String roleName;/*** 有效標志*/private Integer enabled;/*** 創建人*/private String createBy;/*** 創建時間*/private Date createTime;/*** 用戶信息*/private SysUser user;/*** 角色包含的權限列表*/List<SysPrivilege> privilegeList;// 省略setter和getter@Overridepublic String toString() {return "SysRole [id=" + id + ", roleName=" + roleName + ", enabled=" + enabled + ", createBy=" + createBy + ", createTime=" + createTime + ", user=" + user + ", privilegeList="+ privilegeList + "]";}}SysUserRole
package com.artisan.mybatis.xml.domain;/*** * * @ClassName: SysUserRole* * @Description: 用戶角色關聯表* * @author: Mr.Yang* * @date: 2018年4月13日 下午9:44:31*/ public class SysUserRole {/*** 用戶ID*/private Long userId;/*** 角色ID*/private Long roleId;// 省略setter和getter@Overridepublic String toString() {return "SysUserRole [userId=" + userId + ", roleId=" + roleId + "]";}}SysPrivilege
package com.artisan.mybatis.xml.domain;import java.io.Serializable;/*** * * @ClassName: SysPrivilege* * @Description: 權限表* * @author: Mr.Yang* * @date: 2018年4月13日 下午9:45:15*/ public class SysPrivilege implements Serializable {private static final long serialVersionUID = 6315662516417216377L;/*** 權限ID*/private Long id;/*** 權限名稱*/private String privilegeName;/*** 權限URL*/private String privilegeUrl;// 省略setter和getter@Overridepublic String toString() {return "SysPrivilege [id=" + id + ", privilegeName=" + privilegeName + ", privilegeUrl=" + privilegeUrl + "]";}}SysRolePrivilege
package com.artisan.mybatis.xml.domain;/*** * * @ClassName: SysRolePrivilege* * @Description: 角色權限關聯表* * @author: Mr.Yang* * @date: 2018年4月13日 下午9:46:46*/ public class SysRolePrivilege {/*** 角色ID*/private Long roleId;/*** 權限ID*/private Long privilegeId;// 省略setter和getter@Overridepublic String toString() {return "SysRolePrivilege [roleId=" + roleId + ", privilegeId=" + privilegeId + "]";}}創建實體類的過程比較枯燥,后面可以通過 MyBatis官方提供的工具 MyBatis Generator( MyBatis代碼生成器,簡稱MBG)根據數據庫表的信息自動生成這些類,減少工作量。
XML方式概述及步驟
* MyBatis3.0比2.0一個最大的變化,就是支持使用接口來調用方法。*
以前使用SqlSession通過命名空間調用 MyBatis的方法時,首先需要用到命名空間和方法id組成的字符串來調用對應的方法。 當參數多于1個的時候,需要將參數放到一個Map對象中,通過Map傳遞多個參數,使用起來不方便,而且無法避免很多重復的代碼。
使用接口調用方式就會方便很多, MyBatis使用Java的動態代理可以直接通過接口來調用相應的方法,不需要提供接口的實現類,更不需要在實現類中使用SqlSession以命名空間間接調用。 另外,當有個多個參數的時候,通過參數注解@Parma設置參數的名字省去了手工構造Map參數的過程。 尤其在Spring中使用的時候 ,可以配置為自動掃描所有的接口類,直接將接口注入到需要用到的地方。
我們來看下如何使用 MyBatis的XML方式
1. 首先在src/main/resources下com.artisan.mybatis.xml.mapper目錄下創建5個表各自對應的XML文件
2. 然后在src/main/java先創建包com.artisan.mybatis.xml.mapper,接著在該包下面創建XML文件對應的接口類
3. Mapper.xml 如何編寫,我們在 MyBatis-01 MyBatis入門篇中已經簡單介紹過了,下面我們以用戶表對應的Mapper接口 UserMapper.java為例來演示下接口的編寫
package com.artisan.mybatis.xml.mapper;public interface UserMapper {}到目前為止,Mapper接口和對應的XML文件都是空的,后續逐步完善接口方法。
4. 打開UserMapper.xml 文件,輸入如下內容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><!-- 當Mapper接口和XML文件關聯的時候, namespace的值就需要配置成接口的全限定名稱 --> <mapper namespace="com.artisan.mybatis.xml.mapper.UserMapper"></mapper>需要注意的是mapper標簽的namespace屬性。 當Mapper接口和XML文件關聯的時候,命名空間namespace的值就需要配置成接口的全限定名稱。
比如UserMapper接口對應的com.artisan.mybatis.xml.mapper.UserMapper , Mybatis內部就是通過這個值將接口和XML關聯起來的。 具體原理后續分析。
按照相同的方式將其他4個Mapper.xml編寫完成
5.準備好這幾個XML映射文件后,需要在 MyBatis全局配置文件中的mapper元素配置所有的mapper
<!-- 逐一配置,比較繁瑣,容易遺漏,接口方式不推薦 --><mapper resource="com/artisan/mybatis/xml/mapper/UserMapper.xml"/><mapper resource="com/artisan/mybatis/xml/mapper/UserRoleMapper.xml"/><mapper resource="com/artisan/mybatis/xml/mapper/RoleMapper.xml"/><mapper resource="com/artisan/mybatis/xml/mapper/PrivilegeMapper.xml"/><mapper resource="com/artisan/mybatis/xml/mapper/RolePrivilegeMapper.xml"/>這種方式需要將所有的映射文件一一列舉出來,如果增加了新的映射文件,還需要注意在此處進行配置,不推薦。
因為此處所有的XML映射文件都有對應的Mapper接口,所以有一種更加簡單的配置方式
<!-- 推薦:通過包的方式配置,mybatis會先查找對應包下的所有的接口 --><package name="com.artisan.mybatis.xml.mapper"/>這種配置方式會先查找com.artisan.mybatis.xml.mapper包下的所有接口,循環對接口進行如下操作:
1. 判斷接口對應的命名空間是否已經存在,存在拋出異常,不存在就繼續進行接下來的操作
2. 加載接口對應的XML映射文件,將接口全限定名轉換為路徑,比如將接口com.artisan.mybatis.xml.mapper.UserMapper轉換為com/artisan/mybatis/xml/mapper/UserMapper.xml. 以.xml為后綴搜索xml資源,如果找到就解析xml
3. 處理接口中的注解方法
因為這里的接口和xml映射文件完全符合上面操作的第二點,因此直接配置包名就能夠自動掃描包下的接口和XML映射文件,省去了很多麻煩。
總結
以上是生活随笔為你收集整理的MyBatis-02 MyBatis XML方式概述及配置步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sping-Spring表达式语言SpE
- 下一篇: asp.net ajax控件工具集 Au