程序员只需要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. vmware无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件

    原因: 是虚拟机服务没有开启 解决方法:(以管理员的方式运行) 点击“开始→运行”,在运行框中输入 CMD  回车打开命令提示符,然后依次执行以下命令. net start vmcinet start ...

  2. Linux编译安装PHP Mysql Nginx

    安装gcc g++等编译器 yum -y install gcc gcc-c++ automake autoconf libtool glibc make 安装一些lnmp依赖的库 yum -y in ...

  3. mysql 分页sql

    -- pageSize=3 pageIndex total=7 -- 开始行号 startRowNum=(pageIndex-1)*pageSize+1; -- 结束行号 endRowNum=page ...

  4. error: Please reinstall the libcurl distribution - easy.h should be in &lt;curl-dir&gt;/include/curl/

    运行php-5.3.10 --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --e ...

  5. POJ2139 Six Degrees of Cowvin Bacon [Floyd]

    水题,随手敲过 一看就是最短路问题,a,b演同一场电影则他们的距离为1 默认全部两两原始距离无穷,到自身为0 输入全部数据处理后floyd 然后照它说的求平均分离度 再找最小的,×100取整输出 #i ...

  6. 九度OJ 上剑指 offer 习题目录

    <剑指Offer>面试题集收录汇总 面试题1 赋值运算符函数 不适合在线模式 面试题2 实现Singleton模式 不适合在线模式 面试题3 二维数组中的查找 已收录 面试题4 替换空格 ...

  7. iOS开发之--如何修改TabBarItem的title的字体和颜色/BarButtonItem的title的字体大小和颜色/添加背景图片,并添加点击方法

    在进行项目的过程中,我们往往会遇到各种各样的自定义颜色和字体,下面提供一种修改系统自带的TabBarItem的字体和颜色的方法,希望能帮到大家: [[UITabBarItem appearance] ...

  8. sql列转行查询

    test表: 执行列转行sql: select student, sum(case Course when '语文' then Score else null end) 语文, sum(case Co ...

  9. freeipa未授权遍历注册账户漏洞

    一.freeipa简介: freeipa是一款集成的安全信息管理解决方案.freeipa包含Linux (Fedora),389 Directory Server MIT Kerberos, NTP, ...

  10. 微信登陆,微信SDK授权登陆经验分享

    From:http://www.eoeandroid.com/thread-547012-1-1.html 最近因为项目需要做了微信登陆,好像也是微信最近才放出来的接口.还需要申请才能有权限实现授权. ...