编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

【Spring】— 初识MyBatis(springboot mybatisplus)

wxchong 2024-07-19 05:46:16 开源技术 14 ℃ 0 评论

一、MyBatis概述

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO(Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

(一)什么是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更加合适。

(二) 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入门程序

(用户信息管理为例)

(一)查询用户

在实际开发中,查询操作通常都会涉及单条数据的精确查询以及多条数据的模糊查询。那么使用MyBatis框架是如何进行这两种查询的呢?如何使用MyBatis框架根据用户编号查询客户信息,以及根据用户名模糊查询用户信息。

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');

步骤02 在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作为持久化类来完成对数据库操作的。

步骤03 在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。

步骤04 在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的位置。

步骤05 在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`。

2. 根据用户名模糊查询用户信息

【示例6-2】模糊查询的实现只需要在映射文件中通过<select>元素编写相应的SQL语句,并通过SqlSession的查询方法执行该SQL语句即可。其具体实现步骤如下。

步骤01 在映射文件UserMapper.xml中添加根据用户名模糊查询用户信息列表的SQL语句,具体实现代码如下。

<!-- 根据用户名模糊查询用户信息 --> 
<select id="findUserByName" parameterType="String" resultType="com.ssm.po.User">
  			select * from t_user where username like '%${value}%' 
</select>

与根据用户编号查询相比,上述配置代码中的属性id、parameterType和SQL语句都发生了相应变化。其中,SQL语句中的`“${}”`用来表示拼接SQL的字符串,即不加解释地原样输出。`“${value}”`表示要拼接的是简单类型参数。

注意 在使用“${}”进行SOL字符串拼接时,无法防止SQL注入问题。想要既能实现模糊查询,又能防止SOL注入,可以对上述映射文件UserMapper.xml中模糊查询的select语句进行修改,使用MySQL中的concat函数进行字符串拼接。具体修改示例如下所示。

步骤02 在测试类MybatisTest中添加一个测试方法findUserByNameTest(),其代码如下所示。

@Test
    public void findUserByNameTest() throws Exception {
        String resourse = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourse);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> users = sqlSession.selectList("com.ssm.mapper.UserMapper.findUserByName","g");
        //循环输出结果集
        for (User user : users) {
            System.out.println(user.toString());
        }
        sqlSession.close();
    }

在上述代码中,由于可能查询出多条数据,因此调用SqlSession的selectList()方法来查询返回结果的集合对象,并使用for循环输出结果集对象。执行findUserByNameTest ()方法后,控制台的输出结果如图所示。

使用MyBatis框架已成功查询出了用户表中用户名带有“g”的两条客户信息。至此,MyBatis入门程序的查询功能就已经讲解完了。从上面两个查询方法中可以发现,MyBatis的操作大致可分为以下几个步骤。

  • 步骤01 读取配置文件。
  • 步骤02 根据配置文件构建 SqlSessionFactory。
  • 步骤03 通过SqlSessionFactory创建SqlSession。
  • 步骤04 使用SqlSession对象操作数据库(包括查询、添加、修改、删除以及提交事务等)。
  • 步骤05 关闭SqlSession。

(二)添加客户

在MyBatis的映射文件中,添加操作是通过<insert>元素来实现的。例如,向数据库中的t_user表中插入一条数据可以通过如下配置来实现。

<!-- 添加用户信息 --> 
<insert id="addUser" parameterType="com.ssm.po.User"> 
 				 insert into t_user(username, jobs, phone)values (#{username}, #{jobs},#{phone}) 
</insert>

在上述配置代码中,传入的参数是一个User类型,该类型的参数对象被传递到语句中时,#{username}会查找参数对象User的username属性,#{jobs}和#{phone}也是一样的,并将其属性值传入SQL语句中。

【示例6-3】为了验证上述配置是否正确,下面编写一个测试方法来执行添加操作。

在测试类MybatisTest中添加测试方法addUserTest(),其代码如下所示。

 @Test
    public void addUserTest() throws Exception {
        String resourse = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourse);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建User对象,并向对象中添加数据
        User user = new User();
        user.setUsername("tom");
        user.setJobs("worker");
        user.setPhone("17339880001");
        //执行sqlSession的插入方法,返回SQL影响的行数
        int rows = sqlSession.insert("com.ssm.mapper.UserMapper.addUser", user);
        //通过返回结果判断插入是否执行成功
        if (rows > 0) {
            System.out.println("成功添加" + rows + "条数据!");
        } else {
            System.out.println("添加数据失败!");
        }
        //提交事务
        sqlSession.commit();
        //关闭sqlSession
        sqlSession.commit();
    }

上述代码中,创建了User对象,并向User对象中添加了属性值;然后通过SqlSession对象的insert()方法执行插入操作,并通过该操作返回的数据来判断插入操作是否执行成功;最后通过SqlSession的commit()方法提交事务,并通过SqlSession.close()方法关闭了SqlSession。运行之后结果:

查看数据库数据:

(三)更新用户

MyBatis的更新操作在映射文件中是通过配置<update>元素来实现的。如果需要更新用户数据,可以通过如下代码配置来实现。

<!-- 更新用户信息 --> 
<update id="updateUser" parameterType="com.ssm.po.User"> 
				update t_user set username=#{username}, jobs=#{jobs}, phone=#{phone} where id=#{id} 
</update>

与插入数据的配置相比,更新操作配置中的元素与SQL语句都发生了相应变化,但其属性名却没有变。

【示例6-4】为了验证配置是否正确,下面以6.2.2小节中新插入的数据为例进行更新用户测试。

在测试类MybatisTest中添加测试方法updateUserTest(),将id为4的用户的jobs属性值修改为“teacher”,其代码如下所示。

	@Test
    public void updateUserTest() throws Exception {
        String resourse = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourse);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建User对象,并对对象中的数据进行模拟更新
        User user = new User();
        user.setId(4);
        user.setUsername("tom");
        user.setJobs("teacher");
        user.setPhone("17339880001");
        //执行sqlSession的插入方法,返回SQL影响的行数
        int rows = sqlSession.insert("com.ssm.mapper.UserMapper.updateUser", user);
        //通过返回结果判断插入是否执行成功
        if (rows > 0) {
            System.out.println("成功添加" + rows + "条数据!");
        } else {
            System.out.println("添加数据失败!");
        }
        //提交事务
        sqlSession.commit();
        //关闭sqlSession
        sqlSession.commit();
    }

与添加用户的方法相比,更新操作的代码增加了id属性值的设置,并调用SqlSession的update()方法对id为4的用户的jobs属性值进行修改。运行之后查看数据库数据:

(四)删除用户

删除用户之前我们多建几条用户数据,如图所示:

MyBatis的删除操作在映射文件中是通过配置<delete>元素来实现的。在映射文件UserMapper.xml中添加删除客户信息的SQL语句。

<!-- 删除用户信息 --> 
<delete id="deleteUser" parameterType="Integer">
				delete from t_user where id=#{id}
</delete>

从上述配置的SQL语句中可以看出,我们只需要传递一个id值就可以将数据表中相应的数据删除。要测试删除操作的配置十分简单,只需使用SqlSession对象的delete()方法传入需要删除数据的id值即可。

【示例6-5】在测试类MybatisTest中添加测试方法deleteUserTest(),该方法用于将id为4的用户信息删除,其代码如下所示。

   @Test
    public void deleteUserTest() throws Exception {
        String resourse = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourse);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行sqlSession的删除方法,返回SQL影响的行数
        int rows = sqlSession.delete("com.ssm.mapper.UserMapper.deleteUser", 7);
        //通过返回结果判断插入是否执行成功
        if (rows > 0) {
            System.out.println("成功删除了" + rows + "条数据!");
        } else {
            System.out.println("删除数据失败!");
        }
        //提交事务
        sqlSession.commit();
        //关闭sqlSession
        sqlSession.commit();
    }

运行之后结果:

查看数据库数据:

至此,MyBatis入门程序的增、删、改、查操作学习结束。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表