Mybatis學習筆記 (一)
Mybatis學習筆記 (一)
第一部分 框架概述
1.1 什么是框架
1.1.1 什么是框架
框架(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件實例間交互的方法;
另一種定義認為,框架是可被應用開發者定制的應用骨架。前者是從應用方面而后者是從目的方面給出的定義。
? 簡而言之,框架其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。
1.1.2 框架要解決的問題
? 框架要解決的最重要的一個問題是技術整合的問題,在J2EE的框架中,有著各種各樣的技術,不同的軟件企業需要從J2EE中選擇不同的技術,這就使得軟件企業最終的應用依賴于這些技術,技術自身的復雜性和技術的風險性將會直接對應用造成沖擊。
? 而應用是軟件企業的核心,是競爭力的關鍵所在,因此應該將應用自身的設計和具體的實現技術解耦。這樣,軟件企業的研發將集中在應用的設計上,而不是具體的技術實現,技術實現是應用的底層支撐,它不應該直接對應用產生影響。
框架一般處在低層應用平臺(如 J2EE)和高層業務邏輯之間的中間層。
三層架構:
- 表現層:展示數據
- 業務層:處理業務需求
- 持久層:數據庫交互
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NVYQLa4t-1585230875046)(https://i.loli.net/2020/03/26/mXUteku2oGFW5NL.png)]
1.1.3 軟件開發的分層重要性
? 框架的重要性在于它實現了部分功能,并且能夠很好的將低層應用平臺和高層業務邏輯進行了緩和。為了實現軟件工程中的“高內聚、低耦合”。把問題劃分開來各個解決,易于控制,易于延展,易于分配資源。我們常見的MVC軟件設計思想就是很好的分層思想。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ReLGonfu-1585230875049)(https://i.loli.net/2020/03/26/GqCRAzISXOn35kW.png)]
1.1.4 分層開發下的常見框架
持久層技術解決方案
- JDBC技術:Connection、PreparedStatement、ResultSet
- JdbcTemplate:spring中對jdbc的簡單封裝
- DBUtils:Apache
以上這些都不是框架,JDBC是規范,JdbcTemplate和DBUtils都只是工具類
常見的 JavaEE 開發框架
MyBatis
:解決數據的持久化問題的框架- 作為持久層的框架,還有一個封裝程度更高的框架就是Hibernate,但這個框架因為各種原因目前在國內的流行程度下降太多,現在公司開發也越來越少使用。目前使用SpringData來實現數據持久化也是一種趨勢。
Spring MVC
:解決 WEB 層問題的 MVC 框架Spring
:解決 WEB 層問題的 MVC 框架
1.1.5 MyBatis 框架概述
? mybatis是一個優秀的基于java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql語句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。
? mybatis通過xml或注解的方式將要執行的各種statement配置起來,并通過java對象和statement中sql的動態參數進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射為java對象并返回。
? 采用ORM思想解決了實體和數據庫映射的問題,對jdbc進行了封裝,屏蔽了jdbcapi底層訪問細節,使我們不用與jdbc api打交道,就可以完成對數據庫的持久化操作。
? ORM:Object Relational Mappging 對象關系映射,將數據庫表和實體類以及實體類的屬性對應起來,讓我們可以操作實體類就失效操作數據庫表
1.2 JDBC編程的分析
1.2.1 jdbc程序的回顧
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加載數據庫驅動
Class.forName("com.mysql.jdbc.Driver");
//通過驅動管理類獲取數據庫鏈接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis? characterEncoding=utf-8","root", "root");
//定義 sql 語句 ?表示占位符
String sql = "select * from user where username = ?";
//獲取預處理 statement
preparedStatement = connection.prepareStatement(sql);
//設置參數,第一個參數為 sql 語句中參數的序號(從 1 開始),第二個參數為設置的參數值
preparedStatement.setString(1, "王五");
//向數據庫發出 sql 執行查詢,查詢出結果集
resultSet = preparedStatement.executeQuery();
//遍歷查詢結果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+"
"+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//釋放資源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
上邊使用 jdbc 的原始方法(未經封裝)實現了查詢數據庫表記錄的操作。
1.2.2 jdbc 問題分析
- 數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響統性能,如果使用數據庫鏈接池可解決此問題。
- Sql 語句在代碼中硬編碼,造成代碼不易維護,實際應用 sql 變化的可能較大, sql 變動需要改變 java代碼。
- 使用 preparedStatement 向占有位符號傳參數存在硬編碼,因為 sql 語句的 where 條件不一定,可能多也可能少,修改 sql 還要修改代碼,系統不易維護。
- 對結果集解析存在硬編碼(查詢列名), sql 變化導致解析代碼變化,系統不易維護,如果能將數據庫記錄封裝成 pojo 對象解析比較方便。
第二部分 Mybatis 框架快速入門
2.1 Mybatis 框架開發的準備
2.1.1 官網下載Mybatis框架
下載略
maven坐標配置如下:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
2.2 搭建 Mybatis 開發環境
2.2.1 創建 maven 工程
略
2.2.2 添加Mybatis坐標
見上面
2.2.3 編寫實體類和dao接口
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
IUserDao 接口就是持久層接口(也可以寫成 UserDao 或者 UserMapper) ,具體代碼如下:
//持久層接口
public interface IUserDao {
List<User> findAll();
}
2.2.4 創建Mybatis的主配置文件lSqlMapConfig.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="mysql">
<!--配置mysql的環境 -->
<environment id="mysql">
<!--配置事務類型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據源(連接池) -->
<dataSource type="POOLED">
<!-- 配置連接數據庫的4個基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone = GMT"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper resource="***/***/IUserDao.xml"/>
</mappers>
</configuration>
2.2.5 編寫持久層接口的映射文件 IUserDao.xml
創建位置: 必須和持久層接口在相同的包中。
名稱: 必須以持久層接口名稱命名文件名,擴展名是.xml
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jBliUcFS-1585230875053)(https://i.loli.net/2020/03/26/urILe9CPRGkNfbn.png)]
<?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="***.***.IUserDao">
<!--配置查詢所有,select id值為方法名 resultType不能漏掉-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user ;
</select>
</mapper>
2.2.7 編寫測試類
在resource根目錄下創建一個與SqlMapConfig同級的log4j.properties
文件
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
在test/java中創建測試類
public class MybatisTest {
//測試類
public static void main(String[] args) throws Exception {
//1.讀取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.創建SqlSessionFactory工廠(接口)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工廠生成SqlSession對象
SqlSession session = factory.openSession();
//4.使用SqlSession創建Dao接口的代理對象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理對象執行方法
List<User> users = userDao.findAll();
for(User user:users){
System.out.println(user);
}
//6.釋放資源
session.close();
in.close();
}
}
運行結果如下:
2.2.8 搭建環境的注意事項
-
創建 IUserDac.xml和 IUserDao.java時名稱是為了和我們之前的知識保持一致。在 Mybatis中它把持久層的操作接口名稱和映射文件也叫做: Mapper。所以: IUserDao和 IUserMapper是一樣的。
-
在idea中創建目錄的時候,它和包是不一樣的。包在創建時
xx.xx.dao
它是三級結構,目錄在創建時xx.xx.dao
是一級目錄 -
mvbatis的映射配置文件位置必須和dao接口的包結構相同
-
映射配置文件的
mapper
標簽namespace
屬性的取值必須是dao接口的全限定類名 -
映射配置文件的操作配置(select等),
id
屬性的取值必須是dao接口的方法名 -
此時不用再寫dao的實現類
2.3 基于注解的mybatis入門
原先的xml配置步驟如下
第一步:讀取配置文件
第二步:創建 SqlSessionFactory工廠
第三步:創建Sq1 Session
第四步:創建Dao接口的代理對象
第五步:執行dao中的方法
第六步:釋放資源
有點麻煩
則可以更換為注解方式:此時也不需要編寫持久層接口的映射文件 IUserDao.xml
2.3.1 配置文件中添加mapper
<?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="mysql">
<!--配置mysql的環境 -->
<environment id="mysql">
<!--配置事物類型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據源(連接池) -->
<dataSource type="POOLED">
<!-- 配置連接數據庫的4個基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone = GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--注解-->
<mappers>
<mapper class="com.itheima.dao.IUserDao"/>
</mappers>
</configuration>
此時和使用xml配置相比,mapper
標簽內容更換為指定dao接口的全限定類名
2.3.1 在dao接口添加注解
public interface IUserDao {
@Select("select * from user")
List<User> findAll();
}
注意:注解寫在接口里面
在實際開發中,都是越簡便越好,所以都是采用不寫dao實現類的方式
不管使用XM還是注解配置
但是 Mybatis是支持寫dao實現類的
智能推薦
Mybatis學習筆記(一)
1、環境描述 java版本:1.8 開發工具:idea 2018版 mysql:8.x版本 mybatis:3.4.6版本 lombok mybatis 在開發中最為關鍵的是其 SqlSession 的使用和 mapper 文件的配置。 本文將圍繞它來介紹Mybatis的入門案例。 2、項目結構 2.1 配置文件 在 idea 中,使用maven項目。在 resources 資源文件夾中創建文件夾...
MyBatis學習筆記(一)
一、MyBatis介紹 MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記...
Mybatis學習筆記一
Mybatis學習筆記一 概述 Mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。 mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 對象和 statement 中sql 的動態參數進行映射生...
MyBatis學習筆記(一)
1 、對原生態jdbc程序中問題總結 jdbc編程步驟: 1、 加載數據庫驅動 2、 創建并獲取數據庫鏈接 3、 創建jdbc statement對象 4、 設置sql語句 5、 設置sql語句中的參數(使用preparedStatement) 6、 通過statement執行sql并獲取結果 7、 對sql執行結...
Mybatis學習筆記(一)
嗷嗷 環境統一 JDK1.8 Mysql5.7 maven3.6.1 簡介 什么是mybatis MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。 iBATIS一詞來源于“internet”和...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...