Mybatis-Dao層開發之Mapper接口
Mapper接口開發方法只需要程序員編寫Mapper接口(相當於Dao接口),由Mybatis框架根據接口定義創建接口的動態代理對象,代理對象的方法體同上邊Dao接口實現類方法。
Mapper接口開發需要遵循以下規範:
1、 Mapper.xml文件中的namespace與mapper接口的類路徑相同。
2、 Mapper接口方法名和Mapper.xml中定義的每個statement的id相同
3、 Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同
4、 Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同
1、Mapper映射文件
定義mapper映射文件UserMapper.xml(內容同Users.xml),需要修改namespace的值為UserMapper接口路徑。將UserMapper.xml放在classpath 下mapper目錄下。
<?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"> <!-- 命名空間,對sql進行分類化管理(sql隔離)--> <mapper namespace="com.sw.mapper.UserMapper"> <!-- 在映射文件中配置sql語句 --> <!-- 通過select執行查詢,id用於標識映射文件中的sql(Statement-id) 將sql語句封裝到mappedstatement中 #{}表示占位符 parameterType-指定輸入參數的類型 #{id}-id表示輸入的參數,參數名稱就是id,如果輸入參數是簡單類型,#{}中的參數可以任意 resultType-指定sql輸出結果所映射的java對象類型--> <!-- 通過id查詢用戶表的記錄 --> <select id="findUserById" parameterType="int" resultType="com.sw.po.User"> select *from user where id=#{id} </select> <!-- 根據用戶名稱模糊查詢用戶信息 --> <!-- resultType-指定單條記錄所映射的對象類型 ${}拼接sql串,接收參數的內容,不加任何修飾,拼接在sql中(存在sql漏洞) ${}接收輸入參數的內容,如果傳入的類型是簡單類型,${}中只能使用value --> <select id="findUserByName" parameterType="java.lang.String" resultType="com.sw.po.User"> SELECT *FROM USER WHERE username LIKE ‘%${value}%‘ </select> <!-- 添加用戶 --> <!-- 指定輸入參數類型是pojo(包括用戶信息) #{}中指定pojo(User)屬性名,接收到pojo的屬性值 Mybatis通過OGNL獲取對象的屬性值 --> <insert id="insertUser" parameterType="com.sw.po.User"> <!-- 獲取剛增加的記錄主鍵 返回id到poio對象(User) SELECT LAST_INSERT_ID():得到剛插入金進去記錄的主鍵值,只適用於自增逐主鍵 keyProperty:將查詢到的主鍵值設置到parameterType指定的對象User裏面的用來做id的屬性,這裏是:id,
然後在執行插入的時候,從parameterType(也就是這裏的User)的Id裏面取出來,進行插入 order:指SELECT LAST_INSERT_ID()的執行順序,相對於insert來說(before/after) resultType:指定SELECT LAST_INSERT_ID()的結果類型 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO USER (id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address}) <!-- 使用mysql的uuid生成主鍵返回 執行過程: 首先通過uuid得到主鍵,然後將主鍵設置到id屬性中 其次在Inster執行的時候從User對象中取出id的屬性值 --> <!--
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT UUID() </selectKey> INSERT INTO USER (id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
--> </insert> <!-- 根據id刪除用戶 --> <delete id="deleteUser" parameterType="java.lang.Integer"> DELETE FROM USER WHERE id=#{id} </delete> <!-- 根據id更新用戶 傳入用戶id以及相關更新信息 #{id}:從輸入的user對象中獲取user的屬性值 --> <update id="updateUser" parameterType="com.sw.po.User"> UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id} </update> </mapper>
2、Mapper.java-接口文件
Mapper接口定義有如下特點:
1、Mapper接口方法名與Mapper.xml(UserMapper.xml)中定義的statement的id相同
2、Mapper接口方法的輸入參數類型和mapper.xml(User.xml)中定義的statement的parameterType的類型相同
3、 Mapper接口方法的輸出參數類型和mapper.xml中定義的statement的resultType的類型相同
代碼如下:
package com.sw.mapper; import java.util.List; import com.sw.po.User; /* *@Author swxctx *@time 2016年12月1日 *@Explain:使用mapper接口(用戶管理),相當於dao接口 */ public interface UserMapper { //根據id查詢用戶的信息 public User findUserById(int id)throws Exception; //根據用戶名查看用戶列表 public List<User> findUserByName(String username)throws Exception; //添加用戶 public void insertUser(User user)throws Exception; //刪除用戶 public void deleteUser(int id)throws Exception; }
3、測試類
package com.sw.mapper.test; import java.io.InputStream; import java.util.Date; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import com.sw.mapper.UserMapper; import com.sw.po.User; /* *@Author swxctx *@time 2016年12月1日 *@Explain: */ public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUpBefore() throws Exception { //執行其他方法前需要創建SqlSessionFactory // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 創建會話工廠,傳入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } @Test public void testFindUserById() throws Exception{ SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用UserMapper方法 User user = userMapper.findUserById(27); sqlSession.close(); System.out.println(user); } @Test public void testFindUserByName() throws Exception{ SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用UserMapper方法 List<User> user = userMapper.findUserByName("王"); sqlSession.close(); System.out.println(user); } @Test public void testInsertUser()throws Exception{ SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setUsername("李小二"); user.setSex("1"); user.setBirthday(new Date()); user.setAddress("廣州"); //調用方法 userMapper.insertUser(user); //提交事務 sqlSession.commit(); //釋放資源 sqlSession.close(); } @Test public void testDeleteUser() throws Exception{ SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用UserMapper方法 userMapper.deleteUser(44); sqlSession.commit(); sqlSession.close(); } }
註:
selectOne和selectList
動態代理對象調用sqlSession.selectOne()和sqlSession.selectList()是根據mapper接口方法的返回值決定,如果返回list則調用selectList方法,如果返回單個對象則調用selectOne方法。
namespace
mybatis官方推薦使用mapper代理方法開發mapper接口,程序員不用編寫mapper接口實現類,使用mapper代理方法時,輸入參數可以使用pojo包裝對象或map對象,保證dao的通用性。
Mybatis-Dao層開發之Mapper接口