只有光頭才能變強。java
文本已收錄至個人GitHub精選文章,歡迎Star:github.com/ZhongFuChen…mysql
不知道你們在工做中還有沒有寫過JDBC,我在大三去過一家小公司實習,裏邊用的就是JDBC,只不過它封裝了幾個工具類。寫代碼的時候仍是能感覺到「這是真真實實的JDBC代碼」git
如今開發通常都是Mybatis,也有公司用的Hibernate或者Spring Data JPA。不少時候,不一樣的項目由不一樣的程序員開發,在公司層面可能沒有將技術徹底統一塊兒來,一個項目用Mybatis,一個項目用Hibernate都是頗有可能的。程序員
無論用的是什麼ORM
框架,都是在JDBC上封裝了一層嘛,因此JDBC仍是須要好好學習的。github
什麼是ORM?面試
Object_Relative DateBase-Mapping,在Java對象與關係數據庫之間創建某種映射,以實現直接存取Java對象。sql
不少同窗不知道JDBC要學到怎麼樣的一種程度,這裏我來說講JDBC的知識點有哪些,哪些應該是須要掌握的。數據庫
什麼是JDBC?JDBC全稱爲:Java Data Base Connectivity,它是能夠執行SQL語句的Java API後端
每種數據庫都有本身的圖形界面呀,我均可以在裏邊操做執行數據庫相關的事,爲何咱們要用JDBC?api
其實能夠好好細品一下JDBC,把接口定義出來,反正你給我實現就對了,不管數據庫怎麼變,用的時候是同一套API
隨後咱們簡單學習一下這幾個接口:Connection、Statement、ResultSet。寫出小白必學的Java鏈接數據庫的代碼:
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
/* * 加載驅動有兩種方式 * * 1:會致使驅動會註冊兩次,過分依賴於mysql的api,脫離的mysql的開發包,程序則沒法編譯 * 2:驅動只會加載一次,不須要依賴具體的驅動,靈活性高 * * 咱們通常都是使用第二種方式 * */
//1.
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//2.
Class.forName("com.mysql.jdbc.Driver");
//獲取與數據庫鏈接的對象-Connetcion
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zhongfucheng", "root", "root");
//獲取執行sql語句的statement對象
statement = connection.createStatement();
//執行sql語句,拿到結果集
resultSet = statement.executeQuery("SELECT * FROM users");
//遍歷結果集,獲得數據
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
System.out.println(resultSet.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
/* * 關閉資源,後調用的先關閉 * * 關閉以前,要判斷對象是否存在 * */
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
複製代碼
基本流程完了之後,咱們要重點學習一下PreparedStatement接口與Statement接口的區別,爲何要用PreparedStatement。
'++'
,編寫永等式,能夠不須要密碼就進入數據庫)**爲何咱們要使用數據庫鏈接池?**數據庫的鏈接的創建和關閉是很是消耗資源的,頻繁地打開、關閉鏈接形成系統性能低下
常見的數據庫鏈接池有C3P0、DBCP、Druid。你們在學習的時候能夠用Druid,我曾經用C3P0寫了個Demo被diss了(:
Druid是阿里開源的一個項目,有中文文檔,跟着學着鏈接數據庫,我相信不會太難。GitHub搜「Druid」就能搜到了
說到分頁,面試和工做都是很是常見的了,是必需要掌握的技術。下面來簡單說一下Oracle和MySQL是如何實現分頁的,以及對應的解釋:
Oracle分頁:
/* Oracle分頁語法: @lineSize---每頁顯示數據行數 @currentPage----當前所在頁 */
SELECT *FROM (
SELECT 列名,列名,ROWNUM rn
FROM 表名
WHERE ROWNUM<=(currentPage*lineSize)) temp
WHERE temp.rn>(currentPage-1)*lineSize;
/* Oracle分頁: Oracle的分頁依賴於ROWNUM這個僞列,ROWNUM主要做用就是產生行號。 分頁原理: 1:子查詢查出前n行數據,ROWNUM產生前N行的行號 2:使用子查詢產生ROWNUM的行號,經過外部的篩選出想要的數據 例子: 我如今規定每頁顯示5行數據【lineSize=5】,我要查詢第2頁的數據【currentPage=2】 注:【對照着語法來看】 實現: 1:子查詢查出前10條數據【ROWNUM<=10】 2:外部篩選出後面5條數據【ROWNUM>5】 3:這樣咱們就取到了後面5條的數據 */
複製代碼
MySQL分頁:
/* Mysql分頁語法: @start---偏移量,不設置就是從0開始【也就是(currentPage-1)*lineSize】 @length---長度,取多少行數據 */
SELECT *
FROM 表名
LIMIT [START], length;
/* 例子: 我如今規定每頁顯示5行數據,我要查詢第2頁的數據 分析: 1:第2頁的數據其實就是從第6條數據開始,取5條 實現: 1:start爲5【偏移量從0開始】 2:length爲5 */
複製代碼
總結:
(currentPage-1)*lineSize
開始取數據,取lineSize
條數據currentPage*lineSize
條數據,從(currentPage-1)*lineSize
開始取數據DBUtils我以爲還算是一個挺好用組件,在學習Hibernate,Mybatis這些ORM框架以前,能夠學着用用。能夠極大簡化咱們的JDBC的代碼,用起來也很方便。
若是急忙着寫畢業設計,還沒時間來得及學ORM框架,用這個工具來寫DAO
數據訪問層,我以爲是一個不錯的選擇。
能夠簡單看看代碼:
/* * 使用DbUtils框架對數據庫的CRUD * 批處理 * * */
public class Test {
@org.junit.Test public void add() throws SQLException {
//建立出QueryRunner對象
QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "INSERT INTO student (id,name) VALUES(?,?)";
//咱們發現query()方法有的須要傳入Connection對象,有的不須要傳入
//區別:你傳入Connection對象是須要你來銷燬該Connection,你不傳入,由程序幫你把Connection放回到鏈接池中
queryRunner.update(sql, new Object[]{"100", "zhongfucheng"});
}
@org.junit.Test public void query()throws SQLException {
QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "SELECT * FROM student";
List list = (List) queryRunner.query(sql, new BeanListHandler(Student.class));
System.out.println(list.size());
}
@org.junit.Test public void delete() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "DELETE FROM student WHERE id='100'";
queryRunner.update(sql);
}
@org.junit.Test public void update() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "UPDATE student SET name=? WHERE id=?";
queryRunner.update(sql, new Object[]{"zhongfuchengaaa", 1});
}
@org.junit.Test public void batch() throws SQLException {
//建立出QueryRunner對象
QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "INSERT INTO student (name,id) VALUES(?,?)";
Object[][] objects = new Object[10][];
for (int i = 0; i < 10; i++) {
objects[i] = new Object[]{"aaa", i + 300};
}
queryRunner.batch(sql, objects);
}
}
複製代碼
如今已經工做有一段時間了,爲何還來寫JDBC
呢,緣由有如下幾個:
read.me
會常常更換。如今的GitHub導航也不合我心意了(太長了),而且早期的文章,說實話排版也不太行,我決定從新搞一波。基於上面的緣由,我決定把個人系列文章彙總成一個PDF/HTML/WORD
文檔。說實話,打造這麼一個文檔花了我很多的時間。爲了防止白嫖,關注個人公衆號回覆「888」便可獲取。
文檔的內容均爲手打,有任何的不懂均可以直接來問我(公衆號有個人聯繫方式)。
若是你們想要實時關注我更新的文章以及分享的乾貨的話,微信搜索Java3y。
PDF文檔的內容均爲手打,有任何的不懂均可以直接來問我(公衆號有個人聯繫方式)。