JDBC(Java Database Connectivity)是一种用于在Java应用程序和数据库之间进行连接和交互的Java API(应用程序编程接口)。它提供了一组类和接口,使开发人员能够通过标准的SQL语句来执行数据库操作,如查询、插入、更新和删除数据。
JDBC 提供了一个统一的接口,使得开发人员可以使用相同的代码来连接不同的数据库管理系统(DBMS),如MySQL、Oracle、SQL Server等。通过 JDBC,开发人员可以建立与数据库的连接、发送 SQL 语句、处理结果集和事务等。
核心是操作数据库的一个框架,底层 对JDBC进行了封装
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
MyBatis 提供了两种配置和映射的方式:XML 配置和注解。
Mybatis是一个ORM(对象关系映射)框架:将数据库中查询出来的字段名与java中实体类
的属性进行一一对应,要使数据库表和实体类进行映射,遵守以下规则
数据库中的字段名如果有多个字符,中间使用下划线连接,Java中是以驼峰命名规则进行命名
MyBatis中文文档:https://mybatis.net.cn/getting-started.html
学习曲线较陡峭:相对于其他 ORM 框架,MyBatis 具有较高的学习曲线。
大量的 XML 配置:在 MyBatis 中,配置信息主要通过 XML 文件进行定义。虽然这样的设计可以提供灵活性和可配置性,但也意味着需要编写大量的 XML 配置文件。
繁琐的 SQL 编写:相比于完全基于对象的 ORM (对象关系映射)框架,MyBatis 需要手动编写大量的 SQL 语句。
缺乏自动化:相较于一些全自动化的 ORM 框架,MyBatis 需要手动编写和维护持久化代码。
对象关系映射(ORM)的限制:MyBatis 是一个半自动的 ORM 框架,它并不会对数据库模式和对象实体之间的关系进行严格的管理。
<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类中的冗余代码。
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配置文件设置值
在resource目录下创建mybatis配置文件,使用xml方式编写数据库连接信息
在内容里面可以看见${}这种语法。
${driver}
是 MyBatis 配置文件(mybatis-config.xml)中的占位符语法,${driver}
即为一个占位符,它会根据 ${jdbc.driver}
所引用的属性值进行替换。用于引用配置文件中定义的属性值。
在 MyBatis 的配置文件中,可以使用
元素定义一组属性,并通过 ${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
的环境作为默认环境。
在
元素内部,你可以定义多个
子元素来配置不同的环境。每个
元素都包含一个或多个数据源(
)、事务管理器(
)和其他可选的配置。
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();
//查询全部用户
ListqueryAllUser();
//插入用户
int addUser();
//更新用户
int updateUser();
//查询一个用户返回值类型为Map类型
// @MapKey( "id")加上就指定id字段作为key,可以不加
Map queryUserToMap();
}
映射文件(Mapper XML 文件):映射文件用于定义 SQL 语句的映射关系,将 Java 对象与数据库表进行关联。
标签的 namespace
属性用于指定映射文件与对应的接口或类之间的关联关系。通过指定 namespace
属性,MyBatis 就能够将映射文件与对应的接口或类进行绑定,使得在使用时可以更方便地进行调用。
具体而言,namespace
属性的取值应为接口或类的全限定名(包括包路径)。这里的接口或类所指的是与映射文件相对应的 Java 接口或类,它们定义了与数据库交互的方法和 SQL 语句的对应关系。
、
、
、
元素:分别用于定义查询、插入、更新、删除操作的 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 下的相应目录中
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 映射流程主要包括以下几个步骤:
SqlSessionFactory
初始化时会加载并解析mybatis配置文件,其中包含了数据库连接的配置信息,如数据库的 URL、用户名、密码等。当调用 SqlSessionFactory.openSession()
方法创建 SqlSession
对象SqlSessionFactory
并没有直接连接数据库,它只是用于创建和配置 SqlSession
对象,而 SqlSession
才是用于实际的数据库交互。SqlSession
是 MyBatis 的会话对象,用于执行 SQL 语句并与数据库进行交互。通过调用 getMapper()
方法,里面填入的参数是映射器接口(测试代码中UserMapper.class就是),可以获取一个映射器(Mapper)的实例。映射器的实例就是一个能够执行与数据库交互的方法的对象,它基于映射器接口和配置的 SQL 语句,提供了一种便捷的方式来进行数据库操作。