1. 程式人生 > >Mybatis-Dao層開發之Mapper接口

Mybatis-Dao層開發之Mapper接口

文件 映射 class 調用 用戶表 exp name add port

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接口