MyBatis概述
MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO(Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
1.什么是MyBatis
MyBatis框架也被称为ORM(Object/ Relational Mapping,对象关系映射)框架。所谓ORM,就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系自动将Java应用程序中的对象持久化到关系型数据库的表中。
使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(Persisent Object,PO),而ORM框架则会通过映射关系将这些面向对象的操作转换成底层的SQL操作。
MyBatis:一个半自动映射的框架。这里所谓的“半自动”是相对于Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系,而Hibernate只需提供POJO和映射关系即可。与Hibernate相比,虽然使用MyBatis手动编写SQL要比使用Hibernate的工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则,它还支持存储过程等。对于一些复杂的和需要优化性能的项目来说,显然使用MyBatis更加合适。
2. MyBatis的安装
- 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。
- 如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
MyBatis入门程序
(用户信息管理为例)
1.查询用户
在实际开发中,查询操作通常都会涉及单条数据的精确查询以及多条数据的模糊查询。那么使用MyBatis框架是如何进行这两种查询的呢?
如何使用MyBatis框架根据用户编号查询客户信息,以及根据用户名模糊查询用户信息。
1.1 根据用户编号(id)查询用户信息
【示例6-1】根据用户编号查询用户信息主要是通过查询用户表中的主键(这里表示唯一的用户编号)来实现的,其具体实现步骤如下。
步骤01 在MSQL数据库中创建一个名为db_mybatis的数据库,在此数据库中创建一个t_user表,同时预先添加几条数据,对应的SQL语句如下所示。
# 创建数据库db_mybatis
CREATE DATABASE db_mybatis;
# 使用db_mybatis
USE db_mybatis;
#创建表t_user
CREATE TABLE t_user (
id int(32) PRIMARY KEY AUTO_INCREMENT,
username varchar(50),
job varchar(50),
phone varchar(16)
);
# 向数据表t_user插入数据
INSERT INTO t_user VALUES(1,'zhangsan','teacher','13959798568');
INSERT INTO t_user VALUES(2,'lisi','worker','13959798569');
INSERT INTO t_user VALUES(3,'wangwu','doctor','13959798570');
步骤04 在src目录下创建一个com.ssm.po包,在该包下创建持久化类User,并在类中声明id、username、jobs和phone属性,及其对应的getter/setter法。
package com.ssm.po;
/**
* 功能描述
*
* @author: 衍生星球
* @date: 2023年05月08日 15:05
*/
public class User {
private Integer id; //用户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;
}
public String toString() {
return "User [id= " + id + ", username= " + username + ", jobs= " + jobs + ", phone= " + phone + "]";
}
}
从上述代码可以看出,持久化类User与普通的JavaBean并没有什么区别,只是其属性字段与数据库中的表字段相对应。实际上,User就是一个POJO(普通Java对象)。MyBatis就是采用POJO作为持久化类来完成对数据库操作的。
步骤05 在src目录下创建一个com.ssm.mapper包,并在包中创建映射文件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.ssm.mapper.UserMapper">
<!-- 根据用户编号获取用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="com.ssm.po.User">
select * from t_user where id=# {id}
</select>
</mapper>
第02、03行是MyBatis的约束配置,第04~09行是需要程序员编写的映射信息。其中,<mapper>
元素是配置文件的根元素,包含一个namespace属性,该属性为<mapper>
元素指定了唯一的命名空间,通常会设置成“包名+SQL映射文件名”的形式。子元素<select>
中的信息是用于执行查询操作的配置,其id属性是<select>
元素在映射文件中的唯一标识;parameterType属性用于指定传入参数的类型,这里表示传递给执行SQL的是一个Integer类型的参数;resultType属性用于指定返回结果的类型,这里表示返回的数据是Customer类型。在定义的查询SQL语句中,“#{}”用于表示一个占位符,相当于“?”;而“#{id}”表示该占位符待接收参数的名称为id。
步骤06 在src目录下创建MyBatis的核心配置文件mybatis-config.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 1.配置环境,默认的环境 id 为 mysql-->
<environments default="mysql">
<!-- 1.2 配置id为mysql 的数据库环境-->
<environment id="mysql">
<!-- 使用JDBC的事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost;3306/db_mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--2.配置 Mapper的位置-->
<mappers>
<mapper resource="com.ssm.mapper.UserMapper.xml"/>
</mappers>
</configuration>
第02、03行是MyBatis的配置文件的约束信息。下面<configuration>
元素中的内容是开发人员需要编写的配置信息。这里按照<configuration>
子元素的功能将配置分为了两个步骤:
- 第1步,配置环境;
- 第2步,配置mapper的位置。
步骤07 在src目录下创建一个com.ssm.test包,在该包下创建测试类MybatisTest,并在类中编写测试方法findUserByIdTest()。
package com.ssm.test;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.ssm.po.User;
/**
* 入门程序测试类
*
* @author: 衍生星球
* @date: 2023年05月08日 16:54
*/
public class MybatisTest {
/**
* 根据用户id查询用户信息
*/
@Test
public void findUserByIdTest() throws Exception {
//1.读取配置文件
String resourse = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resourse);
//2.根据配置文件构建SqlSessionFactory实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.通过SqlSessionFactory创建SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.SqlSession执行映射文件中定义的SQL,并返回映射结果
User user = sqlSession.selectOne("com.ssm.mapper.UserMapper.findUserById",2);
//5.打印输出结果
System.out.println(user.toString());
//6.关闭SqlSession
sqlSession.close();
}
}
在findUserByIdTest()
方法中,首先通过输入流读取了配置文件,然后根据配置文件构建了SqlSessionFactory
对象。接下来通过SqlSessionFactory
对象又创建了SqlSession
对象,并通过SqlSession
对象的selectOne()
方法执行查询操作。selectOne()
方法的第1个参数表示映射SQL的标识字符串,由UserMapper.xml
中<mapper>
元素的namespace
属性值+<select>
元素的id属性值组成;第2个参数表示查询所需要的参数,这里查询的是用户表中id为1的用户。为了查看查询结果,这里使用了输出语句输出查询结果信息。最后,程序执行完毕时,关闭了SqlSession
。