在使用Mybatis后,希望能对Mybatis有更深入的理解和研究,此文是个人阅读后的笔记,和对知识内容的重点记录。旨在加深对技术的记忆理解和便于之后对技术的温习。希望也能给热爱技术的小伙伴一些帮助,欢迎大家讨论技术问题,也欢迎大家指出文中有问题的地方,但请勿开杠东南西北风!!! 如对小伙伴有帮助,点个赞收藏一下趴!总结不易,感谢感谢!!!
Java程序都是通过JDBC(Java Data Base Connectivity)连接数据库的,这样我们就可以通过sql对数据库进行编程。JDBC是SUN公司提出的规范,只定义了接口规范,具体的实现是由各个数据库厂商实现的。(JBDC是一种典型的桥接模式)。
传统的JDBC大致分为以下几步:
而传统的JDBC存在一些弊端。
于是对象关系映射(Object Relational Mapping)模型出现了,简称ORM。简单的说,ORM模型就是数据库的表和简单Java对像的映射关系模型,通过这层关系可以简单迅速地把数据库表的数据转换为pojo。
Hibernate是一种全自动化持久层框架,程序员不需要在写任何的sql。只需要提供Hibernate的配置信息文件hibernate.cfg.xml,制定映射规则的文件XXX.hbm.xml,以及与XXX表相映射的POJO类。
本文就不展开讲Hibernate的使用了,感兴趣的猿猿们可以另去学习。
优点:
缺点:
所以,Hibernate只适用于场景不太复杂,要求性能不太苛刻的场景。
在项目开发中,灵活、Sql优化、性能等是比较重要的因素,显然Hibernate无法满足我们的要求,这时Mybatis诞生了。
Mybatis是一个半自动化映射框架。之所以称它为半自动,是因为它需要手工匹配提供pojo、Sql和映射关系,而全表映射的Hibernate只需要提供pojo和映射关系便可。
Mybatis更为灵活,可以动态生成映射关系,拥有动态列、动态表名、支持存储过程,同时提供了简易的缓存、日志、级联。
使用mybatis需要提供基础配置文件、映射文件、 mapping接口类、以及相映射的POJO类。
Mybatis提供的映射文件包含以下三个部分。
properties元素,设置,typeAliases别名,typeHandlers类型处理器,对象工厂等就配置可不用配置。
下面是一个具体的配置文件 mybatis_config.xml。
文件里是数据库和其他基础配置信息。
这里主要对environments配置和mappers配置进行说明。
environments配置环境——配置环境可以注册多个数据源(dataSource),每一个数据源分为两大部分:一个是数据库源的配置,另外一个是数据库事务(transactioniManager)的配置。
数据库事务——数据库事务MyBatis是交由SqiSession去控制的,我们可以通过SqiSession提交 (commit)或者回滚(rollback)。在大部分的工作环境下,我们都会使用Spring框架来控制它。
数据源——MyBatis内部为我们提供了3种数据源的实现方式。
我们只需要把数据源的属性type定义为UNPOOLED、 POOLED. JNDI即可。这3种实现方式比较简单,只需要配置参数即可,但有时候我们需要使用其他的数据源。
如果使用自定义数据源,它必须实现org.apache.ibatis.datasource.DataSourceFactory接口。比如说我们可能要用DBCP数据源,这个时候我们需要自定义数据源。
然后按照下面的方法配置就可以使用DBCP数据源了。(自定义的数据源绝大多数情况下用不到)
在开发过程中,配置文件一般只需要做好基础的配置可以了。如要做其他配置,这一块网上有很多资料。
mappers——配置映射文件,Mybatis会读取这个映射文件生成映射器。
基础配置文件配好之后,其次是映射文件。
如下图 Role.xml 文件。
这里给出了Sql,但是并没有给出映射规则。使用过mybatis的就会知道,我们使用的Sql列名和POJO的属性名保持一致,Mybatis会自动提供映射规则。
映射器是Mybatis最强大的工具,也是使用Mybatis时用的最多的工具。后面会重点讲到。
如下图 RoleMapper.java接口。
注意仅仅是接口,而无需实现类。实现类是Mybatis通过动态代理自动为我们创建的。后面会重点讲到。但如果只是简单掌握Mybatis的使用,不打算使用Mybatis插件的话可以跳过。
为了使用Mybatis,还需要建立SqlSessionFactory。
SqlSessionFactory的构建如下图:
public class Role {
String id;
String roleName;
String note;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
然后就可以使用Mybatis进行开发了。
这样就完成了Mybatis的代码编写,可见Mybatis更为灵活,我们可以自由书写Sql,定义映射规则。
他们的关系如下图:
构建SqlSessionFactory:
SqlSessionFactory是一个工厂接口而不是实现类,它的任务是创建SqlSession。两种创建方式:一是xml文件的方式;二是代码的方式。
推荐使用第一种, 1.避免硬编码,2.方便日后对配置的修改,3.避免重复编译代码。所以代码方式不做说明了。
xml配置方式,即配置一个上面提及的基础配置文件 (上文的mybatis_config.xml文件),然后创建一个XML文件输入流,用SqlSessionFactoryBuilder读取xml信息来创建SqlSessionFactory对象(上面有贴具体代码)。
构建SqlSession:
SqlSession是一个接口,它只是充当门面的作用,真正干活的是Executor接口。通过SqlSessionFactory对象调用openSession方法获取。
映射器:
映射器是Mybatis最复杂,最核心的组件。 映射器的实现方式有两种:一是xml的方式实现;二是通过代码方式实现。同样推荐第一种,1.代码方式是在Configuration里面注册Mapper接口,还需要在接口类写入Java注解,而Java注解是受限的,功能较少,xml方式更为灵活强大。2.Sql很复杂时,写在接口类里可读性很差。
xml配置方式:
(1)给出Java接口,即Mapper接口类(上文RoleMapper.java)。
(2)给出映射文件(上文Role.xml)(映射文件是在基础配置文件中配置了的)
然后就可以用SqlSession来获取这个Mapper,调用方法执行Sql。
Java注解方式:
如下图 RoleMapper2.java: