java的Mybatis动态代理方式(二)

上期介绍了Mybatis基础的使用方式,这次介绍下Mybatis动态代理方式(接口开发)也是官方推荐的方式

mapper动态代理方式的 总体思想是: 约定由于配置

--------------------

1.硬编码方式:

  abc.java 

    Configuration conf = new Configuration();

    conf.setName("myProject");

2.配置方式:

  abc.xml

    <name>myProject</name>

3.约定 : 默认值就是 myProject

--------------------------------------

那mapper动态代理 是怎么约定的呢?

具体实现步骤:

1.导包(mybatis.jar , jdbc.jar , 和建立 配置文件 config.xml 及 xxMapper.xml)

2.(不同之处) 约定目标,省略掉statement(简写 stm,其实就是一个字符串,映射文件xxMapper.xml中的id值 ). 最终可以直接定位到sql.

  1.建立接口 , com.cc8w.mapper.TeacherMapper.java

    1)第一个约定:接口的方法名和xxMapper.xml文件中的标签id相同

    2)第二个约定:接口的方法参数类型 和 xxMapper.xml文件中标签parameterType 类型一致

    3)第三个约定:接口的方法返回类型 和 xxMapper.xml文件中标签 resultType 类型一致  

  2. 之后xxMapper.xml文件中的namespace就写,相应接口的全类名.

习惯: 一般接口 com.cc8w.mapper.TeacherMapper.java 和 TeacherMapper.xml在一个文件

匹配过程: 

  1.根据 接口名 找到 xxMapper.xml文件 (namespace=接口全类名)

  2.根据 接口方法 找到xxMapper.xml文件中的sql标签 (方法名=sql标签id值)

其实最终的目的是:通过接口方法找到sql语句

例子 : (实体类 数据库 等配置就忽略了,主要记录 接口建立和对应的xxMapper.xml书写) 

1.新建接口 TeacherMapper.java

package com.cc8w.mapper;

import com.cc8w.entity.Teacher;

public interface TeacherMapper {
    
    Teacher queryOneTeacher(int id);//查询一个数据

}

2.建立与之对应的TeacherMapper.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="com.cc8w.mapper.TeacherMapper">
    <select id="queryOneTeacher" resultType="com.cc8w.entity.Teacher">
    select * from teacher where id = #{id}
    </select>
</mapper>

上面最重要的两步好了, 然后就是 在配置文件conf.xml中 引入新建的这个 xxMapper.xml文件

    <!-- 映射器:指定映射文件或者映射类 -->
    <mappers>
        <mapper resource="mybatis/TestMapper.xml"/>
        <mapper resource="com/cc8w/mapper/TeacherMapper.xml"/>
    </mappers>

开始写测试类:

package com.cc8w.test;

import java.io.IOException;
import java.io.InputStream;

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 com.cc8w.entity.Teacher;
import com.cc8w.mapper.TeacherMapper;

public class Test {
    
    //基础的mybatis查询
    public static void demo01() throws IOException{
        //1.加载配置文件
        String resource = "mybatis/config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
        new SqlSessionFactoryBuilder().build(inputStream);
        
        //2.获取SqlSession-->类似于数据库连接 Connection
        SqlSession session = sqlSessionFactory.openSession();
        
        //3.执行XXMapper.xml中映射的sql语句
        String stm = "com.cc8w.entity.Teacher.queryOneTeacher";
        Teacher t = session.selectOne(stm, 2);
        System.out.println(t);        
    }
    
    //动态代理的mybatis查询
    public static void demo02() throws IOException{
        //1.加载配置文件
        String resource = "mybatis/config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory =
        new SqlSessionFactoryBuilder().build(inputStream);
        
        //2.获取SqlSession-->类似于数据库连接 Connection
        SqlSession session = sqlSessionFactory.openSession();
        
        //3.通过接口映射到XXMapper.xml中映射的sql语句
        TeacherMapper tm = session.getMapper(TeacherMapper.class);
        Teacher t = tm.queryOneTeacher(1);
        System.out.println(t);        
    }    
    
    public static void main(String[] args) throws IOException {
        //demo01();//基础的mybatis使用
        demo02();//使用动态代理方式
        
        
    }

}

结果:

扩展: 有时 xxMapper.xml的返回值需要写全类名,其实可以在简单一些,写个别名,这个需要在conf.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>
    <!-- 属性:定义配置外在化 -->
    <properties resource="db.properties"></properties>
    <!-- 类型名称:为一些类定义别名 -->
    <typeAliases>
        <!-- 单个别名 (忽略大小写)-->
        <typeAlias type="com.cc8w.entity.Teacher" alias="Teacher"/>
        <!-- 单个别名 (忽略大小写)别名就是改类名-->
        <package name="com.cc8w.entity"/>
    </typeAliases>
    <!-- 类型处理器:定义Java类型与数据库中的数据类型之间的转换关系 -->
    <typeHandlers></typeHandlers>


    <!-- 环境:配置mybatis的环境 -->
    <environments default="development">
       <!-- 环境变量:可以配置多个环境变量,比如使用多数据源时,就需要配置多个环境变量 -->
       <environment id="development">
          <!-- 事务管理器 -->
          <transactionManager type="JDBC"></transactionManager>
          <!-- 数据源 -->
              <dataSource type="POOLED">
              <property name="driver" value="${jdbc.driver}"/>
              <property name="url" value="${jdbc.url}"/>
              <property name="username" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
            </dataSource>
       </environment> 
    </environments>

    <!-- 映射器:指定映射文件或者映射类 -->
    <mappers>
        <mapper resource="mybatis/TestMapper.xml"/>
        <mapper resource="com/cc8w/mapper/TeacherMapper.xml"/>
    </mappers>
</configuration>
原文地址:https://www.cnblogs.com/fps2tao/p/12779380.html