MyBatis接口式编程
MyBatis使用接口连接数据库
之前学习了如何传统的使用MyBatis连接数据库,今天学习如何使用更方便快捷的方式练级数据库。使用接口连接数据库
https://www.cnblogs.com/liziweiblog/p/11080470.html
1. 创建EmployeeMapper接口,定义sql方法
package com.atguigu.mybatis.dao; import com.atguigu.mybatis.bean.Employee; /**
* Employee数据库操作接口
* @author Administrator
*接口可以与配置文件动态绑定
*namespace指定为接口的全类名,唯一标识指定为sql对应的方法名,返回值类型就是方法的返回值类型的全类名
*/
public interface EmployeeMapper { public Employee getEmployeeById(Integer id); }
2. 将sql映射配置文件与接口绑定
1. 将namespace配置为EmployeeMapper接口的全路径
2. 将唯一标识id配置为方法名称
3.将返回类型resultType设置为方法的返回值类型全路径
<?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.atguigu.mybatis.dao.EmployeeMapper">
<!--
namespace:名称空间
id:唯一标识 #{id}表示从参数出取出id
resultType:返回值类型
-->
<select id="getEmployeeById" resultType="com.atguigu.mybatis.bean.Employee">
select * from tbl_employee where id = #{id}
</select>
</mapper>
3. 编写测试用例,连接数据库
1. 通过配置文件获取sqlSessionFactory对象
2.通过sqlSessionFactory对象获取sqlSession对象
3. 通过sqlSession对象获取接口的实现类对象employeeMapper
4.调用employeeMapper对象的方法执行sql
5.关闭sqlSession对象
@Test
public void test01() throws IOException {
//1. 获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = null;
try {
//2得到sqlSession对象
sqlSession = sqlSessionFactory.openSession();
//通过EmployeeMapper接口获取mapper对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//调用EmployeeMapper中的方法查询
Employee employee = mapper.getEmployeeById(1);
System.out.println(employee);
}finally {
//关闭sqlSession对象
sqlSession.close();
}
}
结果:
没有报错,查询成功
Employee [id=1, last_Name=tom, email=tom@atgui, gender=0]
创建接口没有实现也行吗?
在以上的教程中我们只是创建了一个接口定义了一个空方法体的方法,直接在测试用例中通过getMapper(接口.class)获取EmployeeMapper对象。
这样也行吗?没有实现的接口也能实例化????
在测试类中
//通过EmployeeMapper接口获取mapper对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
//查看mapper到底是什么
System.out.println(mapper.getClass());
输出结果:
class com.sun.proxy.$Proxy8
原来是代理对象。
MyBatis会为绑定sql映射配置文件的接口创建一个代理对象。通过代理对象调用方法。
可以看成配置文件xxxMapper.xml就是对接口的实现。
对于这个机制的原理我还不清楚,以后再深入学习。
总结
MyBatis中最重要的种配置文件
1. 全局配置文件。配置了数据源,事务管理等全局信息
2. sql映射配置文件。配置了每一个接口方法对应的sql语句
使用传统方法和使用接口方法都可以实现功能。但是推荐使用接口的方法。
MyBatis接口式编程的更多相关文章
- MyBatis的接口式编程Demo
很久没细看过MyBatis了,时间一长就容易忘记. 下面是一个接口式编程的例子. 这里的例子一共分为4步: 1 首先要有一个namespace为接口的全类名的映射文件,该例中是 IMyUser.xml ...
- Mybatis笔记二:接口式编程
目录 旧方法的弊端 接口式编程 接口式编程的好处 接口式编程的增删改查 旧方法的弊端 在Mybatis笔记一中,我们使用命名空间+id的方式实现了Mybatis的执行,不过这里的命名空间是我们随便写的 ...
- MyBatis源码解析【7】接口式编程
前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 修改例子 在我们实际 ...
- 通过自动回复机器人学Mybatis 笔记:接口式编程
[接口式编程]尚未遇见Spring --> 代码量反而增加 1.增加约定,减少犯错的可能(不用直接去写字符串 修改点1:命名空间 修改点2:增加接口,方法名与配置文件中的id对应 package ...
- 通过自动回复机器人学Mybatis笔记:接口式编程
[接口式编程]尚未遇见Spring --> 代码量反而增加 1.增加约定,减少犯错的可能(不用直接去写字符串 修改点1:命名空间 修改点2:增加接口,方法名与配置文件中的id对应 package ...
- mybaits接口式编程
Mybatis是接口式编程实现对.xml中sql语句的执行,其过程如下(取自慕课网视频<通过自动回复机器人学Mybatis---加强版>): 1.加载配置信息2.通过加载配置信息加载一个代 ...
- MyBatis3-topic04,05 -接口式编程
笔记要点 /**接口式编程: * 1. 原生: Dao 接口-->Dao接口的实现类 * mybatis: Mapper --> 有一个与之对应的 XXMapper.xml * 2. Sq ...
- mybatis学习(三)——接口式编程
对于上一节中的查询我们还可以通过接口的方式进行编程,开发环境和上一节一样 1.全局配置文件mybatis_config.xml(和上一节一样) <?xml version="1.0&q ...
- MyBatis入门(二)接口式编程
在 MyBatis入门(一) 的基础之上编写接口 将接口和Mapper文件进行绑定,会为接口创建一个代理对象,代理对象去执行增删改查 (1)编写接口 public interface EmpDao ...
随机推荐
- 原生JS实现简单富文本编辑器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux命令集合(二)
yum源的配置 yum 得配置yum源,配置阿里云的 两个 yum源 ,阿里云的yum源中,会有 mariadb的软件包 阿里云的yum仓库中,mariadb版本如下 mariadb ...
- 运营中CP(X)的名词含义
一.名词含义 我们在做产品推广时,最常见的合作方式有CPA/CPS/CPC/CPM,以及不常见的CPD/CPT/CPL,以下来详细解释这7个名词. CPA:指的是按激活或者注册付费,比如一个激活,就是 ...
- python redis分布式锁改进
0X01 python redis分布式锁通用方法 REDIS分布式锁实现的方式:SETNX + GETSET 使用Redis SETNX 命令实现分布式锁 python 版本实现上述思路(案例1) ...
- Luogu P4082 [USACO17DEC]Push a Box 点双连通分量/圆方树
(貌似有圆方树的做法,我写的是点双) 显然这道题就是直接搜索.定义状态为f[i][j][0~4]表示箱子在(i,j),人在某个方向推.然后问题就是怎么转向.我们发现如果要转向,必须是人走过一条不包括( ...
- Python操作MySQL数据库,插入重复数据
sql = "INSERT INTO test_c(id,name,sex)values(%s,%s,%s)" param = (1,'AJ','MAN') n = cursor ...
- .Net Core: 跨域Cros概要
读取配置 public class AppConfig { public static IConfigurationRoot Configuration { get; set; } public st ...
- 边学边体验django--表格
在模板的末尾,我们增加一个rlt记号,为表格处理结果预留位置. 表格后面还有一个{% csrf_token %}的标签.csrf全称是Cross Site Request Forgery.这是Djan ...
- KETTLE 更新表的两种方式-更新控件和sql更新 2种方式的实现比较
在实际工作中,我们有可能遇见只更新不插入的情况,可以由以下2种方式去实现: 1.更新控件 如下图所示,根据id字段,更新name和cjsj时间字段 该控件不足的地方是,用来查询关键值得字段不够灵活,一 ...
- Flutter布局----弹性布局 (Flex)
弹性布局(Flex) 弹性布局允许子组件按照一定比例来分配父容器空间.弹性布局的概念在其它UI系统中也都存在,如H5中的弹性盒子布局,Android中的FlexboxLayout等.Flutter中的 ...