写在前言
mybatis 里面的配置文件是如何联系的
这是我第二次学习 mybatis 的理解,我理解的和如下图,config 包含了数据库的配置,以及 mappers,通过 mappers 可以找到各类 Mapper,这样就把配置文件,联系了起来。
Mybatis 连接数据库与 JDBC 连接数据库
JDBC 的工作原理
DriverManager 工具类,用于管理驱动,可以获取数据库的链接
Connection 表示 Java 与数据库建立的连接对象(接口)
PreparedStatement 发送 SQL 语句的工具
ResultSet 结果集,用于获取查询语句的结果
Mybaties 连接数据库的原理
1、新建一个 Maven 项目
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路(classpath)中即可。或者是利用 Maven 导入依赖(坐标),我们选择后者,所以要新建一个 Maven 项目。
2、配置 pom.xml
要使用 Mybatis,需要导入 Mybatis 的依赖。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
复制代码
为了简便开发,我们还引入了 Lombok,具体代码如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.you</groupId>
<artifactId>Mybatis-demo-01</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--导入Mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--引入Lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!--引入mysql的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
</project>
复制代码
如果左侧的 Maven 中没有显示依赖,就点击刷新按钮,刷新一下!
然后就可以看到依赖被导入进来
3、Xml 配置文件
XML 配置文件中包含了对 MyBatis 系统的核心加粗样式设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
1)写一个 mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dp83?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="200201203332"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="DeptMapper.xml"/>
</mappers>
</configuration>
复制代码
当然,还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。 注意 XML 头部的声明,它用来验证 XML 文档的正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
2)编写一个 Mapper.xml 配置文件
由上可知,Mapper.xml 是用来映射 sql 语句的文件
<?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="test">
<select id="queryAll" resultType="com.you.pojo.Dept">
select * from dept;
</select>
</mapper>
复制代码
命名空间
在之前版本的 MyBatis 中,命名空间(Namespaces)的作用并不大,是可选的。 但现在,随着命名空间越发重要,你必须指定命名空间。
命名空间的作用有两个:一个是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。
命名空间也可以解决 id 重复的问题,比如 UserMapper 和 DeptMapper 都有一个查询全部语句的 sql 名叫 queryAll,通过命名空间我就可以对相同的 id 进行区别。
什么是全限定名
全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如“com.foo.selectAllThings” 和“com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名。
也就是说在接口绑定的时候,我既可以用全限定名,也可以使用短名称,但如果短名称不唯一的话,那么我只能使用全限定名,所以为了不出错,你也可以选择全部使用全限定名。
3)编写实体类
由于 Mapper.xml 的返回类型用到了实体类,所以需要写一个实体类 Dept。新建一个实体类 Dept
package com.you.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
private Integer deptno;
private String deptname;
private String dp_source;
}
复制代码
4、编写启动类
编写一个启动类 MybatisRun
package com.you;
import com.you.pojo.Dept;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisRun {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException ioException) {
ioException.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
/* 执行sql语句 */
List<Dept> list = sqlSession.selectList("test.queryAll");
for (Dept dept : list) {
System.out.println(dept);
}
}
}
复制代码
评论