MyBatis开发Dao层的两种方式(Mapper动态代理方式)

时间:2021-05-05 00:20:28

  MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发)

  接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式

  Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法。

  Mapper接口开发需要遵循以下规范:

    (1)Mapper.xml文件中的namespace与mapper接口的类路径相同。

    (2)Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

    (3)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

    (4)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

  1、定义mapper映射文件UserMapper.xml(内容同User.xml),需要修改namespace的值为 UserMapper接口路径。将UserMapper.xml放在classpath 下sqlmapperr目录下。

<?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.xyfer.mapper.UserMapper">
<!-- 根据id查询用户 -->
<select id="getUserById" parameterType="int" resultType="com.xyfer.po.User">
select * from user where id = #{id}
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.xyfer.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>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.xyfer.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete> </mapper>

  2、UserMapper.java接口文件

package com.xyfer.mapper;

import com.xyfer.po.User;

public interface UserMapper {

    public User getUserById(int id);   //根据id值查询一个用户
public void insertUser(User user); //新增一个用户
public void updateUser(User user); //修改一个用户
public void deleteUser(int id); //删除一个用户 }

  接口定义有如下特点:

    (1)UserMapper接口方法名和Mapper.xml中定义的statement的id相同

    (2)UserMapper接口方法的输入参数类型和mapper.xml中定义的statement的parameterType的类型相同

    (3) UserMapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型相同

  3、在SqlMapConfig.xml文件中加载UserMapper.xml文件

<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>

  4、测试

package com.xyfer.mapper;

import static org.junit.Assert.*;

import java.io.InputStream;
import java.util.Date; 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.xyfer.po.User; import junit.framework.TestCase; public class UserMapperTest extends TestCase{ private SqlSessionFactory sqlSessionFactory; protected void setUp() throws Exception {
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
} @Test
public void testGetUserById() {
//获取sqlsession
SqlSession sqlsession = sqlSessionFactory.openSession();
//获取UserMapper接口代理对象
UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
//调用代理对象方法
User user = userMapper.getUserById(10);
//打印结果
System.out.println(user);
//关闭sqlsession
sqlsession.close();
} @Test
public void testInsertUser() {
//获取sqlsession
SqlSession sqlsession = sqlSessionFactory.openSession();
//获取UserMapper接口代理对象
UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
//新建一个对象
User user = new User();
user.setUsername("小谢");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("浙江省杭州市");
//调用代理对象方法
userMapper.insertUser(user);
//提交事务
sqlsession.commit();
//关闭sqlsession
sqlsession.close();
} @Test
public void testUpdateUser() {
//获取sqlsession
SqlSession sqlsession = sqlSessionFactory.openSession();
//获取UserMapper接口代理对象
UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
//新建一个对象
User user = new User();
user.setUsername("小谢");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("上海市");
//调用代理对象方法
userMapper.updateUser(user);
//提交事务
sqlsession.commit();
//关闭sqlsession
sqlsession.close();
} @Test
public void testDeleteUser() {
//获取sqlsession
SqlSession sqlsession = sqlSessionFactory.openSession();
//获取UserMapper接口代理对象
UserMapper userMapper = sqlsession.getMapper(UserMapper.class);
//调用代理对象方法
userMapper.deleteUser(6);
//提交事务
sqlsession.commit();
//关闭sqlsession
sqlsession.close();
} }

  以上步骤,完成mybatis框架以Mapper动态代理方式开发Dao层,并对数据库进行增删改查操作。

  需要注意的是,上文提到的config文件夹和sqlmapper文件夹均为资源文件夹(source folder),默认会加载该路径下的文件。

MyBatis开发Dao层的两种方式(Mapper动态代理方式)的更多相关文章

  1. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  2. Mybatis入门——基础方式的增删该查、mapper动态代理方式的CRUD、类型转换器

    一.基础方式的增删该查: 1.mybatis约定:输入参数parameterType和输出参数resulrType在形式上只能有一个. 2.如果输入/输出参数:是简单类型(8个基本类型加String) ...

  3. 02&period;MyBatis在DAO层开发使用的Mapper动态代理方式

    在实际开发中,Mybatis作用于DAO层,那么Service层该如何调用Mybatis Mybatis鼓励使用Mapper动态代理的方式 Mapper接口开发方法只需要程序员编写Mapper接口(相 ...

  4. Mybatis之旅第二篇-Mapper动态代理方式

    一.引言 通过上一篇mybatis的入门学习,我们已经会使用mybatis实现简单的增删改查,但是我们也发现了用原始Dao开发的一些问题: Dao方法体存在重复代码:通过SqlSessionFacto ...

  5. Mybatis Mapper动态代理方式 typeAliases 别名的使用

    目录结构及配置文件与原始dao方法相比更简便 只需一个UserMapper的接口,放在一起的配置文件,配置文件中namespace的地址确定jdk动态代理的对象 <?xml version=&q ...

  6. (五)mybatis开发dao层

    目录 SqlSession 是线程不安全的 原始 dao 开发方法 Mapper 代理方法 关于代理对象 SqlSession 是线程不安全的 SqlSession 是 线程不安全 的: 对于它,我们 ...

  7. mybatis开发Dao的Mapper动态代理方式

    1. 开发规范Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体跟Dao原始方法中接口实现类的方法相 ...

  8. Mapper动态代理方式

    开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法. Mapper接 ...

  9. Mapper 动态代理方式

    Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法. Mapper接口开发 ...

随机推荐

  1. AVAudioPlayer

    AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework. AVAudioPlayer类封装了播放单个声音的能力.播放器可以用NSURL或 ...

  2. JavaScript 火花效果

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. 深入Delphi -- Windows 消息机制

    http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...

  4. jquery 复选框

    jquery 选中复选框 $("input[type='checkbox']").prop("checked", true); jquery 判断复选框是否被选 ...

  5. 解决Django&plus;Vue前后端分离的跨域问题及关闭csrf验证

      前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道   在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...

  6. Jenkins结合&period;net平台之ftp客户端

    上一节我们讲解了如何配置ftp服务端,本节我们讲解如何使用winscp搭建ftp客户端,为什么使用winscp而不是filezilla客户端版,前面我们简单说过,这里不再赘述. 下载winscp以后我 ...

  7. Python不能用于大型项目?关于Python的10大误解

     语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...

  8. nodejs构建mock数据

    Nodejs构建mock数据并通过rest api风格调用接口访问数据 如果我们只有json格式的数据文件,我们想通过访问url方式调用居然数据 确保电脑安装node环境 如果你没有安装好node环境 ...

  9. Tensorflow timeline trace

    根据 https://github.com/tensorflow/tensorflow/issues/1824 简单进行了测试 修改运行的脚本增加如下关键代码 例如mnist_softmax.py f ...

  10. 题解——洛谷P1550 &lbrack;USACO08OCT&rsqb;打井Watering Hole(最小生成树,建图)

    题面 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pas ...