1.什么是MyBatis
- 说起jdbc大家都非常的熟悉吧。大家可以想想 我们使用jdbc对数据库操作的麻不麻烦。答案不要想都是知道肯定麻烦啊。就说查询吧 你查询出来的数据是不是还要和java的实体类进行对应,就这一个操作就已经浪费了我们大把的开发时间。还不说其他的操作,获取SQL连接,执行SQL语句等等... 是不是我们都需要一步一步的写啊。如果你不觉得麻烦,那还是你写的少。哈哈哈开个玩笑!就从我刚才介绍的几点出发,就可以看出jdbc对数据的操作还是很麻烦。
- 因此mybatis诞生了,mybatis的诞生大大的提高了我们的开发效率,最最关键的是他的操作还十分的简单。下面我们就来慢慢介绍。
ORM,Object-Relationl Mapping,对象关系映射,它的作用是在关系型数据库和对 象之间作一个映射处理。 JDBC 的缺点:需要手动的完成面向对象的 Java 语言、面向关系的数据库之间数据的 转换,代码繁琐无技术含量,影响了开发效率。查询是需要手动的将结果集的列数据转换为 Java 对象的属性;而添加操作 时需要手动将 Java 对象的属性转换为数据库表的列字段。关于面向对象的 Java 语言、面向关系的数据库之间数据的转换必须要做,问题在于这个转换是否可以不由开发者来做?答案是可以的。ORM 框架就是专门来解决这个问题的, 相当于在面向对象语言和关系数据库之间搭建一个桥梁。这样我们在具体的操作数据库的时候,只要像平时操作对象一样操作它就可以了,ORM 框架会根据映射完成对数据库的操作, 就不需要再去和复杂的 SQL 语句打交道了。
MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,且改名为 MyBatis 。2013 年 11 月迁移到 GitHub。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使 用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java 对象)映射成数据库中的记录。简单的说:MyBatis 是一个半自动 ORM 框架,其本质是对 JDBC 的封装。使用 MyBatis 重点需要程序员编写 SQL 命令,不需要写一行 JDBC 代码。 与 Hibernate 的比较Hibernate 是一个全自动的 ORM 框架。因为 Hibernate 创建了 Java 对象和数据库表 之间的完整映射,可以完全以面向对象的思想来操作数据库,程序员不需要手写 SQL 语句, 而 MyBatis 中还需要手写 SQL 语句,所以是半自动化的,工作量要大于 Hibernate。为什么半自动化的 Mybatis 比自动化的 Hibernate 受欢迎?MyBatis 需要手写 SQL 语句,所以工作量要大于 Hibernate。但是也正是由于自定义 SQL 语句,所以其灵活性、可优化性就超过了 Hibernate。 Hibernate 封装了 SQL 语句,由开发者对对象操作,Hibernate 来生成 SQL 语句。虽 然也可以通过映射配置来控制生成的 SQL 语句,但是对于要生成复杂的 SQL 语句,很难实现,或者实现后导致性能的丢失。 而 MyBatis 将手写 SQL 语句的工作丢给开发者,可以更加精确的定义 SQL,更加灵活, 也便于优化性能。完成同样功能的两条 SQL 语句的性能可能相差十几倍到几十倍,在高并发、快响应要求下的互联网系统中,对性能的影响更明显。MyBatis 对存储过程可提供很好的支持。另外 MyBatis 的开发工作量大不意味着学习成本大。对于新手,学习 Hibernate 时间成本比 Mybatis 大很多,Mybatis 很快就上手了。总之,因为 MyBatis 具有封装少、映射多样化、支持存储过程、可以进行 SQL 语句优化等特点,符合互联网高并发、大数据、高性能、高响应的要求,使它取代 Hibernate 成为了 Java 互联网中首选的持久框架。而对于对性能要求不高的比如内部管理系统、ERP 等可以使用 Hibernate。
3.MyBatis 的使用
1. 请看以下代码
先给大家看一下我的目录接口和jar包
这个是MyBatis的核心配置文件,也叫做全局配置文件,没有它mybatis就无法启动。我使用的是mysql的数据源,你还可以配置其他数据源,比如oracle,MariaDB等等...
但是千万别忘记给默认的数据源,这个是很重要的,如果你没有配置默认数据就会报错。这个错误很多粗心的人都会犯。
<?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 resource="jdbc.properties"/>
<!--配置别名-->
<typeAliases>
<!--这里给一个具体的bian对象 设置别名-->
<!-- <typeAlias alias="user" type="com.bdqn.pojo.Users" />-->
<!--这里可以直接写包名 我就使用包名的方式写了 不区分大小写-->
<package name="com.bdqn.pojo"/>
</typeAliases>
<!--环境配置-->
<environments default="development">
<!--这里千万别忘了给一个默认的数据源 -->
<environment id="development">
<!--配置事务 我使用的是jdbc事务 -->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源 我使用的是连接池 -->
<dataSource type="POOLED">
<!--配置你的URL路径 注意里面的name都是不可以随便写的 以下的我就省略了-->
<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>
<!--这里别忘记引用 mybaties的映射文件了 就是你写sql语句的那个文件 这里我使用的文件引用-->
<mappers>
<mapper resource="com/bdqn/mapper/UsersMapper.xml"/>
</mappers>
</configuration>
下面我们来看一下mybatis的全局映射文件,里面都是对sql语句的封装。里面我只写了一个查询语句,其他的增删改亦是如此!注意:映射配置文件的id千万不重复!
<?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 一定要写你接口的全限定名 也就是包名 切记切记-->
<mapper namespace="com.bdqn.dao.UserDao">
<!--查询全部方法-->
<!--resultType是你结果集所需要对应的一个javabian对象-->
<!--因为我们之前已经配置好了别名设置 所以可以直接给对象名 不区分大小写-->
<!--你的id的名字最好和你dao层接口的名字包成一致 为后面学习打下基础-->
<select id="seleAlUsers" resultType="users">
/*这里直接写你的sql语句就可以了*/
SELECT userid , username , usersex FROM users
</select>
</mapper>
接下看给大家看一下我的dao,daoimpl,service,以及serviceimpl
public interface UserDao {
/*我就写个基础的查询方法*/
List<Users> seleAlUsers() throws IOException;
}
public class UserImpl implements UserDao {
public List<Users> seleAlUsers() {
//读取我们的mybaties的全局配置文件
InputStream resourceAsStream = null;
List<Users> users=null;
SqlSession sqlSession=null;
try {
resourceAsStream = Resources.getResourceAsStream("Mybaties-cgn.xml");
//使用SqlSessionFactoryBuilder给我们生成一个SqlSessionFactory工厂对象
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//使用工厂创建一个SqlSession对象 此对象就是一个会话对象 你可以使用它对数据可进行CURD操作(增删改查)
//使用完不要忘记关闭哦
sqlSession = build.openSession();
//我要的是查询所有 所以调用selectList方法
users = sqlSession.selectList("com.bdqn.dao.UserDao.seleAlUsers");
} catch (IOException e) {
e.printStackTrace();
}finally {
if (sqlSession!=null)sqlSession.close();
}
return users;
}
看到我标明的方法,大家可以想一下,mybatis为什么给我们提供一个参数是boolean的方法 。答案是,在mybatis中事务提交方式默认为手动提交,这与jdbc是不同的,在jdbc中事务默认提交方式为自动提交。 因此我们只要把openSession参数改为TRUE即可。
但是我不建议大家这样写。因为你这样写就无法控制事务了,比如我sql的语句发生了错误,有可能语句就已经插入到数据库中了 这样我们的程序就不可控了,反之我可以在try-catch里面进行事务回滚啊。这样数据就不会添加到数据库中。
最后就是我的测试方法和结果了。
public static void main(String[] args) throws IOException {
UserDao userDao=new UserImpl();
List<Users> users = userDao.seleAlUsers();
users.forEach(System.out::println);
}
我的讲解就到此结束了,如果有不好的地方请大家多多包涵。