如果我们从数据库中读取了一个用户的两个属性——用户名和密码。此时我们希望把这两个属性放入一个java的用户对象中。我们可以选择new一个user对象,向构造器传入我们刚刚读取的两个属性。但一旦从数据库中读取的内容变多,我们就需要new很多新的对象。这时我们就可以通过xml和myBatis来配置一种映射关系,当我从数据库中读取时,自动完成java对象的创建。
1. 创建对应的类
以上面为例。要想把数据库里的数据映射成一个java对象,首先我们需要有一个对应的java类来描述数据库中的这个对象。
package Mybatis;import lombok.Data;@Data
public class User {String username; //名称最好和数据库字段名称保持一致,不然可能会映射失败导致查询结果丢失String password;
}
2.Lombok
lombok是一种可以简化代码的框架,这里的@Data注释表明:在编译时,lombok框架会自动将这个类重新编译,添加一些常用方法,如 toString
、equals
、hashCode
、以及所有字段的 getter 和 setter 方法。所以在这个类里,即使字段默认为protected的,也没有编写getter和setter方法,但是在这个类外,我们依旧可以使用getter和setter方法来编辑类。
3.mapper
我们需要一种配置文件(映射关系)来告诉myBatis:对于某一种特定的sql语句,应该把sql里user的a内容映射到 java中user类的a字段上。
我们在工程文件的大目录下创建一个配置文件Mapper.xml,配置文件内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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类所在的包名,这个地方每个人不一样,根据你的类的位置来决定。
4.在myBatis配置文件里添加mapper
当我们完成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 configurationPUBLIC "-//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>
5.SqlSessionFactory
我们已经配置好了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语句,它也需要关闭,所以写进trytry (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对象: