RoleMapper.java
public interface RoleMapper { public void add(Role role); public void update(Role role); public void delete(Role role); public List<Role> getRoleList(Role role); }
RoleMapper.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 namespace="cn.bdqn.dao.RoleMapper"> <!-- where/if(判斷參數) - 將實體類不為空的屬性作為where條件, 能智能的處理 and or ,不必擔心多余導致語法錯誤--> <!-- <select id="getRoleList" resultType="Role" parameterType="Role"> select * from role <where> <if test="roleCode != null"> and roleCode like CONCAT ('%',#{roleCode},'%') </if> <if test="roleName != null"> and roleName like CONCAT ('%',#{roleName},'%') </if> </where> </select> --> <!-- if/trim代替where(判斷參數) - 將實體類不為空的屬性作為where條件 --> <!-- <select id="getRoleList" resultType="Role" parameterType="Role"> select * from role <trim prefix="where" prefixOverrides="and | or"> <if test="roleCode != null"> and roleCode like CONCAT ('%',#{roleCode},'%') </if> <if test="roleName != null"> and roleName like CONCAT ('%',#{roleName},'%') </if> </trim> </select> --> <!-- choose(判斷參數) - 按順序將實體類第一個不為空的屬性作為where條件 --> <select id="getRoleList" resultType="Role" parameterType="Role"> select * from role <where> <choose> <when test="roleCode != null"> and roleCode like CONCAT ('%',#{roleCode},'%') </when> <when test="roleName != null"> and roleName like CONCAT ('%',#{roleName},'%') </when> <otherwise></otherwise> </choose> </where> </select> <insert id="add" parameterType="Role"> insert into role (roleCode,roleName) values (#{roleCode},#{roleName}) </insert> <update id="update" parameterType="Role"> update role set roleCode=#{roleCode},roleName=#{roleName} where id=#{id} </update> <delete id="delete" parameterType="Role"> delete from role where id=#{id} </delete> </mapper>
UserMapper.java
public interface UserMapper { public int count(); public void add(User user); public void update(User user); public void delete(User user); public List<User> getUserList(); //根據roleId獲取用戶列表 public List<User> getUserListByRoleId(Role role); //獲取指定用戶的地址列表(user表-address表:1對多關系) public User getAddressListByUserId(User user); //根據條件,獲取用戶表數據列表(動態sql) public List<User> searchUserList(User user); //根據部門條件,獲取用戶表數據列表-foreach_array public List<User> getUserByDepId_foreach_array(String[] depIds); //根據部門條件,獲取用戶表數據列表-foreach_list public List<User> getUserByDepId_foreach_list(List<String> depIdList); }
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"> <!-- namespace的名字需要跟接口的類名一致 --> <mapper namespace="cn.bdqn.dao.UserMapper"> <!-- 1、resultMap屬性:type為java實體類;id為此resultMap的標識 2、resultMap的子元素: id – 一般對應到數據庫中該行的ID,設置此項可以提高Mybatis性能. result – 映射到JavaBean 的某個“簡單類型”屬性,String,int等. association – 映射到JavaBean 的某個“復雜類型”屬性,其他JavaBean類. collection –復雜類型集合 --> <!--根據roleId獲取用戶列表: 當數據庫中的字段信息與對象的屬性不一致時需要通過resultMap來映射 --> <!-- <resultMap type="User" id="seachUserResult"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="roleId" column="roleId"/> <result property="roleName" column="roleName"/> </resultMap> <select id="getUserListByRoleId" parameterType="Role" resultMap="seachUserResult"> select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{id} </select> --> <!-- 根據roleId獲取用戶列表 association start--> <resultMap type="User" id="seachUserResult"> <result property="id" column="id"/> <result property="userCode" column="userCode" /> <result property="userName" column="userName" /> <result property="roleId" column="roleId" /> <!-- <association property="role" javaType="Role" > <result property="id" column="id"/> <result property="roleCode" column="roleCode"/> <result property="roleName" column="roleName"/> </association> --> <association property="role" javaType="Role" resultMap="roleMap"/> </resultMap> <resultMap type="Role" id="roleMap"> <result property="id" column="id"/> <result property="roleCode" column="roleCode"/> <result property="roleName" column="roleName"/> </resultMap> <select id="getUserListByRoleId" parameterType="Role" resultMap="seachUserResult"> select u.*,r.roleCode as roleCode,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{id} </select> <!-- association end--> <!-- 獲取指定用戶的地址列表(user表-address表:1對多關系) collection start--> <resultMap type="User" id="userMap"> <id property="id" column="userId"/> <collection property="addressList" ofType="Address"> <id property="id" column="a_id"/> <result property="postCode" column="postCode"/> <result property="addressContent" column="addressContent"/> </collection> </resultMap> <select id="getAddressListByUserId" parameterType="User" resultMap="userMap"> select *,a.id as a_id from user u,address a where u.id=a.userId and u.id=#{id} </select> <!-- collection end --> <resultMap type="User" id="seachUser"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> <result property="roleId" column="roleId"/> <result property="roleName" column="roleName"/> </resultMap> <!-- <select id="searchUserList" parameterType="User" resultMap="seachUser"> select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{roleId} and u.userCode like CONCAT ('%',#{userCode},'%') //防止sql注入 and u.userName like CONCAT ('%',#{userName},'%') </select> --> <!-- 1、有些時候,sql語句where條件中,需要一些安全判斷,例如按性別檢索,如果傳入的參數是空的,此時查詢出的結果很可能是空的,也許我們需要參數為空時,是查出全部的信息。這是我們可以使用動態sql,增加一個判斷,當參數不符合要求的時候,我們可以不去判斷此查詢條件。 2、mybatis 的動態sql語句是基於OGNL表達式的。可以方便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下幾類: if 語句 (簡單的條件判斷) choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似. trim (對包含的內容加上 prefix,或者 suffix 等,前綴,后綴) where (主要是用來簡化sql語句中where條件判斷的,能智能的處理 and or ,不必擔心多余導致語法錯誤) set (主要用於更新時) foreach (在實現 mybatis in 語句查詢時特別有用) --> <!-- if(判斷參數) - 將實體類不為空的屬性作為where條件 --> <select id="searchUserList" parameterType="User" resultMap="seachUser"> select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id <if test="roleId!=null"> and u.roleId = #{roleId} </if> <if test="userCode != null"> and u.userCode like CONCAT ('%',#{userCode},'%') </if> <if test="userName != null"> and u.userName like CONCAT ('%',#{userName},'%') </if> </select> <select id="count" resultType="int"> select count(1) from user </select> <insert id="add" parameterType="User"> insert into user (userCode,userName,userPassword) values (#{userCode},#{userName},#{userPassword}) </insert> <!-- if/set(判斷參數) - 將實體類不為空的屬性更新 --> <!-- <update id="update" parameterType="User"> update user <set> <if test="userCode != null and userCode != ''">userCode=#{userCode},</if> <if test="userName != null">userName=#{userName},</if> <if test="userPassword != null">userPassword=#{userPassword},</if> <if test="roleId != null">roleId=#{roleId}</if> </set> where id=#{id} </update> --> <!-- if/trim代替set(判斷參數) - 將實體類不為空的屬性更新 --> <update id="update" parameterType="User"> update user <trim prefix="set" suffixOverrides=","> <if test="userCode != null and userCode != ''">userCode=#{userCode},</if> <if test="userName != null">userName=#{userName},</if> <if test="userPassword != null">userPassword=#{userPassword},</if> <if test="roleId != null">roleId=#{roleId}</if> </trim> where id=#{id} </update> <!--注意: 你可以傳遞一個List實例或者數組作為參數對象傳給MyBatis。 當你這么做的時候,MyBatis會自動將它包裝在一個Map中,用名稱在作為鍵。 List實例將會以“list”作為鍵,而數組實例將會以“array”作為鍵。 配置文件中的parameterType是可以不配置的--> <resultMap type="User" id="userMapByDep"> <result property="id" column="id"/> <result property="userCode" column="userCode"/> <result property="userName" column="userName"/> </resultMap> <!-- foreach(循環array參數) - 作為where中in的條件 --> <select id="getUserByDepId_foreach_array" resultMap="userMapByDep"> select * from user where depId in <foreach collection="array" item="depIds" open="(" separator="," close=")"> #{depIds} </foreach> </select> <!-- foreach(循環List<String>參數) - 作為where中in的條件 --> <select id="getUserByDepId_foreach_list" resultMap="userMapByDep"> select * from user where depId in <foreach collection="list" item="depIdList" open="(" separator="," close=")"> #{depIdList} </foreach> </select> <delete id="delete" parameterType="User"> delete from user where id=#{id} </delete> <select id="getUserList" resultType="User"> select * from user </select> </mapper>