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不支持方法的重载
     
  • 相关阅读:
    GIS的核心价值——服务
    Arcgis Add-In开发入门实例
    Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位
    Spring
    字体大小对照换算表
    属性和字段的区别
    sqlDataAdapter和SqlCommand的区别
    C# 连接SQL Server数据库的几种方式--server+data source等方式
    c# using的作用
    random
  • 原文地址:https://www.cnblogs.com/bjlhx/p/6819183.html
Copyright © 2011-2022 走看看