MyBatis學習筆記(2)—映射關係篇mysql
Mybatis學習筆記(5)-高級映射之多對多映射apache
...敬請期待緩存
MyBatis是一款優秀的持久層框架,支持定製化SQL、存儲過程以及高級映射。避免了幾乎全部的JDBC代碼和手動設置參數及獲取結果集。Mybatis能夠經過配置XML或者註解,將接口和Java的POJOS 映射成數據庫中的記錄。 安全
經過實戰來上手一個知識點是一種比較快的方式,能夠幫助創建全局的印象,在過程當中會講述一些必要的知識點。bash
最近爆火的旅行青蛙頗有意思,周邊好友紛紛入坑,這裏我以它的商店系統做爲數據庫操做的對象。session
create database TravelFrog;
CREATE TABLE commodity
(
id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL ,
price decimal(8,2) NOT NULL ,
description varchar(255),
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO commodity(id, name, price, description)
VALUES(1001, '野葡萄烤餅', 10, '吃完還有點餓');
INSERT INTO commodity(id, name, price, description)
VALUES(1002, '巨石三明治', 20, '蔬菜、快速輕食');
INSERT INTO commodity(id, name, price, description)
VALUES(1003, '南瓜百吉餅', 50, '份大量足,能夠去很遠的地方');
INSERT INTO commodity(id, name, price, description)
VALUES(1004, '乳蛋餅', 80, '想快點吃到拍,身心都輕快了,快速回家');
複製代碼
<dependencies>
<!-- mybatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mysql數據庫鏈接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!-- 日誌 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- junit測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
複製代碼
新建mybatis-config.xml,內容以下: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://localhost:3306/TravelFrog?characterEncoding=UTF-8"/>
<!-- 數據庫用戶名 -->
<property name="username" value="root"/>
<!-- 數據庫密碼 -->
<property name="password" value="jenkins"/>
</dataSource>
</environment>
</environments>
<!-- 導入Mybatis數據庫查詢映射文件 -->
<mappers>
<mapper resource="mapper/CommodityMapper.xml"/>
</mappers>
</configuration>
複製代碼
Mybatis配置文件裏包含數據源,日誌,緩存等關係到Mybatis自身行爲的一些配置,上面的配置文件裏包含了數據源配置,事務管理。
package com.shuqing28.pojo;
public class Commodity {
private Integer id;
private String name;
private Double price;
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Commodity{" +
"id=" + id +
", name='" + name + '\'' + ", price=" + price + ", description='" + description + '\'' + '}'; } } 複製代碼
對應於數據庫剛纔建立的商品表,這裏的POJO裏的字段和商品表裏的字段一一對應。
package com.shuqing28.dao;
import com.shuqing28.pojo.Commodity;
import java.util.List;
public interface CommodityDao {
List<Commodity> getAllCommodity();
}
複製代碼
這裏定義一個接口,注意接口的方法和下面的XML文件的id保持一致。
<?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="com.shuqing28.dao.CommodityDao">
<select id="getAllCommodity" resultType="com.shuqing28.pojo.Commodity">
SELECT * FROM commodity
</select>
</mapper>
複製代碼
描述一下上面的XML文件作了什麼:
<mappers>
<mapper resource="mapper/CommodityMapper.xml"/>
</mappers>
複製代碼
因此Mybatis會讀取這個XML,生成映射器,這裏其實用到了動態代理。
定義了一個命名空間爲com.shuqing28.dao.CommodityDao的SQL Mapper
,這個命名空間和咱們定義的接口的全限定名是一致的。
用一個select元素定義了一個查詢SQL,返回結果是咱們定義過的Commodity。 這也是Mybatis最核心的部分,也是最複雜的部分,除了使用XML實現,也能夠經過註解實現,好比若是沒有上面的XML文件,那麼也能夠直接在接口裏這麼定義:
@Select(value="SELECT * FROM commodity")
public interface CommodityDao {
List<Commodity> getAllCommodity();
}
複製代碼
這邊只是淺淺的描述了使用,由於是第一篇,因此不深刻,會用就行。
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
# 指定Mapper包範圍的日誌級別
log4j.logger.com.zju.dao=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m
複製代碼
import com.shuqing28.dao.CommodityDao;
import com.shuqing28.pojo.Commodity;
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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class CommodityTest {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void setUp() throws IOException{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void getAllCommodity(){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
List<Commodity> commodities = commodityDao.getAllCommodity();
System.out.println(commodities);
} finally {
sqlSession.close();
}
}
}
複製代碼
[Commodity{id=1001, name='野葡萄烤餅', price=10.0, description='吃完還有點餓'}, Commodity{id=1002, name='巨石三明治', price=20.0, description='蔬菜、快速輕食'}, Commodity{id=1003, name='南瓜百吉餅', price=50.0, description='份大量足,能夠去很遠的地方'}, Commodity{id=1004, name='乳蛋餅', price=80.0, description='想快點吃到拍,身心都輕快了,快速回家'}]
複製代碼
其實測試類裏面的東西很是值得咱們關注,咱們能夠依此知道Mybatis的基本構成
SqlSessionFactoryBuilder一般利用XML或者Java編碼來構建SqlSessionFactory,一旦咱們構建了SqlSessionFactory,它的做用也就完結了。上面的例子中也就是簡單的讀取配置文件,轉化爲流對象,再建立出SqlSessionFactory。由於它的主要目的是建立SqlSessionFactory,因此它通常也只存活在建立的那個方法裏,聲明週期很短。
SqlSessionFactory是一個工廠類,它的做用就是生產SqlSession,而SqlSession你能夠想象成JDBC裏的一個Connection,每次訪問數據庫都須要一個SqlSession,因此SqlSessionFactory一般伴隨整個Mybatis的生命週期,咱們一般爲一個數據庫建立一個SqlSessionFactory,由於若是建立多個,那麼每次建立新的,它都會附帶着打開一堆Connection資源,因此一般咱們使用單例模式管理SqlSessionFactory。
SqlSession就是一個對話,類比Connection,因此每次使用完都要記得關閉它。同時,它也是一個線程不安全對象,因此在涉及多線程時要額外注意,咱們在上面的代碼中,在finally語句裏確保關閉它。它存活於一個應用的請求和操做,能夠執行多條sql,保證事務一致性。
Mapper也就是上面咱們寫的CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
,咱們僅僅使用Java接口和一個XML文件(或者註解)去實現Mapper而不用實現類,其實這裏運用到了動態代理,Mybatis會爲接口生成代理類對象,代理對象會根據「接口路徑+方法名」去匹配,找到對應的XML文件(或註解)去完成它所須要的任務,返回咱們須要的結果。Mapper是一個方法級別的東西,它的最大生命週期應該和SqlSession是相同的。
照着上面的代碼敲一遍即可以實現第一個Mybatis應用了,本系列第一篇,未完待續。。