MyBatis是一個ORM框架,廣泛運用于Java后臺開發(fā),是SSM框架中的一個,用于建立數據庫和JavaBean的映射關系,簡化了JDBC的一系列操作,如數據庫連接、statement的創(chuàng)建等等,使得后臺人員只需要關注SQL語句的編寫
一、MyBatis的依賴導入
1. Ideal中新建Maven工程
我這邊是建了一個Maven主工程,以及Maven的Module,后續(xù)依賴導入直接放入主工程pom中,方便其他Module使用

2. Maven導入MyBatis依賴
Maven中心地址:https://mvnrepository.com/
Maven中心搜索mybatis,這邊根據個人習慣,使用熱度高的版本

將上面標簽復制到工程pom文件中
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
</dependencies>
3. 導入其他依賴
為了測試和方便,再分別導入junit和lombok插件,使用lombok插件記得開啟注解解析器
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!--lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
jdbc依賴導入,這邊使用的MySQL數據庫
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
4. 配置MyBatis核心配置文件
在resources目錄下新建sqlMapConfig.xml,約定俗成使用該文件名

內容為jdbc的配置信息:
<?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://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
二、 運行測試
接下來來簡單的使用下,后續(xù)會對如何使用MyBatis進行詳細說明
1. 數據庫中準備數據
使用下面sql創(chuàng)建表和插入一些數據,就是oracle中默認的幾張表
create table DEPT(
DEPTNO int(2) not null,
DNAME VARCHAR(14),
LOC VARCHAR(13)
);
alter table DEPT
add constraint PK_DEPT primary key (DEPTNO);
create table EMP
(
EMPNO int(4) primary key,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR int(4),
HIREDATE DATE,
SAL double(7,2),
COMM double(7,2),
DEPTNO int(2)
);
alter table EMP
add constraint FK_DEPTNO foreign key (DEPTNO)
references DEPT (DEPTNO);
create table SALGRADE
(
GRADE int primary key,
LOSAL double(7,2),
HISAL double(7,2)
);
create table BONUS
(
ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL double(7,2),
COMM double(7,2)
);
insert into DEPT (DEPTNO, DNAME, LOC)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into DEPT (DEPTNO, DNAME, LOC)
values (20, 'RESEARCH', 'DALLAS');
insert into DEPT (DEPTNO, DNAME, LOC)
values (30, 'SALES', 'CHICAGO');
insert into DEPT (DEPTNO, DNAME, LOC)
values (40, 'OPERATIONS', 'BOSTON');
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (1, 700, 1200);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (2, 1201, 1400);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (3, 1401, 2000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (4, 2001, 3000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (5, 3001, 9999);
完成后如下:

2. 新建Dept類
對應數據庫中的dept表

包結構:

Dept類 :
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept implements Serializable {
/**
* 部門編號
*/
private Integer deptno;
/**
* 部門名稱
*/
private String dname;
/**
* 地址
*/
private String loc;
}
3. 在resources目錄下新建xml映射文件

DeptMapper.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">
<!--暫時命名為a-->
<mapper namespace="a">
<!--public List<Dept> findAll(){ }-->
<select id="findAll" resultType="com.aruba.bean.Dept">-- resultType對應實體類
select * from dept
</select>
</mapper>
4. 在sqlMapConfig.xml中配置映射文件路徑
光創(chuàng)建了映射文件,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>
<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://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--加載mapper映射文件-->
<mappers>
<mapper resource="com/aruba/mapper/DeptMapper.xml"/>
</mappers>
</configuration>
5. 測試代碼
創(chuàng)建測試類:

內容如下:
public class Test1 {
private SqlSession sqlSession;
@Before
public void init() throws IOException {
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder();
// 將配置文件作為參數傳入
sqlSession = sb.build(Resources.getResourceAsStream("sqlMapConfig.xml")).openSession();
}
@Test
public void test1(){
List<Dept> result = sqlSession.selectList("findAll");
result.forEach(System.out::println);
}
}
運行結果:

可以看到我們成功得獲得數據庫中的數據,并且MyBatis將數據自動轉換為Java中的實體類
三、日志配置
MyBatis默認支持的日志框架如下:

可以通過配置文件進行指定使用哪個日志框架,我們這邊使用的log4j1日志框架
1. 導入log4j依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 創(chuàng)建log4j配置文件
在resources目錄下新建log4j.properties文件,文件名必須一致

#定義全局日志級別調試階段推薦debug
#制定使用哪種方式輸出日志,這邊只輸出到控制臺,要保存到文件,在后面加上logfile
log4j.rootLogger=debug,stdout
#輸出控制臺
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
#日志保存到文件中
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=d:/msb.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
3. MyBatis配置指定日志框架
不指定會自動查找,所以這步可以省略,如果要配置的話settings必須在environments之上
sqlMapConfig.xml:

4. 測試運行
結果:

現(xiàn)在可以看到sql語句輸出了
四、其他配置
1. 事務配置(了解即可)
事務我們在之前就已經配置好了,在配置文件sqlMapConfig.xml的environment標簽下:

transactionManager可選項如下:
- JDBC :就是使用數據庫連接自帶的事務
- MANAGED :相當于不使用事務。交由容器來管理,如Spring
2.映射文件的加載方式
目前我們使用的是:

加載方式一共有4種:
- resource:資源文件路徑
- url:網絡路徑
- class:指定類的全路徑
- package:包掃描,就是不需要一個一個添加了
后續(xù)基于接口代理會用到類加載的方式
3. 實體類別名處理
在映射文件DeptMapper.xml中,目前resultType需要使用全包名:

我們可以在MyBatis配置文件sqlMapConfig.xml中,對類進行別名處理

方便復制:
<!--為實體類設置別名-->
<typeAliases>
<typeAlias type="com.aruba.bean.Dept" alias="dept"/>
</typeAliases>
這時我們可以在映射文件中使用別名代替全包名

別名處理也支持包掃描,將包下所有實體類進行別名處理,默認每個實體類的別名是首字母小寫的類名
<!--為實體類設置別名-->
<typeAliases>
<!-- <typeAlias type="com.aruba.bean.Dept" alias="dept"/>-->
<!--掃描com.aruba.bean下所有實體類-->
<package name="com.aruba.bean"/>
</typeAliases>
五、外部屬性配置文件
我們想把數據庫鏈接信息存儲在properties文件中,然后在MyBatis配置文件中讀取
1. 創(chuàng)建jdbc.properties
在resources中創(chuàng)建文件

內容如下:
jdbc_driver=com.mysql.cj.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc_username=root
jdbc_password=root
2.配置文件中讀取

<?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>
<!-- 引入外部properties文件-->
<properties resource="jdbc.properties"></properties>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--為實體類設置別名-->
<typeAliases>
<!-- <typeAlias type="com.aruba.bean.Dept" alias="dept"/>-->
<!--掃描com.aruba.bean下所有實體類-->
<package name="com.aruba.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 使用外部properties文件中的值-->
<property name="driver" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
</environment>
</environments>
<!--加載mapper映射文件-->
<mappers>
<mapper resource="com/aruba/mapper/DeptMapper.xml"/>
<!--包掃描-->
<package name="com.aruba.mapper"/>
</mappers>
</configuration>
好了,MyBatis的配置和初步使用就到此結束了