欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Mybatis的学习笔记01]——初识Mybatis

程序员文章站 2024-03-24 17:32:58
...

6.1. 什么是MyBatis

MyBatis 是当前主流的 Java 持久层框架之一,它与 Hibernate 一样,也是一种 ORM 框架 。


MyBatis 是一个支持普通SQL查询、处处过程以及高级映射的持久层框架,它消除了视乎所有的JDBC代码和参数的手动设置以及对结果集的检索, 并使用简单的XML或注解进行配置和原始映射,

用以将接口和Java的POJO(普通Java对象)映射成数据库中的记录, 使得Java开发人员可以使用面向对象的编程思想来操作数据库。


[Mybatis的学习笔记01]——初识Mybatis

6.3. MyBatis的工作原理

MyBatis程序的工作原理, 如下图。

[Mybatis的学习笔记01]——初识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。

    对应
    对应
    Mapper.xml中配置的SQL语句
    MappedStatement对象
  • ⑦输入参数映射。 在执行方法时, 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();
}

}


相关标签: Java Web