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>

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;
}

接口定义有如下特点:

  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>

四、测试

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();

    }
}

五、总结

  • 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不支持方法的重载
时间: 2024-08-05 07:09:33

java-mybaits-00203-DAO-mapper代理开发方法,多参数【推荐】的相关文章

mybatis学习之路(二)mapper代理开发方法-开发规范及实现

1.在mapper.xml中namespace等于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

mybatis入门基础(二)----原始dao的开发和mapper代理开发

阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先苦后甜嘛! 回到顶部 一:原始dao开发方法 概要:1.在上篇中搭建好的框价中编写dao接口和dao实现类 2.向dao接口实现类中注入SqlSessionFactory,在方法体内通过SqlSe

Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发(转发同上)

前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 原地址:http://www.cnblogs.com/shanheyongmu/p/7121016.html 使用MyBatis开发Dao,通常有两种方法,即原始Dao开发方法和Mapper接口开发方法. 1.SqlSession使用范围 1.1 SqlsessionFactoryBuilder 通过SqlSessionFac

【转】Mybatis学习---MyBatis知识、原始Dao开发和mapper代理开发

[原文]https://www.toutiao.com/i6594610137560777223/ 一.什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.它对jdbc的操

第二节 Mapper代理开发模式

一:原始的开发dao 实际开发中,我们程序员需要写dao接口和dao的实现类. 1.1 dao接口 1.2 dao实现类 1.3 测试类 总结: 在dao接口实现类方法存在很大大量重复的方法,这样会增加程序员的代码量 调用sqlsession方法时将statement的id硬编码了 比如我根据用户的id查找用户 调用SqlSession调用增删改查的方法时,由于该方法的变量类型使用的泛型,这就在编译阶段,即使类似错误,也不会报错,不利于开发维护 二:mapper代理开发---->相当于一个dao

mybatis框架(入门方法,dao层原始开发方法,mapper代理开发)(sqlserver数据库)

1.入门方法 第一步:mybatis全局环境配置  configurs.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">

09_Mybatis开发Dao方法——mapper代理开发规范

一.开发规范 需要编写mapper.xml映射文件(本项目为userMapper.xml,类似于前面的user.xml). 编写mapper接口需要遵循一些开发规范,这样MyBatis可以自动生成mapper接口实现代理对象. 1.在userMapper中namespace等于mapper接口地址 [UserMapper.xml]中的namespace: 2.UserMapper接口中方法名和UserMapper.xml中的statement的id一致 [UserMapper.java] [Us

Mybatis入门---dao开发和mapper代理开发

在说mabatis之前,先说说单独使用jdbc编程的缺陷. jdbc编程的大概流程大家都很清楚,基本分为以下几步: 加载数据驱动 创建并获取数据库连接 创建jdbc statement对象 设置sql语句,并设置sql语句中的参数 通过statement执行sql并获取结果 对执行的结果进行解析处理 释放资源 1 public static void main(String[] args) { 2 Connection connection = null; 3 PreparedStatement

Mybatis 和Spring整合之mapper代理开发

F:\1ziliao\mybatis\代码 1.1 SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <conf