一篇入魂,带你认识并使用Mybatis
JDBC是什么
概念
JDBC(Java Database Connectivity)是一种用于在Java应用程序和数据库之间进行连接和交互的Java API(应用程序编程接口)。它提供了一组类和接口,使开发人员能够通过标准的SQL语句来执行数据库操作,如查询、插入、更新和删除数据。
JDBC 提供了一个统一的接口,使得开发人员可以使用相同的代码来连接不同的数据库管理系统(DBMS),如MySQL、Oracle、SQL Server等。通过 JDBC,开发人员可以建立与数据库的连接、发送 SQL 语句、处理结果集和事务等。
优点
- 广泛支持:JDBC 是 Java 的标准API,被几乎所有主流的数据库管理系统所支持。
- 跨平台性:Java 是一种跨平台的编程语言,而 JDBC 作为其数据库访问的标准接口,也具备跨平台性。
- 灵活性:JDBC 提供了灵活的编程方式,开发人员可以使用原生的 SQL 语句来直接操作数据库,从而有更大的控制权和自由度。
缺点
- 低层编程:JDBC 是一种较低层次的数据库访问接口,需要开发人员手动编写和管理与数据库的连接、语句和结果集等。
- 处理复杂性:对于复杂的数据库操作,如处理关联查询、对象映射等,使用纯 JDBC 可能变得复杂和繁琐。
- 对象关系映射(ORM)限制:JDBC 不直接支持对象关系映射(ORM),需要开发人员自己处理将数据库结果集转换为对象的逻辑。
什么是MyBatis
概述
about
核心是操作数据库的一个框架,底层 对JDBC进行了封装
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
方式
MyBatis 提供了两种配置和映射的方式:XML 配置和注解。
- XML 配置:通过编写简单的 XML 配置文件,开发人员可以将原始类型、接口和 Java POJO 对象与数据库中的记录进行映射关联。在 XML 配置文件中,可以定义 SQL 语句、参数映射、结果集映射等信息,MyBatis 根据这些配置信息来执行数据库操作。
- 注解:除了 XML 配置外,MyBatis 还提供了注解的方式来进行配置和映射。开发人员可以在 Java 类或接口上使用注解,来指定与数据库中表或字段的映射关系。通过在代码中直接添加注解,可以更加灵活地定义数据库操作。
映射
Mybatis是一个ORM(对象关系映射)框架:将数据库中查询出来的字段名与java中实体类
的属性进行一一对应,要使数据库表和实体类进行映射,遵守以下规则
数据库中的字段名如果有多个字符,中间使用下划线连接,Java中是以驼峰命名规则进行命名
优点
- 与JDBC相比,减少了50%的代码量
- 简单易学
- 将SQL语句从程序代码中彻底分离出来,可以重用
- 提供XML标签,支持编写动态SQL
- 支持对象与数据库表的ORM字段关系映射
MyBatis中文文档:https://mybatis.net.cn/getting-started.html
缺点
学习曲线较陡峭:相对于其他 ORM 框架,MyBatis 具有较高的学习曲线。
大量的 XML 配置:在 MyBatis 中,配置信息主要通过 XML 文件进行定义。虽然这样的设计可以提供灵活性和可配置性,但也意味着需要编写大量的 XML 配置文件。
繁琐的 SQL 编写:相比于完全基于对象的 ORM (对象关系映射)框架,MyBatis 需要手动编写大量的 SQL 语句。
缺乏自动化:相较于一些全自动化的 ORM 框架,MyBatis 需要手动编写和维护持久化代码。
对象关系映射(ORM)的限制:MyBatis 是一个半自动的 ORM 框架,它并不会对数据库模式和对象实体之间的关系进行严格的管理。
使用MyBatis
环境配置
导入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectLombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
</dependencies>
导入了如下依赖
MyBatis(org.mybatis:mybatis:3.5.10):MyBatis 是一个开源的持久层框架,用于在 Java 应用程序中与数据库进行交互。
MySQL Connector(mysql:mysql-connector-java:5.1.38):这是 MySQL 数据库的官方 Java 驱动程序。
JUnit(junit:junit:4.13.2):JUnit 是一个 Java 编程语言的单元测试框架
Lombok(Project Lombok)是一个Java库,它通过使用注解来减少Java类中的冗余代码。
项目结构
jdbc.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hqyj03?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimeZone=Asia/Shanghai
password=aaa
username=root
方便给mybatis配置文件设置值
mybatis配置文件
在resource目录下创建mybatis配置文件,使用xml方式编写数据库连接信息
- 在idea中设置mybatis配置文件模板,使得创建的时候更方便(下面有配置文件内容)
- 在配置文件中编写数据库连接信息。
在内容里面可以看见${}这种语法。
${driver}
是 MyBatis 配置文件(mybatis-config.xml)中的占位符语法,${driver}
即为一个占位符,它会根据 ${jdbc.driver}
所引用的属性值进行替换。用于引用配置文件中定义的属性值。
在 MyBatis 的配置文件中,可以使用 <properties>
元素定义一组属性,并通过 ${propertyName}
的方式来引用这些属性。
<?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配置内容时,有顺序限制-->
<configuration>
<properties resource="jdbc.properties"></properties>
<!--mybatis环境,default属性指定一个环境-->
<environments default="development">
<!--id属性自定义的环境唯一标识符-->
<environment id="development">
<!--指定使用jdbc事务管理-->
<transactionManager type="JDBC"/>
<!--使用mybatis内部带连接池功能的数据源-->
<dataSource type="POOLED">
<!--获取配置驱动-->
<property name="driver" value="${driver}"/>
<!--获取配置url-->
<property name="url" value="${url}"/>
<!--获取配置账号-->
<property name="username" value="${username}"/>
<!--获取配置密码-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--映射器,映射器的 XML 映射文件包含了 SQL 代码和映射定义信息-->
<mappers>
<mapper resource="com/yjg/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
Tip
default="development"
表示将 development
这个环境设置为默认环境。这意味着如果没有明确指定使用哪个环境,MyBatis 将使用名为 development
的环境作为默认环境。
在 <environments>
元素内部,你可以定义多个 <environment>
子元素来配置不同的环境。每个 <environment>
元素都包含一个或多个数据源(<dataSource>
)、事务管理器(<transactionManager>
)和其他可选的配置。
编写代码
数据库代码
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
实体类
import lombok.Data;
@Data
public class User {
private Integer id;
private String username;
private String password;
}
接口
Java 接口文件(Mapper 接口):Mapper 接口用于定义数据库操作的方法。
public interface UserMapper {
//根据id查询用户
User queryUserById();
//查询用户数量
int queryUserCount();
//查询全部用户
List<User>queryAllUser();
//插入用户
int addUser();
//更新用户
int updateUser();
//查询一个用户返回值类型为Map类型
// @MapKey( "id")加上就指定id字段作为key,可以不加
Map<String,Object> queryUserToMap();
}
映射文件
映射文件(Mapper XML 文件):映射文件用于定义 SQL 语句的映射关系,将 Java 对象与数据库表进行关联。
-
<mapper>
标签的namespace
属性用于指定映射文件与对应的接口或类之间的关联关系。通过指定namespace
属性,MyBatis 就能够将映射文件与对应的接口或类进行绑定,使得在使用时可以更方便地进行调用。具体而言,
namespace
属性的取值应为接口或类的全限定名(包括包路径)。这里的接口或类所指的是与映射文件相对应的 Java 接口或类,它们定义了与数据库交互的方法和 SQL 语句的对应关系。 -
<select>
、<insert>
、<update>
、<delete>
元素:分别用于定义查询、插入、更新、删除操作的 SQL 语句。其中,id
属性指定了该语句的唯一标识符 -
``resultType
指定了查询结果的对象类型:当
resultType` 指定的类型是一个基本类型(如 String、Integer 等)或简单的 JavaBean 类时,MyBatis 会通过列名和属性名的匹配自动将查询结果映射到对应的属性上。
<?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">
<!--在configuration配置内容时,有顺序限制-->
<!-- namespace:Mapper接口的全路径,使其和UserMapper对应-->
<mapper namespace="com.yjg.mybatis.mapper.UserMapper">
<!--执行DML操作时,返回值都是影响行数所以不需要指定返回值类型-->
<insert id="addUser">
INSERT into user VALUES(8,"www","www");
</insert>
<update id="updateUser"></update>
<select id="queryUserById" resultType="com.yjg.mybatis.pojo.User">
select * from user where id=1;
</select>
<select id="queryUserCount" resultType="Integer">
select count(*)from user;
</select>
<!--写List里面装入的数据类型-->
<select id="queryAllUser" resultType="com.yjg.mybatis.pojo.User">
select *from user;
</select>
<!-- 返回值为Map类型会将表的字段作为key字段对应值作为value-->
<select id="queryUserToMap" resultType="map">
select * from user where id=1;
</select>
</mapper>
为什么UserMapper.xml,目录路径要和接口的类路径相同?
是因为 MyBatis 默认使用相同的目录结构和名称来进行映射关系的配置。
在 MyBatis 中,Mapper 接口与映射文件(Mapper XML 文件)是一一对应的关系。按照默认的约定,映射文件的路径和名称应该与 Mapper 接口的类路径和名称相同,只是后缀名不同(接口是 .java,映射文件是 .xml)。
当使用 Maven 构建项目时,一般会将配置文件(包括 MyBatis 的映射文件)放在 src/main/resources 目录下。
这些资源文件会在构建过程中被拷贝到输出目录(如 target/classes 目录)中,以便在运行时可以正确地加载和使用。
所以,在使用 Maven 构建项目时,一般将 MyBatis 的映射文件(UserMapper.xml 等)放在 src/main/resources 下的相应目录中
输出目录,可见最后是放在一起的
返回值类型resultType设置
- 如果是实体类,必须写全路径。
- 如果是执行DML操作。返回值都是影响行数不驽要再指定返回值类型。
- 如果是jdk自带的类型,可以写全路径,也可写别名
测试类
public class Test1 {
SqlSession sqlSession;
@Before
public void before() throws IOException {
//1.读取mybatis核心配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//2.实例化SqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.调用 build() 方法并传入配置文件的输入流 configStream,
//可以创建一个配置了数据库连接信息、映射文件路径等的 SqlSessionFactory 对象。
SqlSessionFactory factory = builder.build(inputStream);
//4.获取SqlSession
sqlSession = factory.openSession(true);//打开自动提交
}
//Mybatis中提供数据库操作的核心接口:SqlSession
@Test
public void test1() throws Exception{
//5.给接口创建代理实现类对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//6.调用接口方法执行对应sql操作
User user = mapper.queryUserById();
System.out.println(user);
}
@Test
public void test2() throws Exception{
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.queryUserCount();
System.out.println(i);
}
@Test
public void test3(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.queryAllUser();
users.forEach(System.out::println);
}
@Test
public void test4(){
//自动提交是默认关闭的需要手动提交事务
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.addUser();
//提交事务可以使用sqlSession.commit();也可以在@Before注解里面打开
System.out.println(i);
}
@Test
public void test5(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map map = mapper.queryUserToMap();
System.out.println(map);
}
}
总结
MyBatis 映射流程主要包括以下几个步骤:
- 配置数据库信息:在 MyBatis 的配置文件中,需要配置数据源(DataSource)的相关信息,如数据库驱动、连接地址、用户名和密码等。
- 定义实体类:创建与数据库表结构对应的 Java 实体类,其中的属性与表中的字段相对应。
- 创建映射文件:编写与数据库操作相关的 SQL 语句,并将其存储在映射文件中。映射文件通常采用 XML 格式,用于定义 SQL 语句以及与之对应的实体类方法。
- 配置映射文件:在 MyBatis 的配置文件中,需要配置映射文件的路径,使 MyBatis 能够找到并解析映射文件。
- 创建 SqlSessionFactory:
SqlSessionFactory
初始化时会加载并解析mybatis配置文件,其中包含了数据库连接的配置信息,如数据库的 URL、用户名、密码等。当调用SqlSessionFactory.openSession()
方法创建SqlSession
对象 - 创建 SqlSession:通过 SqlSessionFactory 创建 SqlSession 对象,SqlSession 提供了进行数据库操作的方法。
SqlSessionFactory
并没有直接连接数据库,它只是用于创建和配置SqlSession
对象,而SqlSession
才是用于实际的数据库交互。 - 进行数据库操作:利用 SqlSession 对象执行具体的数据库操作,如插入数据、查询数据、更新数据或删除数据等。这些操作会根据映射文件中定义的 SQL 语句进行执行,将结果返回给调用方。
SqlSession
是 MyBatis 的会话对象,用于执行 SQL 语句并与数据库进行交互。通过调用getMapper()
方法,里面填入的参数是映射器接口(测试代码中UserMapper.class就是),可以获取一个映射器(Mapper)的实例。映射器的实例就是一个能够执行与数据库交互的方法的对象,它基于映射器接口和配置的 SQL 语句,提供了一种便捷的方式来进行数据库操作。