[TOC]
SqlSource 說明
SqlSource四種接口實現(xiàn)類的區(qū)別如下:
DynamicSqlSource:動態(tài)SQL語句,包含動態(tài)SQL節(jié)點或者含有‘${}’占位符的語句
RawSqlSource原生SQL語句。指非動態(tài)語句,語句中可能含有‘#{}’占位符,但不含有動態(tài)SQL節(jié)點,也不含有 '${}'占位符
StaticSqlSource靜態(tài)語句。語句中可能含有‘?’,可以直接提交給數(shù)據(jù)庫執(zhí)行
ProviderSqlSource上面的幾種都是通過XML文件獲取到的SQL語句。而 providerSqlSource 是通過注解獲取到的SQL語句
轉(zhuǎn)換過程
ProviderSqlSource---》BynamicSouce | RawSqlSource----〉StaticSqlSource
Statement說明
Statement 有一個子接口 PreparedStatement而 PreparedStatement 也有一個子接口 CallableStatement
這三個依次對應(yīng)設(shè)置SQL語句時的簡單語句、預(yù)編譯語句、存儲過程語句
PreparedStatement 在Statement 的基礎(chǔ)上,增加了一些 set 方法,能夠按照參數(shù)位置對參數(shù)進行賦值。
CallableStatement則在 PreparedStatement 的基礎(chǔ)上進一步增加了方法。主要分為一下四類:
- 按照參數(shù)名稱賦值方法:這一類方法能夠為存儲過程中指定名稱的參數(shù)賦值。如
setInt(String , int) - 注冊輸出參數(shù)方法方法:這一類方法能夠向存儲過程注冊輸出函數(shù)。
registerOuterParameter(int, int) - 按照參數(shù)位置讀取方法:這一類方法能夠讀取存儲過程中指定位置的參數(shù)值。例如:
getInt(int) - 按照參數(shù)名稱讀取值方法:這一類方法能夠讀取存儲過程中指定名稱的參數(shù)的值。例如:
getInt(string)
Executor 的實現(xiàn)類區(qū)別
-
CLosedExecutor:一個僅能表征自身已經(jīng)關(guān)閉的執(zhí)行器,沒有實際的功能。 -
SimpleExecutor:一個最為簡單的執(zhí)行器 -
BatchExecutor:支持批量執(zhí)行功能的執(zhí)行器 -
ReuseExecutor:支持 statement 對象復(fù)用的執(zhí)行器
Java.sql包和javax.sql包
java.sql
被稱為 JDBC 核心API包,完成一次數(shù)據(jù)庫操作的步驟如下:
- 建立
DriverManager對象 - 從
DriverManager對象中獲取Connection對象 - 從
Connection對象中獲取Statement對象 - 將SQL語句交給
Statement對象執(zhí)行,并獲取返回結(jié)果,結(jié)果通常放在ResultSet中
javax.sql
被稱為 JDBC 核心擴展包,它擴展了JDBC 核心包的功能,提供了對于服務(wù)端的支持,是Java企業(yè)版的重要部分
javax.sql 擴展了JDBC 核心包的功能,建議使用 DataSource 來獲取 Connection 對象而不是直接使用DriverManager對象。
- 建立
DataSource對象 - 從
DataSource對象中獲取Connection對象
從Connection對象中獲取Statement對象
- 將SQL語句交給
Statement對象執(zhí)行,并獲取返回結(jié)果,結(jié)果通常放在ResultSet中
Mybatis 操作數(shù)據(jù)與傳統(tǒng)方式示例
Mybatis操作數(shù)據(jù)
public class Test {
public static void main(String[] args) throws IOException {
//聲明配置文件地址
String resource = "mybatis-config.xml";
//得到輸入流
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建sql會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//打開sql會話
SqlSession session = sqlSessionFactory.openSession();
//獲取查詢結(jié)果
List<User> lu = session.selectList("listUser");
for (User u : lu) {
System.out.println(u.getUser_name());
System.out.println(u.getUser_id());
System.out.println(u.getUser_phone());
System.out.println("------------------------");
}
}
}
傳統(tǒng)JDBC操作數(shù)據(jù):
public class JdbcTest {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加載mysql數(shù)據(jù)庫驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
// 獲取數(shù)據(jù)庫連接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "");
// sql語句
String sql = "select * from user where userName = ?";
// 預(yù)處理statement
preparedStatement = connection.prepareStatement(sql);
// 設(shè)置參數(shù),針對sql中占位符中
preparedStatement.setString(1, "Tony");
// 發(fā)起查詢
resultSet = preparedStatement.executeQuery();
User user = new User();
// 遍歷查詢結(jié)果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String userName = resultSet.getString("userName");
int userAge = resultSet.getInt("userAge");
int sex = resultSet.getInt("sex");
String userAddress = resultSet.getString("userAddress");
// 封裝結(jié)果為User對象
user.setId(id);
user.setUserName(userName);
user.setSex(sex);
user.setUserAge(userAge);
user.setUserAddress(userAddress);
}
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 釋放資源
if (resultSet != null) {
resultSet.close();
}
if (preparedStatement != null) {
preparedStatement.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}