天天看點

mybatis的mapper動态代理開發,mapper引入的2種方式

mybatis-config.xml主配置檔案中, mapper引入的兩種方式:

①通過xml路徑

②通過mapper接口的class路徑

<mappers>
        <!--mapper 是表的映射檔案,每張表對應一個mapper檔案
        引入方式有2種,第一種:通過xml路徑
        第二種:通過mapper接口的路徑引入
        -->
        <!--
        <mapper resource="dao/UserDao.xml"/>
        <mapper class="dao.UserDao"/>
        -->

        <!--可以使用批量掃描的形式,表的配置檔案和dao層中的檔案名字一緻,配置package标簽-->
        <package name="dao"></package>

    </mappers>
           

使用mapper代理開發,注意namespace:和 dao中 UserDao 對象一緻;

1,session擷取userdao.class對象

2,加載mapper.xml

3,擷取sql的statement

4,statement把sql執行結果映射到結果集(User類,及java對象)中。

mapper.xml 配置如下;

<?xml version="1.0" encoding="UTF-8"?>
<!-- 該檔案代表的是user類和user表的映射關系,關于user表的sql語句等等寫在這裡 -->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--使用mapper 代理開發,需要實作UserDao接口-->
<mapper namespace="dao.UserDao">

    <!-- #{}代表占位符?,表示mybatis架構會接收輸入的參數并指派到sql語句當中
          關于簡單類型(int,String,date。long)可以使用value來代表參數名
     -->
    <select id="findUserById" parameterType="java.lang.Integer" resultType="model.User">
  select * from user where id=#{id}
    </select>
    <!--模糊查詢   like +條件  '% ${比對的内容} %'    $是拼接sql -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="model.User">
 select * from user where name like  '%${value}%';
    </select>

    <!-- ${}代表字元串拼接 -->


    <!-- 插入的時候可以使用主鍵回填的政策,LAST_INSERT_ID() -->

</mapper>
           

impl類開發,這裡雖然使用了dao的實作類,主要為了擷取代理對象,實質仍是動态代理開發:

使用了  session.getMapper( 接口的位元組碼檔案 )來擷取接口的  代理對象 [實作類對象 ];

//擷取代理對象,真正的代理開發沒有實作類,通過擷取代理類對象 完成crud
    @Override
    public List<User> findUserByName(String name) {
        SqlSession session = MybatisUtils.getFactory().openSession();//會話
        UserDao daili = session.getMapper(UserDao.class);//擷取userdao接口代理對象----可以擷取接口中的所有方法
        /**擷取mapper.xml 通過statement擷取sql語句,把sql 的執行結果映射到
         * model.User中
         */
        return daili.findUserByName(name);
    }
//僅僅是實作類
    @Override
    public User findUserById(int id) {
        SqlSession session = MybatisUtils.getFactory().openSession();
        User user = (User) session.selectOne("dao.UserDao.findUserById", id);//注意mapper中的namespace
        return user;
    }
           

test測試:

package test;

/**
 * @auther SyntacticSugar
 * @data 2018/9/7 0007下午 5:28
 */
public class Junittest01 {
    @Test
    public  void  test1(){
        DaoImpl dao = new DaoImpl();
        System.out.println(dao.findUserById(5));
    }
    @Test
    public  void  test2(){
        DaoImpl dao = new DaoImpl();
        System.out.println(dao.findUserById(30));
    }
    @Test
    public  void  test3(){
        DaoImpl dao = new DaoImpl();
        System.out.println(dao.findUserByName("熊"));
    }
//    jdbc:mysql://localhost:3306/student?serverTimezone=UTC
}
           

下面來說下不寫實作類,使用動态代理開發的測試例子;

實作動态代理的條件,開發範式:

(1)面向接口程式設計

(2)1、 Mapper.xml檔案中的 namespace與 mapper接口的類路徑相同。

         2、  Mapper接口方法名  和 Mapper.xml中定義的每個sql的 id相同

         3、 Mapper接口方法的輸入參數類型和 mapper.xml中定義的每個 sql 的 parameterType 的類型相同

         4、 Mapper接口方法的輸出參數類型和 mapper.xml中定義的每個 sql的 resultType 的類型相同

接口定義的特點:

1、 Mapper接口方法名和 Mapper.xml中定義的 statement的 id 相同

2、 Mapper接口方法的輸入參數類型和 mapper.xml中定義的statement的 parameterType的類型相同

3、 Mapper接口方法的輸出參數類型和 mapper.xml中定義的statement的 resultType的類型相同

聲明,使用的JDK8,MYSQL8,mybatis3.5.4 進行測試;

工程的目錄結構如下:

mybatis的mapper動态代理開發,mapper引入的2種方式

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">
<!--
 命名空間,每張表對應一個實體類
   啟用了别名,是以 resultType="User"
 -->

<!-- 使用動态代理  mapper.xml中  namespace和接口路徑一緻  -->
<mapper namespace="com.baidu.dao.UserMapper">
    <!-- 使用resultMap  進行映射  -->
    <select id="findUserById" resultMap="UserMap">
    select * from tb_user where id = #{id}
  </select>
<!-- 使用autoMapping 開啟自動映射,當列名和 pojo中filed名 一緻時候,可以有效映射  -->
    <resultMap id="UserMap" type="User" autoMapping="true">
        <id property="id" column="id"></id>
    </resultMap>

    <select id="login" resultType="User">
        select  * from tb_user where user_name=#{userName} and password=#{password}
    </select>
</mapper>
           

UserMapper接口如下:

package com.baidu.dao;
import com.baidu.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @auther SyntacticSugar
 * @data 2018/11/4 0004下午 10:59
 */
public interface UserMapper {
    /**
     * 根據id查詢使用者
     * @param id
     * @return
     */
    User findUserById(Long id);
//使用動态代理開發 ,當參數為多個時候,使用@Param 注解傳入參數
    User login(@Param("userName") String userName, @Param("password") String password);

}
           

mybatis-config.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--  引入jdbc 配置檔案 -->
    <properties resource="jdbc.properties"/>
<!-- 開啟駝峰 -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
<!-- 啟用别名 -->
    <typeAliases>
        <!--<typeAlias type="com.baidu.domain.User" alias="User"></typeAlias>-->
        <package name="com.baidu.domain"></package>
        <package name="com.baidu.dao"></package>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/baidu/mapper/UserMapper.xml"></mapper>
        <mapper resource="com/baidu/mapper/UserDaoMapper.xml"></mapper>
        <mapper resource="com/baidu/mapper/commenSql.xml"></mapper>
        <!-- 批量掃描包 -->
        <package name="com.baidu.mapper"></package>
    </mappers>
    <!-- Continue going here -->
</configuration>
           

jdbc.properties如下:使用的連接配接資料庫 jar 版本 8.0.11

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=root
           

UserMapperTest如下:

/**
 * @auther SyntacticSugar
 * @data 2018/11/5 0005下午 3:18
 */
public class UserMapperTest {
    private UserMapper mapper;

    @Before
    public void setUp() throws IOException {
// 加載配置檔案
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//建立SqlSessionFactory ,擷取UserMapper接口的代理對象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = factory.openSession();
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    /**
     *   findUserById
     */
    @Test
    public void test01() {
        User userById = mapper.findUserById(1L);
        System.out.println("userById = " + userById);
    }
    /**
     *login
     */
    @Test
    public void test03() {
        User zhangsan = mapper.login("zhangsan", "123456");
        System.out.println(zhangsan);
    }
}
           

繼續閱讀