程序员只需要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不支持方法的重载
 

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

  1. Mybatis的mapper代理开发方法

    一.开发规范 1.映射文件中的namespase等于mapper接口类路径 2.statement的id与mapper中的方法名一致 3.让mapper的接口方法输入参数类型与statement中的p ...

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

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

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

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...

  4. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...

  5. mybatis 学习笔记(三):mapper 代理开发 dao 层

    mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...

  6. mabatis--使用mapper代理开发dao

    1.编写mapper.xml映射文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE m ...

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

    [原文]https://www.toutiao.com/i6594610137560777223/ 一.什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及 ...

  8. Mybatis学习总结(二)——Mapper代理开发

    一.概要 1.原始DAO开发中存在的问题:(1)DAO实现方法体中存在很多过程性代码.(2)调用SqlSession的方法(select/insert/update)需要指定Statement的id, ...

  9. Mybatis的mapper代理开发dao方法

    看完了之前的mybatis原始的dao开发方法是不是觉得有点笨重,甚至说没有发挥mybatis 作为一个框架的优势.总结了一下,原始的dao方法有以下几点不足之处 dao接口实现方法中存在大量的模板方 ...

随机推荐

  1. DIV中display和visibility属性差别

    DIV中display和visibility属性差别 DIV中display和visibility属性差别还是挺大的,虽然Visibility和Display属性都可以达到隐藏页面元素的目的,但它们的 ...

  2. HDFS的实现机制

    参考以上这张图,实际上我们客户端访问HDFS里面的内容时,并不需要真实知道内容存在于服务器的内容的真实路径,我们只需要知道一个虚拟路径就可以,比如最上面的hdfs://weekend110:9000/ ...

  3. SSIS 自测题-数据流控件类

    说明:以下是自己的理解答案,不是标准的答案,如有不妥烦请指出.         有些题目暂时没有答案,有知道的请留言,互相学习,一起进步. 133.请描述一下 Conditional Split 的使 ...

  4. contract

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  5. C++ 百炼成钢20

    题目56: 编写C++程序完成以下功能:(1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法:(2)定义一个圆形类,其属性包括圆心和半径:(3)创建两个圆形对象,提示用户输入圆心 ...

  6. ORACLE之常用FAQ V1.0

    [B]第一部分.SQL&PL/SQL[/B][Q]怎么样查询特殊字符,如通配符%与_[A]select * from table where name like 'A\_%' escape ' ...

  7. UIView 坐标转换

    例子1 Controller的view中有一个tableView,tableView的cell上有一个button,现在需要将button的frame转为在Controller的view中的frame ...

  8. 用原生Canvas写贪吃蛇及问题解决

    为了学习Canvas,写了这个小游戏贪吃蛇供自己和大家学习 Github: https://github.com/zhiyishou/Gsnake Play On: http://zhiyishou. ...

  9. CENTOS --5分钟搞定Nginx安装的教程

    1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++ 2. 安装pcre yum install -y pcre pcre-de ...

  10. Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例

    来自:http://www.jb51.net/LINUXjishu/163820.html 其中,对于sz和rz的理解与记忆我用了如下的方法(因为很多时候容易搞混):sz中的s意为send(发送),告 ...