• 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>
  • 相关阅读:
    用fiddler测试ip轮询
    ubuntu下安装fiddler
    Andriod相机开发关于startPreview Failed的错误的特别记录(重要)
    我的Cocos2dx开发模式
    Android WebView导入HTML使Js生效的方法
    Lua快捷键
    String,StringBuilder,StringBuffer的对比测试
    重构视角(摘抄)
    String属于“假引用类型”,代码为证(一个String引发的血案...)
    static class
  • 原文地址:https://www.cnblogs.com/fps2tao/p/12779380.html
Copyright © 2020-2023  润新知