mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层
优势
通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper()
方法自动生成),只需编写接口即可,简化了原始 dao 开发的流程。
核心
mapper 代理开发 dao 层,最主要的其实就是两个步骤:
- 编写mapper.xml映射文件
- 编写mapper接口(相当于dao接口)
下面举个栗子。
步骤
1 编写 mapper.xml 映射文件
mapper.xml:
<?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">
<!-- namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
namespace等于 mapper 接口地址
-->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{value}
</select>
</mapper>
其中 namespace 中的内容应为编写的 mapper接口的相对地址。这里的 SQL 语句以查询数据库中的 id 为例。
2 编写mapper接口:UserMapper.java
UserMapper.java:
package cn.itcast.mybatis.mapper;
import cn.itcast.mybatis.po.User;
import java.util.List;
public interface UserMapper {
//根据 id 查询用户信息
public User findUserById(int id) throws Exception;
}
调用封装好的数据库对象 User.java 内容,定义接口。
其中应该遵循以下几条规则:
- mapper接口中的方法名和mapper.xml中statement的id一致
- mapper接口中方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致
- mapper接口中方法返回值类型和mapper.xml中statement的resultType指定的类型一致
3 在全局配置文件 SqlMapConfig.xml 中 加载映射文件
SqlMapConfig.xml:
<!-- 加载映射文件 -->
<mappers>
<!-- 通过 resource 方法一次加载一个映射文件 -->
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
4 编写测试文件 UserMapperTest.java ,查看控制台输出结果
UserMapperTest.java:
package cn.itcast.mybatis.mapper;
import cn.itcast.mybatis.po.User;
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 java.io.InputStream;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
//注解Before是在执行本类所有测试方法之前先调用这个方法
@Before
public void setup() throws Exception{
//创建SqlSessionFactory
String resource="SqlMapConfig.xml";
//将配置文件加载成流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis配置文件的信息
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception{
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建UserMapper代理对象
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user=userMapper.findUserById(1);
sqlSession.close();
System.out.println(user);
}
}
sqlSession可以自动创建一个mapper接口的代理对象,所以我们只需要把写好的mapper接口类的对象传给getMapper方法,即可得到一个该接口对应的代理对象,然后我们就可以使用这个代理对象来操作接口中具体的方法了。
运行 testFindUserById()
方法,查看控制台信息,正确输出查询结果。
mybatis 学习笔记(三):mapper 代理开发 dao 层的更多相关文章
- mabatis--使用mapper代理开发dao
1.编写mapper.xml映射文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE m ...
- Mybatis学习笔记(三) —— DAO开发方法
一.SqlSession的使用范围 SqlSession中封装了对数据库的操作,如:查询.插入.更新.删除等. SqlSession通过SqlSessionFactory创建. SqlSessionF ...
- MyBatis使用Mapper动态代理开发Dao层
开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同原始Dao接口实现类方法. Mappe ...
- 【MyBatis学习04】mapper代理方法开发dao
上一篇博文总结了mybatis使用 原始dao的方法存在的一些弊端,我们肯定不会去用它,那么mybatis中该如何开发dao呢?如题所述,这篇博文主要来总结一下使用mapper代理的方法来开发dao的 ...
- Mybatis的mapper代理开发dao方法
看完了之前的mybatis原始的dao开发方法是不是觉得有点笨重,甚至说没有发挥mybatis 作为一个框架的优势.总结了一下,原始的dao方法有以下几点不足之处 dao接口实现方法中存在大量的模板方 ...
- MyBatis学习笔记(三) Configuration类
一.初探Configuration类 我们先来看一下MyBatis的XML配置文件的结构,(摘自mybatis.org) 下面这个是Configuration类的部分变量 一点不一样是不是??? 其实 ...
- Mybatis学习笔记(五) —— Mapper.xml(输入映射和输出映射)
一.parameterType(输入类型) 1.1 传递简单类型 <!-- 根据用户id查询用户 --> <select id="queryUserById" p ...
- mybatis系列笔记(2)---mapper代理方法
mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1) ...
- mybatis mapper接口开发dao层
本文将探讨使用 mapper接口,以及 pojo 包装类进行 dao 层基本开发 mybatis dao 层开发只写 mapper 接口 其中需要 开发的接口实现一些开发规范 1. UserMappe ...
随机推荐
- Python之二维数组N*N顺时针旋转90度
需求:把一个二维数组顺时针旋转90度,现实数据的替换. 比如把4*4的二维数组顺时针旋转90度 原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', ' ...
- 微信小程序API登录凭证(code),获得的用户登录态拥有一定的时效性
调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. OBJECT参 ...
- CSS秘密花园:多边框
今天在查询CSS3动画相关资料时偶然发现这个,感觉有时还是挺方便的.原文链接:http://www.w3cplus.com/css3/css-secrets/multiple-borders.html ...
- Game Develop Books
[Working On] [Pending] 3.<实时计算机图形学> 4.<游戏编程精粹1> 5.<游戏编程精粹2> 6.<3D游戏引擎设计:实时计算机图形 ...
- SpringMVC总结一:快速入门
MVC: MVC是一种架构模型,本身没有什么功能,只是让我们的项目结构更加合理,流程控制更加清晰,一般包含三个组件: **Model(模型)**:数据模型,用于提供要展示的数据.一般包含数据和行为 ...
- Elasticsearch聚合限制内存使用
限制内存使用 通常为了让聚合(或者任何需要访问字段值的请求)能够快点,访问fielddata一定会快点, 这就是为什么加载到内存的原因.但是加载太多的数据到内存会导致垃圾回收(gc)缓慢, 因为JVM ...
- 【HDU4303】Hourai Jeweled
题意 有一棵n个结点的树,每个结点都有一个值,没一条边都有一个颜色.如果某条路径上,相邻的边颜色不同,那么把这路径上所有的点的值加起来. 输出所有符合条件的路径上值的和. n<=300000. ...
- mysql数据库中插入表情4个字节的
这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 我的解决方案是这样的 1.在mysql ...
- laravel使用ORM操作数据库
laravel使用ORM操作数据库 public function mode(){ //查询所有 $isok=Student::get(); 新增. (1) $isok=Student::create ...
- ajax load事件
ajax.load 使用ajax 来改变div元素文本. load( url [, data][, callback] ) load()方法的传递方式根据参数data来自动指定.如果没有参数传递,则 ...