什么是Mybatis
Mybatis(前身是ibatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动配置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO(java普通对象)映射成数据库中的记录,使得我们可以使用面向对象的思想来操作数据库。
mybatis也被称为ORM(对象关系映射)框架。所谓ORM就是一种解决面向对象与关系型数据库中数据类型不匹配的技术通过描述JAVA对象与数据库表之间的映射关系,自动将JAVA应用程序中的对象持久化到关系型数据库表中。
两种ORM框架Hibernate与MyBatis的区别
Hibernate:是一个全表映射的框架,Hibernate会根据制定的存储逻辑,自动生成对应的SQL,其开发效率更高但是不能通过优化SQL来优化性能。它只适用于场景不太复杂对性能要求不高的项目中。
MyBatis:是一个半自动映射的框架,相对于Hibernate来说它需要手动匹配提供POJO、SQL和映射关系,而Hibernate只需要提供POJO和映射关系即可。与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但Mybatis可以配置动态SQL并优化SQL,支持存储过程,更是后需要优化性能的复杂项目。
Mybatis的下载和使用
mybatis的下载链接
点击Releases打开页面
之后会看见最近发布的一系列版本的Mybatis
然后下面的文件分别对应的是mybatis的压缩包,window环境下的源码包,Linux环境下的源码包。
Mybatis的工作原理
(1)读取Mybatis配置文件mybatis-config.xml。mybatis-config.xml作为Mybatis的全局配置文件,配置了MyBatis的运行环境信息,其中主要内容是获取数据库连接。
(2)加载映射文件Mapper.xml。Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语句,需要在mybatis-config.xml文件的加载中才能执行。mybatis-config.xml文件可以加载多个配置文件,每个配置文件对应数据库中的一张表。
(3)构建会话工厂。通过Mybatis的环境等配置信息构建绘画工厂SqlSessionFactory。
(4)创建SqlSession对象。由会话工厂创建Sqlsession对象,该对象中包含了执行SQL的所有方法。
(5)Mybatis底层定义了一个Executor接口来操作数据库,它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
(6)在Executor接口的执行方法中,包含一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等Mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的id即是MappedStatement的id。
(7)输入参数映射。在执行方法时,MappedStatement对象会对用户执行SQL语句的输入参数进行定义,Executor执行器会通过MappedStatement对象在执行SQL前,将输入的Java对象映射到SQL语句中。这里的映射过程就类似于在JDBC编程中对preparedStatement对象设置参数的过程。
(8)输入结果映射。在数据库中执行完SQL语句后,MappedStatement对象会对SQL执行输出的结果进行定义,Executor执行器会通过MappedStatement对象在执行完SQL语句后,将输入结果映射至JAVA对象中。
Mybatis入门小程序
查询客户
1.根据客户编号查询客户信息
(1)在MySQL数据库中,创建一个名为mybatis的数据库,在此数据库中创建一个t_customer表,预先插入几条数据使用Navicat。
(2)在编译器中创建一个项目,导入相应Mybatis的核心JAR包和lib中的依赖JAR包,以及MySQL数据库的驱动JAR包。
(3)由于Mybatis默认使用log4j输入日志信息,所以要查看控制台的输出SQL语句,那么就需要在classpath下配置其日志文件。在项目src目录之下创建log4j.properties文件。配置文件代码的内容可以在Mybatis的压缩包中的使用手册中找到,在MyBatis使用手册中的Logging小结。图片中说的很清楚,创建一个叫log4j,properties的文件,内容如下所示,并将其放在你的类路径中。
(4)在java目录下创建一个com.ove.po包,在该包下创建对应的Customer类。
public class Customer implements Serializable {
private Integer id;
private String username;
private String jobs;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobs() {
return jobs;
}
public void setJobs(String jobs) {
this.jobs = jobs;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", jobs='" + jobs + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
(5)在resources目录下,创建一个com.ove.mapper包,在包中创建映射文件CustomerMapper.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.ove.mapper.CustomerMapper">
<!--查询查询所有 id 是 Dao的方法名称-->
<select id="findCustomerById" parameterType="Integer" resultType="com.ove.po.Customer">
select * from t_customer where id = #{id};
</select>
</mapper>
其中第二到三行是Mybatis的约束配置后面是我们需要写的。其中mapper是配置文件的根元素,它包含一个namespace属性,该属性为这个mapper指定了唯一的命名空间,一般会设置为包名+SQL映射文件名。子元素select中的信息是用于查询操作的,可以将其想象成一个方法,属性id是select元素在该映射文件中的唯一标识,可以想象成方法的名字,parameterType用于指定传入参数类型,resultType用于指定返回结果的类型,#{}代表占位符,相当于?,而#{id}表示该占位符待接收参数的名称为id。
(6)在resources目录下创建Mybatis的核心配置文件mybatis-config.xml最好是叫这个名字,可以想象成一种规范。我下面采用的是使用properties标签来配置数据库。
<?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">
<!--mybatis的主配置文件-->
<configuration>
<properties resource="db.properties"/>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<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>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/ove/mapper/CustomerMapper.xml"/>
</mappers>
</configuration>
(7)在test目录下创建对你供应的测试包,编写测试方法findCustomerByIdTest。
@Test
public void findCustomerById(){
//通过工具类获取会话
SqlSession session = MybatisUtils.getSession();
Customer customer = session.selectOne("com.ove.mapper.CustomerMapper.findCustomerById",1);
System.out.println(customer);
session.close();
}
暂无评论内容