MyBatis 是一个开源的持久层框架,它的主要作用是简化数据库操作,使得开发者能够更方便地与数据库进行交互。 MyBatis 允许开发者使用简单的 XML 或注解配置 SQL 映射,从而实现数据库操作,而不需要手动编写繁琐的 JDBC 代码。
我们之前学习过,xml是一种用来存储映射关系的语言。而当我们和数据库做连接的时候,其实用java语言实现了很多映射关系。比如当我们用jdbc连接数据库的时候,如果把这个连接看作一个抽象的对象,这个连接对象有许多属性,比如url,用户名,密码等等。这时如果我们使用xml和myBatis来配置这些关系,就不需要专门编写一个类来连接数据库了。
再举例来说,如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象,向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多,我们就需要new很多新的对象。这时我们就可以通过xml和myBatis来配置一种映射关系,当我从数据库中读取时,自动完成java对象的创建。
总体而言,MyBatis 提供了一种简单而灵活的方式来处理数据库交互,同时保持了足够的可定制性。它被广泛用于 Java 项目中,尤其在与关系型数据库的交互中表现出色。
Releases · mybatis/mybatis-3 (github.com)
下载assets的第一个。(已经编译过的,而不是源码)找到里面的jar包,复制到工程文件的lib文件夹下(如果没有lib文件夹,就直接复制到工程的大文件夹下),然后右键,选择添加为库,就配置完成了。?
我们在工程文件的大目录下(最外层)创建一个xml文件,用来连接数据库。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>
<!-- XML 配置文件的根元素,包含了 MyBatis 的全局配置信息 -->
<!-- 定义了数据库环境配置 -->
<environments default="development">
<!-- 默认使用的数据库环境 -->
<!-- 定义一个数据库环境 -->
<environment id="development">
<!-- 事务管理器的配置 -->
<transactionManager type="JDBC"/>
<!-- 数据源的配置 -->
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 数据库连接 URL -->
<property name="url" value="jdbc:mysql://localhost:3306"/>
<!-- 数据库用户名 -->
<property name="username" value="root"/>
<!-- 数据库密码 -->
<property name="password" value="020809"/>
</dataSource>
</environment>
</environments>
</configuration>
重点在于
?<!-- 数据库驱动 -->
? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.cj.jdbc.Driver"/>? ? ? ? ? ? ? ? <!-- 数据库连接 URL -->
? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://localhost:3306"/>? ? ? ? ? ? ? ? <!-- 数据库用户名 -->
? ? ? ? ? ? ? ? <property name="username" value="root"/>? ? ? ? ? ? ? ? <!-- 数据库密码 -->
? ? ? ? ? ? ? ? <property name="password" value="020809"/>
这里的内容需要根据自己的实际情况而变化。这里使用的是mysql数据库。
如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象,向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多,我们就需要new很多新的对象。这时我们就可以通过xml和myBatis来配置一种映射关系,当我从数据库中读取时,自动完成java对象的创建。?
以上面为例。要想把数据库里的数据映射成一个java对象,首先我们需要有一个对应的java类来描述数据库中的这个对象。
package Mybatis;
import lombok.Data;
@Data
public class User {
String username; //名称最好和数据库字段名称保持一致,不然可能会映射失败导致查询结果丢失
String password;
}
lombok是一种可以简化代码的框架,这里的@Data注释表明:在编译时,lombok框架会自动将这个类重新编译,添加一些常用方法,如 toString
、equals
、hashCode
、以及所有字段的 getter 和 setter 方法。所以在这个类里,即使字段默认为protected的,也没有编写getter和setter方法,但是在这个类外,我们依旧可以使用getter和setter方法来编辑类。
我们需要一种配置文件(映射关系)来告诉myBatis:对于某一种特定的sql语句,应该把sql里user的a内容映射到 java中user类的a字段上。
我们在工程文件的大目录下创建一个配置文件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">
<!--
MyBatis 映射器(Mapper)XML 文件,用于定义 SQL 映射配置。
映射器文件通常用于将数据库操作与 Java 方法关联起来。
-->
<!-- 定义映射器命名空间,通常与对应的 Java 接口或类的全限定名一致 -->
<mapper namespace="User">
<!--
定义一个查询操作,id 属性为该操作的唯一标识符。
resultType 属性指定查询结果的返回类型,这里是 com.test.entity.Student。
-->
<select id="selectUser" resultType="Mybatis.User">
select * from user
</select>
<!--
在实际项目中,查询语句通常更为复杂,可以包含条件、关联查询等。
这里的示例是一个简单的查询所有user的语句。
-->
</mapper>
注意这一段:
<!-- 定义映射器命名空间,通常与对应的 Java 接口或类的全限定名一致 --> <mapper namespace="User"> <!-- 定义一个查询操作,id 属性为该操作的唯一标识符。 resultType 属性指定查询结果的返回类型 --> <select id="selectUser" resultType="Mybatis.User"> select * from user </select>
?namespace是这个mapper的名字
id指的是“select * from user”这条语句的名字,起了这个名字后,我们就可以在后面的java代码里用这个名字指代这条sql语句
resultType是需要映射成的类型的位置(不是电脑里的路径,是在java里的位置,哪个包(也可能不在包里,看你自己),哪个类),在这个例子里User是类名,Mybatis是User类所在的包名,这个地方每个人不一样,根据你的类的位置来决定。
当我们完成mapper之后,我们需要告诉java:我配置好了这个一个mapper。而myBatis和java连接就是靠我们一开始配置的哪个xml配置文件,所以我们在那个配置文件里添加如下语句:
<mappers>
<mapper url="file:UserMapper.xml"/>
</mappers>
?“file:”表明这里的mapper是一个本地的file,冒号后可以跟mapper文件的相对路径或绝对路径。(这里是相对路径)(不是上面说的Java里的位置)(不是上面namespace属性里mapper的名字)
路径example:C:\Users\86136\projects\IdeaProjects\javaWeb\UserMapper.xml
添加完成后的完整的myBatis配置文件如下:
<?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>
<!-- XML 配置文件的根元素,包含了 MyBatis 的全局配置信息 -->
<!-- 定义了数据库环境配置 -->
<environments default="development">
<!-- 默认使用的数据库环境 -->
<!-- 定义一个数据库环境 -->
<environment id="development">
<!-- 事务管理器的配置 -->
<transactionManager type="JDBC"/>
<!-- 数据源的配置 -->
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 数据库连接 URL -->
<property name="url" value="jdbc:mysql://localhost:3306"/>
<!-- 数据库用户名 -->
<property name="username" value="root"/>
<!-- 数据库密码 -->
<property name="password" value="020809"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper url="file:UserMapper.xml"/>
</mappers>
</configuration>
我们已经配置好了myBatis,当我们希望使用myBatis的时候,我们就会创建一个SqlSessionFactory类,在这个类里使用myBatis的各种功能。
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,我们可以通过SqlSessionFactory
来创建多个新的会话——SqlSession
对象,你可以认为这就是之前JDBC中的Statement
对象,会话之间相互隔离,没有任何关联。(我可以通过mysql的用户界面访问数据库,创建会话,也可以通过idea来访问数据库,这两种访问方式虽然都访问了相同的数据库,但相互没有关联)。
package Mybatis;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
/**
* 我们已经配置好了myBatis,当我们希望使用myBatis的时候,
* 我们就会创建一个SqlSessionFactory类,在这个类里使用myBatis的各种功能。
*/
public class Main {
public static void main(String[] args) throws FileNotFoundException {
//寻找配置文件
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(new FileInputStream("myBatis_config.xml"));
//sqlSession就像之前的statement一样,创建一个连接,执行sql语句,它也需要关闭,所以写进try
try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){
//这里的参数是mapper里指定的那个sql语句的名称
//也就是UserMapper.xml里的id字段的名称
List<User> student = sqlSession.selectList("selectUser");
//这行代码使用了 Java 8 引入的新特性之一,称为方法引用(Method Reference)。
// 具体来说,System.out::println 是一个静态方法引用,用于将 println 方法关联到 System.out 对象上。
//在这里,System.out::println 等效于 lambda 表达式 (s) -> System.out.println(s)。
// 它表示将遍历 student 集合的每个元素,并将每个元素传递给 System.out.println 方法,实现在控制台上打印每个元素的效果。
student.forEach(System.out::println);
}
}
}
运行后应该可以打印出数据库的全部内容,并且list中存放了和数据库等大小的user对象: