最近在學(xué)習(xí)MyBatis相關(guān)的技術(shù)棒拂,根據(jù)教程搭建一個(gè)簡(jiǎn)單的MyBatis入門工程,現(xiàn)在將搭建思路簡(jiǎn)單的總結(jié)一下谜诫,所有流程均是按照《SpringMVC+MyBatis開發(fā)(朱要光)》書中的教程攻旦。目前處于比照葫蘆畫瓢階段,至于為什么要這么做牢屋,還是處于很懵懂的階段烙无,希望經(jīng)過一段時(shí)間的學(xué)習(xí),可以整理一份自己的見解怀估。
一合搅、數(shù)據(jù)庫準(zhǔn)備
//創(chuàng)建一個(gè)名為“mybatis_test"的數(shù)據(jù)庫
CREATE DATABASE mybatis_test;
//創(chuàng)建一張名為user的表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(120) COLLATE utf8_bin DEFAULT NULL,
`password` varchar(50) COLLATE utf8_bin DEFAULT NULL,
`gender` varchar(5) COLLATE utf8_bin DEFAULT NULL,
`email` varchar(100) COLLATE utf8_bin DEFAULT NULL,
`province` varchar(50) COLLATE utf8_bin DEFAULT NULL,
`city` varchar(50) COLLATE utf8_bin DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
//插入測(cè)試數(shù)據(jù)
INSERT INTO user (id, username, password, gender, email, province, city, birthday) values
(1, '張三', '111', '男', '1111@126.com', '河南省', '鄭州市', '1991-04-23'),
(2, '李四', '222', '男', '2222@126.com', '河北省', '邯鄲市', '1989-10-13'),
(3, '劉麗', '333', '女', '3333@126.com', '江蘇省', '蘇州市', '1994-06-09'),
(4, '李麗', '444', '女', '4444@126.com', '四川省', '成都市', '1992-11-07');
二灾部、搭建工程環(huán)境
2.1、創(chuàng)建工程
我用的開發(fā)工具為idea从藤,在idea中創(chuàng)建一個(gè)maven項(xiàng)目锁蠕,為什么我們要用maven項(xiàng)目,而不是普通的java項(xiàng)目悯搔,如果是普通的java項(xiàng)目舌仍,我們?nèi)绻蕾嚻渌捻?xiàng)目,我們就需要手動(dòng)把依賴的jar包復(fù)制到lib下灌曙,而且如果依賴的jar升級(jí)在刺,我們就需要重新copy,特別麻煩蚣驼,而且不容易管理隙姿。使用maven項(xiàng)目的話输玷,我們只需要在pom文件中維護(hù)依賴jar包的坐標(biāo)即可靡馁。maven的一些具體介紹和如果創(chuàng)建maven項(xiàng)目,大家可以自行百度赔嚎。
2.2胧弛、引入jar包
我們需要引入我們項(xiàng)目依賴的jar包结缚,在pom文件中維護(hù)依賴jar的坐標(biāo),如下:
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--數(shù)據(jù)庫連接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--日志輸出-->
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--SLF4J使你的代碼獨(dú)立于任意一個(gè)特定的日志API-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<!--Java 字節(jié)碼操控框架-->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
</dependency>
<!--Code生成類庫-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.10</version>
</dependency>
<!--使用spring的必備包,用來記錄程序運(yùn)行時(shí)的活動(dòng)的日志記錄-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--分析茵宪、編輯和創(chuàng)建Java字節(jié)碼的類庫-->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
</dependencies>
2.3稀火、創(chuàng)建工程目錄結(jié)構(gòu)
在src文件夾下創(chuàng)建三個(gè)包c(diǎn)n.com.mybatis.datasource(數(shù)據(jù)庫連接)、cn.com.mybatis.po(持久層對(duì)象)憾股、cn.com.mybatis.test(測(cè)試主程序)服球。
在src同級(jí)創(chuàng)建一個(gè)resource包,該目錄下放置mapper包(該包下創(chuàng)建一個(gè)UserMapper.xml文件斩熊,SQL映射文件)、log4j.properties(日志輸出配置文件)分冈、SqlMapConfig.xml(數(shù)據(jù)庫連接池配置文件)。
基本工程目錄結(jié)構(gòu)如下:
2.4集乔、編寫日志輸出環(huán)境配置文件---log4j.properties
這里使用的是目前比較流行的輸出日志信息的開源工具log4j扰路。
#日志輸出級(jí)別倔叼,經(jīng)常使用的級(jí)別:DEBUG(調(diào)試級(jí)別)、INFO(標(biāo)準(zhǔn)信息級(jí)別)哩罪、ERROR(錯(cuò)誤級(jí)別)巡验、WARN(異常級(jí)別)
# 在開發(fā)環(huán)境下日志級(jí)別要設(shè)成DEBUG,生產(chǎn)環(huán)境設(shè)為INFO或ERROR
#stdout將等級(jí)為DEBUG的日志信息輸出到stdout參數(shù)所指定的輸出載體中
log4j.rootLogger = DEBUG, stdout
# 設(shè)置stdout的輸出載體是哪種類型腹鹉,ConsoleAppender代表控制臺(tái)
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
#設(shè)置stdout的輸出載體的界面布局是哪種類型功咒,PatternLayout可以靈活地指定布局模式绞蹦,即自己去配置布局
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#界面布局選擇靈活布局類型,指定打印信息的具體格式景殷,
#%p 輸出優(yōu)先級(jí)猿挚,即DEBUG,INFO绩蜻,WARN办绝,ERROR,F(xiàn)ATAL
#%t 輸出產(chǎn)生該日志事件的線程名
#%m 輸出代碼中指定的消息
#%n 輸出一個(gè)回車換行符
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] - %m%n
2.5孕蝉、編寫數(shù)據(jù)庫連接池配置文件---SqlMapConfig.xml
該配置文件是Mybatis與數(shù)據(jù)庫建立連接的核心文件降淮。
<?xml version="1.0" encoding="utf-8"?>
<!--指定xml的版本信息和編碼格式信息(為上面一句配置的注釋,第一句必須是xml配置信息纳本,注釋也不可以-->
<!--DTD文檔定義類型腋颠,用來校驗(yàn)xml文件是否符合約定好的某種規(guī)范-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--日志模式-->
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--和spring整合后environments配置將被廢除-->
<environments default="development">
<environment id="development">
<!--使用JDBC事務(wù)管理-->
<transactionManager type="JDBC"/>
<!--數(shù)據(jù)庫連接池-->
<dataSource type="POOLED">
<!--數(shù)據(jù)庫驅(qū)動(dòng)信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--數(shù)據(jù)庫連接地址-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?characterEncoding=utf-8"/>
<!--數(shù)據(jù)庫用戶名-->
<property name="username" value="user"/>
<!--數(shù)據(jù)庫密碼-->
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
2.6淑玫、編寫SQL映射配置文件---UserMapper.xml
在Mybatis中絮蒿,幾乎所有的SQL語句都配置在Mapper映射文件中叁鉴。在mapper--UserMapper.xml文件中首先添加一個(gè)select語句配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybtis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace對(duì)SQL進(jìn)行分類化管理幌墓,實(shí)現(xiàn)不同業(yè)務(wù)SQL隔離-->
<mapper namespace="test">
<!--select:查詢語句常侣,id:唯一標(biāo)識(shí),對(duì)應(yīng)statement胳施,parameterType:輸入?yún)?shù)類型舞肆,resultType:結(jié)果類型-->
<select id="findUserById" parameterType="int" resultType="cn.com.mybatis.po.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>
2.7椿胯、配置映射文件
為了能讓Mybatis資源文件加載類解析Mapper文件,需要把Mapper文件的路徑配置在全局配置文件SqlMapConfig.xml的configuration結(jié)尾標(biāo)簽前仆抵。
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
2.8、編寫持久化實(shí)體類----cn.com.mybatis.po
持久化實(shí)體類是一個(gè)類中的成員變量與數(shù)據(jù)庫表中字段一一對(duì)應(yīng)的java類镣丑,一般這種類成為JavaBean。
在User類中金吗,創(chuàng)建了User的所有屬性信息摇庙,以及get和 set方法遥缕,并且創(chuàng)建了一個(gè)無構(gòu)造參數(shù)函數(shù)和一個(gè)有參構(gòu)造函數(shù)。
package cn.com.mybatis.po;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int id;
private String username;
private String password;
private String gender;
private String email;
private String province;
private String city;
private Date birthday;
public User() {
}
public User(int id, String username, String password, String gender, String email, String province, String city, Date birthday) {
super();
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.email = email;
this.province = province;
this.city = city;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
2.9单匣、編寫數(shù)據(jù)庫交互類----cn.com.mybatis.datasource
DataConnection類通過resource資源加載SqlMapConfig.xml配置文件夕凝,然后獲取SQL會(huì)話工廠sqlSessionFactory,之后使用會(huì)話工廠創(chuàng)建可以與數(shù)據(jù)庫交互的sqlSession類的實(shí)例對(duì)象户秤。
package cn.com.mybatis.datasource;
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;
public class DataConnection {
//配置文件
private String resource = "SqlMapConfig.xml";
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
public SqlSession getSqlSession() throws IOException{
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
2.10码秉、編寫測(cè)試用例----cn.com.mybatis.test
MyBatisTest類的功能為從數(shù)據(jù)庫中讀取id=1的用戶數(shù)據(jù),并在控制臺(tái)中打印出來鸡号。
package cn.com.mybatis.test;
import cn.com.mybatis.po.User;
import cn.com.mybatis.datasource.DataConnection;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.text.SimpleDateFormat;
public class MyBatisTest {
public DataConnection dataConn = new DataConnection();
@Test
public void TestSelect() throws IOException {
//通過DataConnection類獲取sqlSession會(huì)話對(duì)象
SqlSession sqlSession = dataConn.getSqlSession();
//sqlSession.selectOne最終結(jié)果與映射文件中所匹配的resultType類型
// statement對(duì)應(yīng)UserMappper.xml中的namespace加statement配置的id
// parameter對(duì)應(yīng)UserMappper.xml中parameterType類型的參數(shù)#{id}
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println("姓名:" + user.getUsername());
System.out.println("性別:" + user.getGender());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("生日:" + sdf.format(user.getBirthday()));
System.out.println("所在地:" + user.getProvince() + user.getCity());
//關(guān)閉sqlSession會(huì)話
sqlSession.close();
}
}