MyBatis快速入门
- 第一个
MyBatis
起步案例
- 第一个
MyBatis
起步案例解析
- 基于Java的配置方式说明
生日快乐!🎂🎂🎂🎉🎉🎉🎉🎉
MyBatis初体验
0.需要编写的文件
Mybatis
总配置文件(Mybatis-config.xml
)
SQL
映射文件(Mapper.xml
)
DAO
接口
- 实体类
1.创建MyBatis项目
首先确保你的项目工程和下面的一样,创建的是Maven
项目。
2.添加坐标
在pom.xml
文件里面,需要添加MyBatis
的依赖。
1 2 3 4 5
| <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency>
|
理论上只需要添加这个依赖就可以使用MyBatis
了,但是在快速上手案例中,除了核心的MyBatis
之外,还需要加几个框架:
junit4
:测试框架,用来测试MyBatis
的运行
mysql
驱动包:连接MySQL数据库的驱动包
slf4j(log4j)
:日志框架
注意版本问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.33</version> </dependency>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency>
|
3.创建数据库
4.配置总配置文件(Mybatis-config.xml)
配置mybatis-Config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?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> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/oracleData"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments>: <mappers> <mapper resource="mappers/DepartmentDAOMapper.xml"/> </mappers> </configuration>
|
Mybatis
的总配置文件里面有好多配置,这里稍微解释下这几个配置的一些作用:
configuration
:作为一个主体配置,是总配置文件里面必须要有的标签,是一个顶层标签。
settings
:Mybatis
框架中的各种设置就靠这个标签,以setting
子标签为主题,Mybatis
为我们提供了很多以键值对的形式存在的配置,我们通过配置这些键值对,可以把Mybatis
框架调教配置得更加好用。
environments
:这个标签可以说是核心配置了,主要用来配置与数据库连接有关的东西,如连接URL、连接用户名、连接密码等。同样的,拥有子标签environment
,实际上可以配置多套environment
(合理,毕竟有些时候涉及到多个数据库连接),只要设置了default
属性,说明使用哪套环境即可。
剩下的有一个dataSource
标签,这个标签里面的东西,用过JDBC
的同学估计都不会陌生,第一个driver
是驱动包的驱动文件,第二个url
是连接地址,第三个username
是用户名,第四个password
是密码。这四个配置需要根据实际情况自己做更改
mappers
:该标签指定mapper
映射文件的位置,所谓的mapper
文件,我们一般称之为mapper
映射文件,这个文件一般存放我们执行的SQL
语句,并且和我们的DAO
接口绑定在一起。
5.创建实体类
创建domains/Department.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package domains;
public class Department { private Integer DEPTNO; private String DNAME; private String LOC;
@Override public String toString() { return "Department{" + "DEPTNO=" + DEPTNO + ", DNAME='" + DNAME + '\'' + ", LOC='" + LOC + '\'' + '}'; }
public Integer getDEPTNO() { return DEPTNO; }
public Department setDEPTNO(Integer DEPTNO) { this.DEPTNO = DEPTNO; return this; }
public String getDNAME() { return DNAME; }
public Department setDNAME(String DNAME) { this.DNAME = DNAME; return this; }
public String getLOC() { return LOC; }
public Department setLOC(String LOC) { this.LOC = LOC; return this; } }
|
所谓的实体类,也叫做Bean
,通过实体类创建出来的对象在数据库层面可以代表一行数据。那么啥是实体类对象呢?大家可以把实体类对象看成是一个个业务数据。
正如我们所说,实体类主要是承载我们开发的时候需要的业务数据,这些数据以类级别变量(字段)的形式存在,类似于我们学习C
时候的结构体。但实体类的组成添加了面向对象的特性,因此在获取实体类的数据的时候,我们需要给它编写setXXX()
、getxxx()
方法,我们一般称这一类的方法为Setter
和Getter
,除此之外,当我们需要把这个对象用于传输的时候,还需要把这个对象写成字符串的形式,因此还会有个方法叫toString()
。
6.创建DAO接口
大家在学习JavaWeb
的时候都会接触到一种对数据库的设计架构,叫DAO
,在DAO
架构里面,我们即需要些DAO
接口,还需要写实现类。
那么所谓的DAO
接口又是啥?传送门暂不可用
那我们现在创建一个简单的DAO
:
创建java/mappers/DepartmentDAO
接口
1 2 3 4 5 6 7 8 9
| package mappers;
import domains.Department;
import java.util.List;
public interface DepartmentDAO { List<Department> selectAll(); }
|
7.创建映射配置文件
我们之前稍微提了一嘴,所谓的映射配置文件,它的主要用于存储SQL
语句吧,同时跟DAO
的接口方法绑定在一起。那具体这个映射配置文件是怎么生效的,后面再介绍,这里可以先按着我写:
创建在resource/mappers/DepartmentDAOMapper.xml
文件
1 2 3 4 5 6 7 8 9
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="mappers.DepartmentDAO"> <select id="selectAll" resultType="domains.Department"> SELECT DEPTNO, DNAME, LOC FROM dept </select> </mapper>
|
8.配置日志框架配置文件
配置日志框架不属于mybatis
的具体内容。所以这里不具体介绍了。照着写吧
配置log4j.properties
文件
1 2 3 4 5 6 7 8
| log4j.rootLogger=ERROR, stdout
log4j.logger.mapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
|
9.运行MyBatis
现在只剩下一步了,只要运行了这一步MyBatis
就能够跑起来了。这一步通常用于测试数据库连接用。想要运行MyBatis
需要靠测试框架JUnit
。
要想把MyBatis跑起来,需要按照这个步骤:
1.创建SqlSessionFactoryBuilder
对象,传入总配置文件
2.通过SqlSessionFactoryBuilder
的build()
创建SqlSessionFactory
3.通过SqlSessionFactory
的openSession()
创建SqlSession
4.通过
在src/test/java/DepartmentMapperTest.java
文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package mappers;
import domains.Department; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test;
import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.function.Consumer;
public class DepartmentMapperTest {
private static SqlSessionFactory sqlSessionFactory;
@Before public void init() throws IOException { InputStream stream = getClass().getResourceAsStream("../mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); sqlSessionFactory = sqlSessionFactoryBuilder.build(stream); stream.close(); }
@Test public void testSelectAll(){ SqlSession sqlSession = sqlSessionFactory.openSession(); DepartmentDAO departmentDAO = sqlSession.getMapper(DepartmentDAO.class); List<Department> countries = departmentDAO.selectAll(); countries.forEach(new Consumer<Department>() { public void accept(Department country) { System.out.println(country); } }); sqlSession.close(); } }
|
10.运行结果
如果你的控制台能够打印出这样的东西,那恭喜你。MyBatis的第一个入门案例,搞定啦!🎉🎉🎉
MyBatis初体验解析
在这里我们解析一下MyBatis的一些运行细节:
首先第一步我们需要定义一个mybatis-config.xml
这个也是MyBatis的总配置文件,里面最核心的东西是定义数据库的连接URL
、驱动、用户名、密码等。当我们把定义好的总配置文件传递给SqlSessionFactoryBuilder
,SqlSessionFactoryBuilder
通过build()
+总配置文件构建出SqlSessionFactory
代表一套连接环境。然后再通过SqlSessionFactory
的openSession()
,拿到SqlSession
对象,SqlSession
的getMapper()
获取DAO
接口的实现类,从而走上人生巅峰进行SQL
语句查询。
基于Java代码的总配置文件起步
当然也可以使用Java代码的形式来代替XML的形式来配置起步,这里只贴上代码,并稍微解释下步骤:
- 创建
DataSource
对象
- 创建
TransactionFactory
对象,对应transactionManager
标签
- 创建
Environment
对象,相当于environment
标签
- 创建
Configuration
对象,相当于configuration
标签
- 创建
SqlSessionFactoryBuilder
对象,传入Configuration
对象
- 接下来的步骤和测试时候一模一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @Test public void testSelectAll2(){ MysqlDataSource mysqlDataSource = new MysqlDataSource(); mysqlDataSource.setURL("jdbc:mysql://localhost:3306/oracleData"); mysqlDataSource.setUser("root"); mysqlDataSource.setPassword("sujiewei"); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, mysqlDataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(DepartmentDAO.class); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); sqlSessionFactory = sqlSessionFactoryBuilder.build(configuration); SqlSession sqlSession = sqlSessionFactory.openSession(); DepartmentDAO departmentDAO = sqlSession.getMapper(DepartmentDAO.class); List<Department> countries = departmentDAO.selectAll(); countries.forEach(new Consumer<Department>() { public void accept(Department country) { System.out.println(country); } }); sqlSession.close(); }
|
实际上总配置文件里面的所有东西,都能通过Java
代码的形式进行构建。像Settings
标签、typealisa标签等。