[Mybatis的学习笔记01]——初识Mybatis
6.1. 什么是MyBatis
MyBatis 是当前主流的 Java 持久层框架之一,它与 Hibernate 一样,也是一种 ORM 框架 。
MyBatis 是一个支持普通SQL查询、处处过程以及高级映射的持久层框架,它消除了视乎所有的JDBC代码和参数的手动设置以及对结果集的检索, 并使用简单的XML或注解进行配置和原始映射,
用以将接口和Java的POJO(普通Java对象)映射成数据库中的记录, 使得Java开发人员可以使用面向对象的编程思想来操作数据库。
6.3. MyBatis的工作原理
MyBatis程序的工作原理, 如下图。
-
①读取 MyBatis 配置文件
mybatis-config .xml
。 mybatis-config.xml 作为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,其中主要内容是获取数据库连接。
下面是一个mybatis-config.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> <!--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.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <!--2.配置Mapper的位置, 用于加载mapper--> <mappers> <mapper resource="com/itheima/mapper/CustomerMapper.xml" /> </mappers> </configuration>
-
②加载映射文件Mapper.xml。该文件中配置了操纵数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。mybatis-config.xml可以加载多个配置文件,每个配置文件对应数据库中的一张表。
下面是一个Mapper.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.itheima.mapper.CustomerMapper"> <!-- 以下内容是配置的SQL语句 --> <!-- 根据客户编号获取客户信息 --> <select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer"> select * from t_customer where id=#{id} </select> <!-- 添加客户 --> <insert id="addCustomer" parameterType="com.itheima.po.Customer"> insert into t_customer(username, jobs, phone) values (#{username}, #{jobs}, #{phone}) </insert> <!-- 更新客户 --> <update id="updateCustomer" parameterType="com.itheima.po.Customer"> update t_customer set username=#{ username }, jobs=#{jobs}, phone=#{phone} where id=#{id} </update> <delete id="deleteCustomer" parameterType="Integer"> delete from t_customer where id=#{id} </delete> </mapper>
-
③构建会话工厂。通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory 。
以下一构建会话工厂的代码片段。
//读取文件 InputStream inputStream = Resources.getResourceAsStream(resource); //构建SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
④)创 SqlSession 对象,由会话工厂创建 SqlSession 对象,该对象中包含了执行 SOL
的所有方法。
下面是创建SqlSession对象的部分代码
SqlSession sqlSession = sessionFactory.openSession();
-
⑤MyBatis 底层定义了一个 Executor 接口来操作数据库,它会根据 SqlSession 传递的参
数动态地生成需要执行的 SOL 语句,同时负责查询缓存的维护。
-
⑥在 Executor 接口的执行方法中,包含一个 MappedStatement 类型的参数,对映射信息的封装用于存储要映射的 SQL 语句的 id 、参数等。Mapper.xml 文件中配置一个SQL
对应一个 MappedStatement 对象。SQL的id 即是 MappedStatement的id。
-
⑦输入参数映射。 在执行方法时, MappedStatement 对象会对用户执行 SOL 语句的输入 参数进行定义(可以定义为 Map 、Li st 类型、基本类型和 POJO 类型)。 Executor 执行器会通过
MappedStatement 对象在执行 SQL 前,将输入的 Java 对象映射到 SQL 语句中。 这里对输入参
数的映射过程就类似于 JDBC 编程中对 preparedStatement 对象设置参数的过程。
-
⑧输出结果映射 在数据库中执行完 SOL 语句后, MappedStatement 对象会对 SOL
行输出的结果进行定义(可以定义为 Map 和List 类型、基本类型、 POJO 类型 Executor 执行
器会通过 MappedStatement 对象在执行 SOL 语句后,将输出结果映射至 Java 对象中 这种将
输出结果映射到 Java 对象的过程就类似于 JDBC 编程中对结果的解析处理过程
6.4.入门的实例
①首先初建数据库和表
#创建 个名称为 mybatis 的数据库
CREATE DATABASE mybatis;
#使用 mybatis 数据库
USE mybatis ;
#创建 个名称为 customer 的表
CREATE TABLE t customer (
id int(32) PRlMARY KEY AUTO INCREMÈNT ,
username varchar(50) ,
jobs varchar(50) ,
phone varchar(16)
);
插入数据
INSERT INTO t_customer VALUES('1',' joy' , 'doctor' , ' 13521210111 ');
INSERT INTO t_customer VALUES('2',' jack' , 'teacher' , ' 13521210112 ');
INSERT INTO t_customer VALUES('3',' jack' , 'worker' , ' 13521210113 ');
②导入mybatis的核心jar包和依赖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xw1QS8x-1589705542199)(D:\笔记图片集\1589705150783.png)]
③由于Mybatis默认使用log4j输出日志信息,所以我们压在src添加一个log4j.properties文件, 内容如下。
## Global logging configuration
#log4j.rootLogger=ERROR, stdout
## MyBatis logging configuration...
#log4j.logger.com.itheima=DEBUG
## Console output...
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
#Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.itheima=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
④创建pojo类, 如下。
package com.itheima.po;
/**
*客户持久化类
*/
public class Customer {
private Integer id; //主键id
private String username;//客户名称
private String jobs;// 职业
private String phone;// 电话
//getters and setters
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 "Customer [id="+id+",username="+username+
",jobs="+jobs+", phone="+phone+"]";
}
}
⑤创建一个Mapper.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">
<!-- namespace 表示命名空间 -->
<mapper namespace="com.itheima.mapper.CustomerMapper">
<!-- 根据客户编号湖区客户信息 -->
<select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
select * from t_customer where id=#{id}
</select>
<!-- 根据客户名模糊查询客户信息列表 -->
<!--使用${}拼接字符串无法防止SQL注入 -->
<select id="findCustomerByName" parameterType="String" resultType="com.itheima.po.Customer">
select * from t_customer where username like '%${value}%'
</select>
<!-- 根据客户名模糊查询客户信息列表2 -->
<!-- 使用concat()函数进行字符串拼接, 防止sql注入 -->
<select id = "findCustomerByName2" parameterType="String" resultType="com.itheima.po.Customer">
select * from t_customer where username like concat('%', #{value}, '%')
</select>
<!-- 添加客户 -->
<insert id="addCustomer" parameterType="com.itheima.po.Customer">
insert into t_customer(username, jobs, phone)
values (#{username}, #{jobs}, #{phone})
</insert>
<!-- 更新客户 -->
<update id="updateCustomer" parameterType="com.itheima.po.Customer">
update t_customer set username=#{ username }, jobs=#{jobs}, phone=#{phone}
where id=#{id}
</update>
<delete id="deleteCustomer" parameterType="Integer">
delete from t_customer where id=#{id}
</delete>
</mapper>
⑥在src目录下创建Mybatis的核心配置文件 mybatis-config .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>
<!--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.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!--2.配置Mapper的位置 -->
<mappers>
<mapper resource="com/itheima/mapper/CustomerMapper.xml" />
</mappers>
</configuration>
⑦创建测试类, 如下
package com.itheima.test;
import com.itheima.utils.MybatisUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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.jupiter.api.Test;
import com.itheima.po.*;
public class MybatisTest {
@Test
public void findCustomerByIdTest() throws IOException {
//1.读取配置文件
// String resource = "mybatis-config.xml";
// InputStream inputStream = Resources.getResourceAsStream(resource);
//2.根据配置文件构建sqlSessionFactory
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.通过sqlSessionFactory 创建SqlSession
SqlSession sqlSession = MybatisUtils.getSession();
//4. SqlSession 执行映射文件中定义的SQL, 并返回映射结果
Customer customer = sqlSession.selectOne("com.itheima.mapper"+".CustomerMapper.findCustomerById", 1);
//打印输出结果
System.out.println(customer);
//5.关闭SqlSession
sqlSession.close();
}
/**
* 根据用户名称来模糊查询用户信息
* @throws IOException
*/
@Test
public void findCustomerByNameTest() throws IOException {
String resource = "mybatis-config.xml";
//读取文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession= sessionFactory.openSession();
List<Customer> customers = sqlSession.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByName", "j");
for(Customer customer : customers) {
System.out.println(customer);
}
sqlSession.close();
}
/**
* 添加客户
* @throws IOException
*/
@Test
public void addCustomerTest() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
Customer customer = new Customer();
customer.setUsername("rose");
customer.setPhone("133333533092");
customer.setJobs("student");
int rows = sqlSession.insert("com.itheima.mapper"+".CustomerMapper.addCustomer", customer);
if (rows > 0) {
System.out.println("你成功插入了"+rows+"条数据!");
}else {
System.out.println("执行插入操作失败!!!");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
/**
* 更新客户
* @throws IOException
* */
@Test
public void updateCustomerTest() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Customer customer = new Customer();
customer.setId(4);
customer.setUsername("rose");
customer.setJobs("programmer");
customer.setPhone("13311111111");
int rows = sqlSession.update("com.itheima.mapper"+".CustomerMapper.updateCustomer", customer);
if(rows > 0) {
System.out.println("你成功修改了"+rows+"条数据!");
}else {
System.out.println("执行修改失败!!");
}
sqlSession.commit();
sqlSession.close();
}
/**
* 删除客户
*/
@Test
public void deleteCustomerTest() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int rows = sqlSession.update("com.itheima.mapper"+".CustomerMapper.deleteCustomer", 4);
if(rows > 0) {
System.out.println("你成功删除了"+rows+"条数据!");
}else {
System.out.println("执行删除操作失败!!");
}
sqlSession.commit();
sqlSession.close();
}
}
Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
int rows = sqlSession.update("com.itheima.mapper"+".CustomerMapper.deleteCustomer", 4);
if(rows > 0) {
System.out.println("你成功删除了"+rows+"条数据!");
}else {
System.out.println("执行删除操作失败!!");
}
sqlSession.commit();
sqlSession.close();
}
}
推荐阅读
-
Mybatis学习笔记 - 01
-
[Mybatis的学习笔记01]——初识Mybatis
-
Java学习笔记-Day75 MyBatis 框架(二)
-
MyBatis学习笔记——插件机制(AOP)
-
springcloud学习-01 建父工程+idea设置(自己看的)【周阳springcloud2020学习笔记】
-
基于SpringMVC的Java Web学习笔记01 - 下载jar 博客分类: 开发技术 webjar
-
Mybatis基础学习(一):通过Mybatis完成对数据库的基本CRUD操作
-
Mybatis CRUD 复习笔记 添加用户 返回新增用户的id值 #{}与${}的区别
-
01、针对mssql2005的分页 博客分类: Extjs+mybatis CC++C#DAOSQL
-
01、针对mssql2005的分页 博客分类: Extjs+mybatis CC++C#DAOSQL