MyBatis是啥子东西?是一个DAO层的框架
文章目录
- 一、MyBatis 介绍
- 二、入门 MyBatis
- 三、源码示例
- 第一站:查
- 第二站:增
- 第三站:删
- 第四站:改
- 四、更多使用说明
- 映射文件
- 核心配置文件
- 相应API方法
一、MyBatis 介绍
MyBatis 是一个优秀的基于 Java 的持久层框架(是一个DAO层的框架),它内部封装了 JDBC,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
MyBatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 Java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句。最后 MyBatis 框架执行 sql 并将结果映射为 Java 对象并返回。
MyBatis 的过去: MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code ,并且改名为MyBatis。2013年11月迁移到Github。
名字由来:iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
当前,最新版本是MyBatis 3.5.9,其发布时间是2021年12月26日。
优点: 采用 ORM 思想解决了实体和数据库映射的问题,对 JDBC 进行了封装,屏蔽了 JDBC API 底层访问细节,使我们不用与 JDBC API 打交道,就可以完成对数据库的持久化操作。
二、入门 MyBatis
前面的介绍我们提到了DAO层、JDBC、sql语句本身、映射等。下面来简单说说使用 MyBatis 的六大步骤:
① 添加 MyBatis 的坐标
② 创建 user 数据表
③ 编写 User 实体类
④ 编写映射文件 UserMapper.xml
⑤ 编写核心配置文件 SqlMapConfig.xml
⑥ 编写 DAO 层,使用动态代理实现
第①步中的“坐标”就相当于是在引入jar包,假设我们是用 Maven 进行的开发,那么可以在 pox.xml 文件中写你需要的 MyBatis 依赖,示例如下:
<dependencies>……<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency>……
</dependencies>
第②、③步创建数据表和实体类不用多说。
第④步提到了映射文件:UserMapper.xml,该文件的名字一般由实体类+Mapper
组成,文件里面是sql语句,相当于 DAO 层接口的实现类。但这个文件的存放位置有点讲究,它在resource目录下的某个包里,这个包名必须跟实体类的包名同步,举例说明,实体类 User.java 放在 com.***.domain
下,那么映射文件 UserMapper.xml 的包名得是 com.***.mapper
。映射文件中的sql语句的参数不再用?
做占位符了,写法变为 #{实体类属性名}
。
第⑤步是编写核心配置文件:SqlMapConfig.xml,里面是数据库连接的四要素、事务管理器等。它直接放在resource目录下即可。
第⑥步编写DAO层接口,并使用动态代理的方式编写测试类,有四个点需要注意:1、映射文件中的namespace与接口类的全限定名相同;2、接口类中的方法名要和映射文件中定义的每个sql的id值相同;3、接口类中的方法的输入参数类型要和映射文件中定义的每个sql的parameterType的类型相同;4、接口类中的方法的输出参数类型要和mapper.xml中定义的每个sql的resultType的类型相同。
三、源码示例
源码只举例第④、⑥步的代码,其他几步就不多说了!
第④步 核心配置文件 SqlMapConfig.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><!-- 通过properties标签加载外部properties文件 --><properties resource="jdbc.properties"></properties><!-- 自定义别名 --><typeAliases><typeAlias type="com.***.domain.User" alias="user"></typeAlias></typeAliases><!--数据源环境--><environments default="developement"><environment id="developement"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加载映射文件 --><mappers> <mapper resource="com/***/mapper/UserMapper.xml"/> </mappers>
</configuration>
jdbc.properties 源码:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/你的数据库名
jdbc.username=登录名
jdbc.password=登录密码
第一站:查
编写映射文件 UserMapper.xml (映射文件相当于DAO层接口的实现类):
<?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.***.dao.UserMapper"> <!--查询所有--><select id="findAll" resultType="user"> select * from User </select><!--根据id进行查询--><select id="findById" resultType="user" parameterType="int">select * from user where id=#{id}</select>
</mapper>
如果使用动态代理实现,那么 DAO 层的接口类 UserMapper.java
源码如下:
package com.***.dao;import com.***.domain.User;
import java.io.IOException;
import java.util.List;public interface UserMapper {public List<User> findAll() throws IOException;public User findById(int id);
}
编写测试类,使用代理开发方式调用 DAO 层:
//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//查询所有
List<User> all = mapper.findAll();
System.out.println(all);//根据id进行查询
User user = mapper.findById(1);
System.out.println(user);
sqlSession.close();
第二站:增
编写映射文件 UserMapper.xml :
<mapper namespace="com.***.dao.UserMapper"> <!--插入操作--><insert id="add" parameterType="user"> insert into user values(#{id},#{username},#{password}) </insert>
</mapper>
DAO 层接口类 UserMapper.java
的源码增加内容如下:
public void add(User user);
编写测试类,使用代理开发方式调用 DAO 层:
//模拟user对象
User user = new User();
user.setId(2);
user.setUsername("lucy");
user.setPassword("1234");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//增
mapper.add();
sqlSession.commit();
sqlSession.close();
第三站:删
编写映射文件 UserMapper.xml :
<mapper namespace="com.***.dao.UserMapper"><!--删除操作--><delete id="delete" parameterType="int">delete from user where id=#{id}</delete>
</mapper>
DAO 层接口类 UserMapper.java
的源码增加内容如下:
public void delete(int id);
编写测试类,使用代理开发方式调用 DAO 层:
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//增
mapper.delete(2);
sqlSession.commit();
sqlSession.close();
第四站:改
编写映射文件 UserMapper.xml :
<mapper namespace="com.***.dao.UserMapper"><!--修改操作--><update id="update" parameterType="user">update user set username=#{username},password=#{password} where id=#{id}</update>
</mapper>
DAO 层接口类 UserMapper.java
的源码增加内容如下:
public void update(User user);
编写测试类,使用代理开发方式调用 DAO 层:
//模拟user对象
User user = new User();
user.setId(2);
user.setUsername("kang");
user.setPassword("kang");InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//增
mapper.update(user);
sqlSession.commit();
sqlSession.close();
四、更多使用说明
映射文件
映射文件如 UserMapper.xml 中各部分代码说明:
优化映射文件:使用动态sql语句
动态sql语句的实现常用 <if>
判断或者 <foreach>
循环标签。用 <if>
实现不同条件下的查询,UserMapper.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">
<mapper namespace="com.***.dao.UserMapper"> <!-- 不同条件下的查询 --><select id="findByCondition" parameterType="user" resultType="user">select * from user<where><if test="id!=0">and id=#{id}</if><if test="username!=null">and username=#{username}</if><if test="password!=null">and password=#{password}</if></where></select>
</mapper>
用 <foreach>
实现同一条件下多种情况的查询,UserMapper.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">
<mapper namespace="com.***.dao.UserMapper"> <!-- 同一条件下多种情况的查询 --><select id="findByIds" parameterType="list" resultType="user">select * from user<where><foreach collection="list" open="id in(" close=")" item="id" separator=",">#{id}</foreach></where></select>
</mapper>
<foreach>
标签用于遍历集合,它的属性含义如下:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
核心配置文件
文件中使用的所有标签如下图所示。标签在文件中的先后就是图片上的顺序(如 mapper 不能放在 environments 标签之前)。
常用标签 | 说明 |
---|---|
properties 属性 |
实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件(如jdbc.properties文件),该标签可以加载额外配置的properties文件。 |
typeAliases 类型别名 |
|
environments 环境 |
其中,事务管理器(transactionManager)类型有两种: - JDBC,这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。 - MANAGED,这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。 数据源(dataSource)类型有三种: |
mapper 映射器 |
该标签的作用是加载映射的。加载方式有四种,常用第一种。 1. 使用相对于类路径的资源引用,例如 <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> 2. 使用完全限定资源定位符(URL),例如 <mapper url="file:///var/mappers/AuthorMapper.xml"/> 3. 使用映射器接口实现类的完全限定类名,例如 <mapper class="org.mybatis.builder.AuthorMapper"/> 4. 将包内的映射器接口实现全部注册为映射器,例如 <package name="org.mybatis.builder"/>
|
相应API方法
- SqlSessionFactoryBuilder 工厂构建器
方法 SqlSessionFactory build(InputStream inputStream)
通过加载 MyBatis 的核心配置文件的输入流的形式构建一个SqlSessionFactory对象。
举例:
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中,Resources 这个工具类在 org.apache.ibatis.io
包中。Resources 类帮助你从类路径下、文件系统或一个 WEB URL 中加载资源文件。
- SqlSessionFactory 工厂对象
SqlSessionFactory 有多个个方法创建SqlSession 实例。常用的有如下两个:
创建实例 | 说明 |
---|---|
openSession() | 会默认开启一个事务,但事务不会自动提交,也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中。 |
openSession(boolean autoCommit) | 参数为是否自动提交,如果设置为true,那么不需要手动提交事务。 |
- SqlSession 会话对象
SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
执行语句的方法主要有: |
---|
T selectOne(String statement, Object parameter) |
List selectList(String statement, Object parameter) |
int insert(String statement, Object parameter) |
int update(String statement, Object parameter) |
int delete(String statement, Object parameter) |
操作事务的方法主要有: |
---|
void commit() |
void rollback() |
MyBatis是啥子东西?是一个DAO层的框架相关推荐
- mybatis反向生成实体类、dao层以及映射文件
在做项目的时候,我们不得不写底层的一些繁琐代码,比如说实体类.dao层之类的,既浪费时间又费事,最主要的是还没效率,kuangkuangkuang的写半天终于写完了,到运行的时候dao层的代码居然还报 ...
- Spring、Mybatis整合Service优化思路,DAO层、Service层最终编码以及log4j日志的使用
5. Spring.Mybatis整合Service层事务控制优化思路分析 # spring中处理事务的两种方式1. 编程式事务处理定义:通过在业务层中注入事务管理器对象,然后通过编码的方式进行事务控 ...
- Java_Mybatis(Dao层_框架)
目录 前言 一.概念 二.实现方法 2.1 配置文件开发 1) 导入MyBatis的坐标和其他相关坐标(创建Maven工程,在pom.xml文件中导入以下坐标(即jar包)) 2)创建user数据表( ...
- php有没有dao层,php框架开发四(DAO层)_PHP教程
网站开发不可避免地要对一些数据进行储存,但是存储这些数据各种语言的方式基本上都是:先打开连接,然后执行SQL语句,获取结结果,关闭连接. 那么PHP在操作数据库的时候有哪些方法呢? [php] $co ...
- 一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构...
表现层就是看到的东西,比如你现在看到的当前页面控制层就将你的请求从页面传到后台代码逻辑层就是处理你的请求的代码DAO层就是将数据存到数据库中的代码数据库就是数据库了,存东西用的DAO层就是将访问数据库 ...
- springboot 注册dao层 service 层的三种方式,高级内容详解
可以使用三种注解来引入DAO层的接口到spring容器中. 1.@Mapper,写在每一个DAO层接口上,如下: 2.@MapperScan和@ComponentScan两者之一.前者的意义是将指定包 ...
- mybatis报错Type interface xxx.Dao is not...
今天在做mybatis的时候,遇到一个错误,大家看看这个错误吧:org.apache.ibatis.binding.BindingException: Type interface cn.mybati ...
- mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
今天在做mybatis的时候,遇到一个错误,大家看看这个错误吧:org.apache.ibatis.binding.BindingException: Type interface cn.mybati ...
- SSM项目秒杀系统---(一)业务分析与Dao层
文章目录 一.相关技术介绍 1.MySQL 2.MyBatis 3.Spring 4.SpringMVC 5.前端 6.高并发 二.创建项目和依赖 1.使用idea直接创建maven项目,使用mave ...
最新文章
- 病虫害模型算法_基于深度学习的目标检测算法综述
- 云计算将成为金融服务业的主流技术
- 取消IE7以上版本 打印时缩小字体填充的方法
- C#中Cache的使用
- 打开vs2010,提示无效的许可证数据,需要重新安装
- javascript中的call()和apply()方法 - 原创实例
- Java 时间处理 DateTimeFormatter
- 在Ubuntu 18.04上搭建HttpRunnerManager服务
- SQLserver2008全文检索使用方法
- python 教材 配套 试题库_Python语言应用2020满分完整版考 试题库大全
- python 百度翻译官方api和破解版方法
- 【Unity3D】2D动画
- 与计算机博弈相关的学术论文,爱恩斯坦棋计算机博弈系统的研究与实现计算机应用技术专业论文.docx...
- 基于skynet设计游戏服务端框架
- 浏览器直接编辑html文件,HTML文件怎么打开 .html如何编辑
- 格式塔心理学5项法则的学习与思考
- eWebEditor 编辑器功能不能使用
- 50个极好的bootstrap前端框架
- 系统特征根_20160204
- ActivePerl 安装
热门文章
- python设备分组(部门分组等)功能设计
- oracle months_between week,ORACLE MONTHS_BETWEEN函数使用
- Postgresql中,计算两个日期月份差值或年月日,实现Oracle中months_between、add_months的效果
- 【系统分析师之路】2018年上系统分析师综合知识真题
- 【蝴蝶效应】【青蛙现象】【鳄鱼法则】 【鲇鱼效应】 【羊群效应】 【刺猬法则】 【手表定律】 ...
- Unity Shader 颜色混合
- PHP移动互联网开发笔记(1)——环境搭建及配置
- CPU FPU DSP MPU的概念介绍
- 什么叫做实体经济危机?
- 【日常吐槽 · 第八期】adb偶遇fooView