前景概要
在08 Spring 操作持久層 (融合 Mybatis)最簡(jiǎn)使用(使用 Mybatis Generator) 對(duì)外依賴過大界睁,對(duì)新手來說可能有跳躍性奴烙。
特寫此章做一下鋪墊米同。
ORM的作用及Spring對(duì)數(shù)據(jù)庫(kù)的優(yōu)化
現(xiàn)在我們都會(huì)看到網(wǎng)上流行各種ORM框架來操作數(shù)據(jù)庫(kù)端铛,例如Mybatis
和hibernate
等蚤告,那到底為何要用ORM框架呢练般?
一開始的時(shí)候是沒有ORM存在的矗漾,那么使用JAVA操作數(shù)據(jù)庫(kù)步驟應(yīng)該如下:
原始方式操作數(shù)據(jù)庫(kù)(直接獲取數(shù)據(jù)庫(kù)連接池)
App.java
package me.laiyijie.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class App {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myspring", "test", "o34rWayJPPHgudtL");
ResultSet rs = conn.createStatement().executeQuery("select * from account");
while (rs.next()) {
System.out.println("username: " + rs.getString("username") + " password: " + rs.getString("password") + " name: "
+ rs.getString("name") + " create_time: " + rs.getLong("createtime"));
}
conn.close();
}
}
步驟詳解:
- 加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
- 獲取數(shù)據(jù)庫(kù)連接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/myspring", "test", "o34rWayJPPHgudtL");
- 執(zhí)行查詢語(yǔ)句并獲取結(jié)果集
ResultSet rs = conn.createStatement().executeQuery("select * from account");
- 輸出結(jié)果
while (rs.next()) {
System.out.println("username: " + rs.getString("username") + " password: " + rs.getString("password") + " name: " +
rs.getString("name") + " create_time: " + rs.getLong("create_time"));
}
- 關(guān)閉連接
conn.close();
這種操作方式有幾個(gè)弊端:
- 需要自己管理數(shù)據(jù)庫(kù)連接(又要開啟又要關(guān)閉的,萬一沒關(guān)就泄露了薄料,而且還沒有線程池敞贡,效率堪憂)
- 每次都要自己組裝SQL語(yǔ)句,很容易出錯(cuò)
- 不是面向?qū)ο蟮姆绞缴阒埃看尾僮鞯臅r(shí)候都是要通過
getString
來獲取誊役,需要對(duì)數(shù)據(jù)庫(kù)非常熟悉才行,也就是說耦合很深琳钉!
那么我們就來陸續(xù)解決這幾個(gè)問題:
問題解決及優(yōu)化
解決數(shù)據(jù)庫(kù)連接管理問題
解決方式是引入數(shù)據(jù)庫(kù)連接池
管理數(shù)據(jù)庫(kù)連接势木。
在08 Spring 操作持久層 (融合 Mybatis)最簡(jiǎn)使用(使用 Mybatis Generator) 我們引入了:
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
這個(gè)依賴中的 org.apache.commons.dbcp.BasicDataSource
就是數(shù)據(jù)庫(kù)連接池的一個(gè)實(shí)現(xiàn),可以有效管理數(shù)據(jù)庫(kù)連接歌懒,對(duì)這類數(shù)據(jù)庫(kù)連接資源我們稱之為數(shù)據(jù)源啦桌,在Spring中的配置如下:
<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/myspring"
p:username="test" p:password="o34rWayJPPHgudtL" />
也就是說,我們可以通過:
@Autowired
private BasicDataSource basicDataSource;
public void test() throws SQLException {
Connection conn = basicDataSource.getConnection();
}
直接獲取數(shù)據(jù)庫(kù)連接及皂,而不需要關(guān)心連接的關(guān)閉等問題甫男!
解決需要一直直接寫SQL和與對(duì)象映射問題(ORM出現(xiàn))
對(duì)象映射
想象現(xiàn)在如果從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)直接是一個(gè)對(duì)象!那多好验烧!就不用重復(fù)寫rs.getString("uesrname")
這種既需要知道類型板驳、又需要知道字段名稱的重復(fù)語(yǔ)句,而是可以直接這樣寫Account.getUsername()
碍拆。
這樣簡(jiǎn)直棒呆若治!
而Mybatis
正是為我們做了這樣一件事情慨蓝。
08 Spring 操作持久層 這一章中,MybatisGenerator
為我們做了如下的事情:
-
創(chuàng)建數(shù)據(jù)表對(duì)應(yīng)的對(duì)象(與數(shù)據(jù)表完全一樣)
public class Account { private String username; private String password; private String name; private Long create_time; }
-
查詢后將結(jié)果與對(duì)象映射(也就是查詢完成直接返回對(duì)象)
public interface AccountMapper { long countByExample(AccountExample example); int deleteByExample(AccountExample example); int deleteByPrimaryKey(String username); int insert(Account record); int insertSelective(Account record); List<Account> selectByExample(AccountExample example); Account selectByPrimaryKey(String username); int updateByExampleSelective(@Param("record") Account record, @Param("example") AccountExample example); int updateByExample(@Param("record") Account record, @Param("example") AccountExample example); int updateByPrimaryKeySelective(Account record); int updateByPrimaryKey(Account record); }
-
不用直接組裝SQL語(yǔ)句
public List<Account> getAccountsByCreateTime(Long start, Long end) { AccountExample accountExample = new AccountExample(); accountExample.or().andCreate_timeGreaterThan(start).andCreate_timeLessThanOrEqualTo(end); return accountMapper.selectByExample(accountExample); }
有這么好的利器端幼,為何不用礼烈?
詳細(xì)使用請(qǐng)參考
08 Spring 操作持久層 (融合 Mybatis)最簡(jiǎn)使用(使用 Mybatis Generator)