zoukankan      html  css  js  c++  java
  • java-mybaits-00203-DAO-mapper代理开发方法,多参数【推荐】

    程序员只需要mapper接口(相当 于dao接口)
    不需要写具体实现类,mapper已经代理完成,mybatis才有的

    一、mapper代理开发方法(建议使用)

             程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范:
             1、mapper.xml中namespace就是mapper.java的类全路径。
             2、mapper.xml中statement的id和mapper.java中方法名一致。
             3、mapper.xml中statement的parameterType指定输入参数的类型和mapper.java的方法输入 参数类型一致。
             4、mapper.xml中statement的resultType指定输出结果的类型和mapper.java的方法返回值类型一致。

    二、实现原理

      Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
     
    总结:
    以上开发规范主要是对下边的代码进行统一生成:
    User user = sqlSession.selectOne("test.findUserById", id);
    sqlSession.insert("test.insertUser", user);

    三、开发方法实现

    代码地址:https://github.com/bjlhx15/mybatis
    1.Mapper.xml(映射文件)
      定义mapper映射文件UserMapper.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">
    <mapper namespace="com.lhx.mybatis.mapperproxy.UserMapper">
        <!-- 根据id获取用户信息 -->
        <select id="findUserById" parameterType="int"
            resultType="com.lhx.mybatis.po.User">
            select * from user where id = #{id}
        </select>
        <!-- 自定义条件查询用户列表 -->
        <select id="findUserByUsername" parameterType="java.lang.String"
            resultType="com.lhx.mybatis.po.User">
            select * from user where username like '%${value}%'
        </select>
        <!-- 添加用户 -->
        <insert id="insertUser" parameterType="com.lhx.mybatis.po.User">
            <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
                select
                LAST_INSERT_ID()
            </selectKey>
            insert into user(username,birthday,sex,address)
            values(#{username},#{birthday},#{sex},#{address})
        </insert>
        <!-- 根据id获取用户信息 -->
        <select id="findUserByIdAndSex" resultType="com.lhx.mybatis.po.User">
            select * from user
            where id = #{0} and sex = #{1}
        </select>
    </mapper>
    View Code
    2.Mapper.java(接口文件)
    package com.lhx.mybatis.mapperproxy;
    
    import java.util.List;
    
    import com.lhx.mybatis.po.User;
    
    /**
     * 用户管理mapper
     */
    public interface UserMapper {
        // 根据用户id查询用户信息
        public User findUserById(int id) throws Exception;
    
        // 查询用户列表
        public List<User> findUserByUsername(String username) throws Exception;
    
        // 添加用户信息
        public void insertUser(User user) throws Exception;
        public User findUserByIdAndSex(int id,int sex) throws Exception;
    }
    View Code
    接口定义有如下特点:
    1. Mapper接口方法名和Mapper.xml中定义的statement的id相同
    2. Mapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同
    3. Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同
    3.加载UserMapper.xml文件
    在SqlMapConfig-MapperProxy.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>
        <!-- 和spring整合后 environments配置将废除 -->
        <environments default="development">
            <environment id="development">
                <!-- 使用jdbc事务管理 -->
                <transactionManager type="JDBC" />
                <!-- 数据库连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url"
                        value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="mapper/UserMapper.xml" />
        </mappers>
    </configuration>
    View Code

    四、测试

    package com.lhx.mybatis.mapperproxy;
    
    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.lhx.mybatis.po.User;
    
    import junit.framework.TestCase;
    
    public class UserMapperTest extends TestCase {
    
        private SqlSessionFactory sqlSessionFactory;
    
        protected void setUp() throws Exception {
            // mybatis配置文件
            String resource = "SqlMapConfig-MapperProxy.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 使用SqlSessionFactoryBuilder创建sessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        public void testFindUserById() throws Exception {
            // 获取session
            SqlSession session = sqlSessionFactory.openSession();
            // 获取mapper接口的代理对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 调用代理对象方法
            User user = userMapper.findUserById(1);
            System.out.println(user);
            // 关闭session
            session.close();
    
        }
    
        public void testFindUserByUsername() throws Exception {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> list = userMapper.findUserByUsername("张");
            System.out.println(list.size());
    
        }
    
        public void testInsertUser() throws Exception {
            // 获取session
            SqlSession session = sqlSessionFactory.openSession();
            // 获取mapper接口的代理对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 要添加的数据
            User user = new User();
            user.setUsername("张三");
            user.setBirthday(new Date());
            user.setSex("1");
            user.setAddress("北京市");
            // 通过mapper接口添加用户
            userMapper.insertUser(user);
            // 提交
            session.commit();
            // 关闭session
            session.close();
        }
    
        public void testFindUserByIdAndSex() throws Exception {
            // 获取session
            SqlSession session = sqlSessionFactory.openSession();
            // 获取mapper接口的代理对象
            UserMapper userMapper = session.getMapper(UserMapper.class);
            // 调用代理对象方法
            User user = userMapper.findUserByIdAndSex(1, 2);
            System.out.println(user);
            // 关闭session
            session.close();
    
        }
    }
    View Code

    五、总结

    • selectOne和selectList
      动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。 
    • namespace
      mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。 
    • mapper接口方法参数只能有一个是否影响系统 开发【旧版本】
       mapper接口方法参数只能有一个,系统是否不利于扩展维护。
        系统 框架中,dao层的代码是被业务层公用的。
        即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
           注意:持久层方法的参数可以包装类型、,map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展,没人知道map要得是什么参数)。
    • 多个参数的支持

    第一种、索引方式

    在mapper接口中定义

    public User findUserByIdAndSex(int id,int sex) throws Exception;

    在mapper.xml中使用

        <!-- 多个参数,不写入参类型 -->
        <select id="findUserByIdAndSex" resultType="com.lhx.mybatis.po.User">
            select * from user
            where id = #{0} and sex = #{1}
        </select>

    第二种、注解参数

    在mapper接口中定义

    public User findUserByIdAndSex2(@Param("id") int id, @Param("sex") int sex) throws Exception;

    在mapper.xml中使用

        <select id="findUserByIdAndSex2" resultType="com.lhx.mybatis.po.User">
            select * from user
            where id = #{id} and sex = #{sex}
        </select>

    第三种、map

    第四种、po类

    • mapper接口和mapper.xml不支持方法的重载
     
  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/bjlhx/p/6819183.html
Copyright © 2011-2022 走看看