zoukankan      html  css  js  c++  java
  • Mybatis2

    五.Mapper动态代理方式  

    1. 开发规范

           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的类型相同

    2.开发过程

    2.1. Mapper.xml(映射文件)

           定义mapper映射文件UserMapper.xml

    将UserMapper.xml放在config下mapper目录下,效果如下:

     

    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">
    
    <!-- namespace:命名空间,用于隔离sql -->
    
    <!-- 还有一个很重要的作用,使用动态代理开发DAO,1. namespace必须和Mapper接口类路径一致 -->
    
    <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
    
        <!-- 根据用户id查询用户 -->
    
        <!-- 2. id必须和Mapper接口方法名一致 -->
    
        <!-- 3. parameterType必须和接口方法参数类型一致 -->
    
        <!-- 4. resultType必须和接口方法返回值类型一致 -->
    
        <select id="queryUserById" parameterType="int"
    
           resultType="cn.itcast.mybatis.pojo.User">
    
           select * from user where id = #{id}
    
        </select>
    
     
    
        <!-- 根据用户名查询用户 -->
    
        <select id="queryUserByUsername" parameterType="string"
    
           resultType="cn.itcast.mybatis.pojo.User">
    
           select * from user where username like '%${value}%'
    
        </select>
    
     
    
        <!-- 保存用户 -->
    
        <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User">
    
           <selectKey keyProperty="id" keyColumn="id" order="AFTER"
    
               resultType="int">
    
               select last_insert_id()
    
           </selectKey>
    
           insert into user(username,birthday,sex,address) values
    
           (#{username},#{birthday},#{sex},#{address});
    
        </insert>
    
     
    
    </mapper>

    2.2. UserMapper(接口文件)

    创建UserMapper接口代码如下:

    public interface UserMapper {
        /**
         * 根据id查询
         * @param id
         * @return
         */
        User queryUserById(int id);
        /**
         * 根据用户名查询用户
         * @param username
         * @return
         */
        List<User> queryUserByUsername(String username);
        /**
         * 保存用户
         *
         * @param user
         */
        void saveUser(User user);
    
    }

    2.3. 加载UserMapper.xml文件

    修改SqlMapConfig.xml文件,添加以下所示的内容:

     <!-- 加载映射文件 -->
    
        <mappers>
    
           <mapper resource="sqlmap/User.xml" />
    
           <mapper resource="mapper/UserMapper.xml" />
    
        </mappers>

    2.4. 测试

    编写的测试方法如下:

    public class UserMapperTest {
        private SqlSessionFactory sqlSessionFactory;
        @Before
        public void init() throws Exception {
           // 创建SqlSessionFactoryBuilder
           SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
           // 加载SqlMapConfig.xml配置文件
           InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
           // 创建SqlsessionFactory
           this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        }
        @Test
        public void testQueryUserById() {
           // 获取sqlSession,和spring整合后由spring管理
           SqlSession sqlSession = this.sqlSessionFactory.openSession();
           // 从sqlSession中获取Mapper接口的代理对象
           UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
           // 执行查询方法
           User user = userMapper.queryUserById(1);
           System.out.println(user);
           // 和spring整合后由spring管理
           sqlSession.close();
        }
        @Test
        public void testQueryUserByUsername() {
           // 获取sqlSession,和spring整合后由spring管理
           SqlSession sqlSession = this.sqlSessionFactory.openSession();
           // 从sqlSession中获取Mapper接口的代理对象
           UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
           // 执行查询方法
           List<User> list = userMapper.queryUserByUsername("张");
           for (User user : list) {
               System.out.println(user);
           }
           // 和spring整合后由spring管理
           sqlSession.close();
        }
        @Test
        public void testSaveUser() {
          // 获取sqlSession,和spring整合后由spring管理
           SqlSession sqlSession = this.sqlSessionFactory.openSession();
           // 从sqlSession中获取Mapper接口的代理对象
          UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
           // 创建保存对象
           User user = new User();
           user.setUsername("刘备");
           user.setBirthday(new Date());
           user.setSex("1");
           user.setAddress("蜀国");
           // 执行查询方法
           userMapper.saveUser(user);
           System.out.println(user);
           // 和spring整合后由spring管理
           sqlSession.commit();
           sqlSession.close();
        }
    }

     小结

    1.  selectOne和selectList

    动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

    2.  namespace

    mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

    六   SqlMapConfig.xml配置文件

    1. 配置内容

    SqlMapConfig.xml中配置的内容和顺序如下:(顺序不可改,否则无法运行)

    properties(属性)

    settings(全局配置参数)

    typeAliases(类型别名)

    typeHandlers(类型处理器)

    objectFactory(对象工厂)

    plugins(插件)

    environments(环境集合属性对象)

      environment(环境子属性对象)

        transactionManager(事务管理)

        dataSource(数据源)

    mappers(映射器)

    2.properties

    db.properties配置文件内容如下:

    jdbc.driver=com.mysql.jdbc.Driver
    
    jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
    
    jdbc.username=root
    
    jdbc.password=root 

    SqlMapConfig.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>
        <!-- 是用resource属性加载外部配置文件 -->
        <properties resource="db.properties">
           <!-- 在properties内部用property定义属性 -->
           <!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
           <property name="jdbc.username" value="root123" />
           <property name="jdbc.password" value="root123" />
        </properties>
        <!-- 和spring整合后 environments配置将废除 -->
        <environments default="development">
           <environment id="development">
               <!-- 使用jdbc事务管理 -->
               <transactionManager type="JDBC" />
               <!-- 数据库连接池 -->
               <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="sqlmap/User.xml" />
           <mapper resource="mapper/UserMapper.xml" />
        </mappers>
    </configuration>

     MyBatis 将按照下面的顺序来加载属性:

    u  在 properties 元素体内定义的属性首先被读取。

    u  然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。

    3.别名typeAliases(给类型定别名然后在xml文件里用)

    <typeAliases>
            <!-- 单个别名定义 -->
            <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
            <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
            <package name="cn.itcast.mybatis.pojo" />
            <package name="其它包" />
        </typeAliases>

                    -----》大小写不敏感

    4. mappers(映射器)

    Mapper配置的几种方法:(两个属性只能选择一个制定)

    4.1. <mapper resource=" " />

    使用相对于类路径的资源(现在的使用方式)

    如:<mapper resource="sqlmap/User.xml" />

    4.2. <mapper class=" " />

    使用mapper接口类路径

    如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>

    注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

    4.3. <package name=""/>(包扫描最常用)

    注册指定包下的所有mapper接口

    如:<package name="cn.itcast.mybatis.mapper"/>

    注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

  • 相关阅读:
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
    2020软件工程作业00——问题清单
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    Ubuntu中安装最新 Node.js 和 npm
    英语学习单词篇一
    Golang之内存读写
    Golang之正则表达式的使用
  • 原文地址:https://www.cnblogs.com/lvoooop/p/10858508.html
Copyright © 2011-2022 走看看