1. 認識Mybatis
1.1. 原生Jdbc問題總結
1、數據庫連接頻繁開啓和關閉,會嚴重影響數據庫的性能。
2、代碼中存在硬編碼,分別是數據庫部分的硬編碼和SQL執行部分的硬編碼。
3、原生Jdbc代碼示例:
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1、加載數據庫驅動
Class.forName("com.mysql.jdbc.Driver");
//2、通過驅動管理類獲取數據庫鏈接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
//3、定義sql語句 ?表示佔位符
String sql = "select * from user where username = ?";
//4、獲取預處理statement
preparedStatement = connection.prepareStatement(sql);
//5、設置參數,第一個參數爲sql語句中參數的序號(從1開始),第二個參數爲設置的參數值
preparedStatement.setString(1, "王五");
//6、向數據庫發出sql執行查詢,查詢出結果集
resultSet = preparedStatement.executeQuery();
//7、遍歷查詢結果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//8、釋放資源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
1.1. Mybatis框架介紹
1.1.1. 概念
Mybatis本是一個apache的一個開源項目iBatis,2010年這個項目由apache software foundation 遷移到了google code,並且改名爲MyBatis,實質上MyBatis對iBatis進行改進。MyBatis是一個優秀的持久層框架,它對jdbc的操作數據庫的過程進行封裝,使開發者只需關注SQL本身,而不需要花費精力去處理例如註冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。MyBatis是通過XML或註解的方式將要執行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,並通過java對象和statement中的sql進行映射最終生成執行的sql語句,最後由mybatis框架執行sql並將結果映射成java對象並返回。
1.1.1. 框架圖
1.1. Mybatis環境配置
1.1.1. 下載mybatis
mybatis的代碼由github.com管理下載地址:https://github.com/mybatis/mybatis-3/releases
Lib:mybatis的依賴包
Mybatis-3.2.7.jar:mybatis的核心包
Mybatis-3.2.7.pdf:mybatis的使用指南
1.1.2. 工程搭建
1.1.2.1. 第一步:創建java工程
用eclipse創建一個java工程,jdk使用1.7以上即可。
1.1.2.2. 第二步:加入jar包,其中junit的jar包,是非必需的。
l Mybatis核心包
l Mybatis依賴包
l Mysql驅動包
l Junit單元測試包(單元測試需要的包)
1.1.1.1. 第三步:添加log4j.properties文件
Mybatis使用的日誌包是log4j的,所以需要添加log4j.properties。
在classpath下創建log4j.properties如下:
文件內容可以從mybatis-3.2.7.pdf中拷貝
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# 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%n
日誌級別在開發階段設置成DEBUG,在生產階段設置成INFO或者ERROR。
1.1.1. 編程步驟
1、創建PO類,根據需求創建;
2、創建全局配置文件SqlMapConfig.xml;
3、編寫映射文件;
4、靠在映射文件,在SqlMapConfig.xml中進行加載;
5、編寫測試程序,連接數據庫。
思路:
a) 讀取配置文件;
b) 通過SqlSessionFactoryBuilder創建SqlSessionFactory會話工廠。
c) 通過SqlSessionFactory創建SqlSession。
d) 調用SqlSession的操作數據庫方法。
e) 關閉SqlSession。
1.1.2. 代碼開發實例
1.1.2.1. 第一步:數據庫腳本初始化
1、 執行sql_table.sql腳本,創建數據庫表;
2、 執行sql_data.sql初始化測試數據。
1.1.1.1. 第二步:創建PO類
創建的po類的屬性要和數據庫中表的列名一致(如果表中的列名是帶有下劃線,那麼po類中對應的的屬性名要採用駝峯式命名)
User.java類如下:
Public class User {
private int id;
private String username;// 用戶姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
get/set……
1.1.1.1. 第三步:創建SqlMapConfig.xml配置文件
在classpath下,創建SqlMapConfig.xml文件
SqlMapConfig.xml(文件頭可以從mybatis-3.2.7.pdf文檔的2.1.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>
<!-- 配置mybatis的環境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事務控制,由mybatis進行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據源,採用dbcp連接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
1.1.1.1. 第四步:需求開發根據用戶ID來查詢用戶信息
在classpath下,創建sqlmap文件夾。在sqlmap目錄下,創建User.xml映射文件。
Mybatis的映射文件頭(可以從mybatis-3.2.7.pdf文件中拷貝):
<?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">
1.1.1.1.1. 創建全局配置文件
在config目錄下,創建SqlMapConfig.xml文件,該名稱不是固定不變的。
1.1.1.1.1. 編寫映射文件
在config目錄下,創建User.xml(這種命名規範是由ibatis遺留下來)
1.1.1.1.1. 在全局配置文件中加載映射文件
1.1.1.1.1. 測試代碼
1.1. 小結:
1.1.1. parameterType和resultType
parameterType指定輸入參數的java類型,可以填寫別名或Java類的全限定名。
resultType指定輸出結果的java類型,可以填寫別名或Java類的全限定名。
1.1.2. #{}和${}
#{}:相當於預處理中的佔位符?。
#{}裏面的參數表示接收java輸入參數的名稱。
#{}可以接受HashMap、簡單類型、POJO類型的參數。
當接受簡單類型的參數時,#{}裏面可以是value,也可以是其他。
#{}可以防止SQL注入。
${}:相當於拼接SQL串,對傳入的值不做任何解釋的原樣輸出。
${}會引起SQL注入,所以要謹慎使用。
${}可以接受HashMap、簡單類型、POJO類型的參數。
當接受簡單類型的參數時,${}裏面只能是value。