22Java之JDBCTemplate总结
生活随笔
收集整理的這篇文章主要介紹了
22Java之JDBCTemplate总结
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
寫在前面:這里總結(jié)4種方式來操作數(shù)據(jù)庫(kù)(SE階段)
一、JDBC
JDBC有關(guān)的類:都在java.sql 和 javax.sql 包下.? ? ? ? 1.數(shù)據(jù)準(zhǔn)備
這里假設(shè)已經(jīng)在數(shù)據(jù)庫(kù)中新建立了mydb4數(shù)據(jù)庫(kù),并且也插入了一些數(shù)據(jù), 并且還需要導(dǎo)入一個(gè)jar包mysql-connector-java-8.0.11.jar(可從官網(wǎng)下載)? ? ? ? 2.JDBC 編程步驟
步驟1:裝載驅(qū)動(dòng)? ??DriverManager.registerDriver(new Driver());? ? tips:在裝載驅(qū)動(dòng)的時(shí)候推薦使用Class.forName(“com.mysql.jdbc.Driver”); 一、查看Driver的源代碼可以看到,如果采用此種方式,會(huì)導(dǎo)致驅(qū)動(dòng)程序注冊(cè)兩次,也就是在內(nèi)存中會(huì)有兩個(gè)Driver對(duì)象。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?二、程序依賴mysql的api,脫離mysql的jar包,程序?qū)o法編譯,將來程序切換底層數(shù)據(jù)庫(kù)將會(huì)非常麻煩。
步驟2:建立連接? ??Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb4", "root", "111"); tips:MySQL驅(qū)動(dòng) 8 版本之后關(guān)于driverClass 與 url 參數(shù)的書寫變化 : com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/day04?serverTimezone=UTC&characterEncoding=utf-8 ? 步驟3:操作數(shù)據(jù)庫(kù) Statement statement = conn.createStatement(); ResultSet rs = statement.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString("username")); System.out.println(rs.getString("email")); } 步驟4:釋放資源
rs.close();
statement.close();
conn.close();
? ? ? ? 3.一步到位的操作方式(更加面向?qū)ο?amp;&解決SQL注入問題):
將重復(fù)的內(nèi)容 提取到JDBCUtils工具類中: 這里提供兩種版本分別是硬編碼和軟編碼 硬編碼(信息寫入到程序中): JDBCUtils工具類 <wiz_code_mirror> public class JDBCUtils { private static final String driverClass = "com.mysql.cj.jdbc.Driver"; ? ?// 當(dāng)時(shí)本地默認(rèn)3306 可以省略,也可寫成 "jdbc:mysql://localhost:3306/mydb4?severTimezone=UTC&characterEncoding=utf-8" private static final String url = "jdbc:mysql:///mydb4?serverTimezone=UTC&character=utf-8"; ? ? ? ? private static final String user = "root"; private static final String password = "111"; // 加載驅(qū)動(dòng) public static void loadDriver() { // 1. 加載驅(qū)動(dòng) try { Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new RuntimeException("驅(qū)動(dòng)加載失敗!"); } } // 獲取連接 public static Connection getConnection() throws SQLException { Connection conn = DriverManager.getConnection(url, user, password); return conn; } // 釋放資源 public static void release(Connection conn, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } release(conn, stmt); } public static void release(Connection conn, Statement stmt) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } } ? 測(cè)試類 <wiz_code_mirror> @Test public void test_query() { // 1. 加載驅(qū)動(dòng) JDBCUtils.loadDriver(); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 2. 建立連接 conn = JDBCUtils.getConnection(); // 3. 操作數(shù)據(jù) String sql = "select * from user;"; ? ? ? ? ? ?// 這里有可能引起sql注入問題,換成prepareStatement(sql) stmt = conn.createStatement(); rs = stmt.executeQuery(sql); while (rs.next()) { String username = rs.getString("username"); String password = rs.getString("password"); System.out.println(username + " = " + password); } } catch (SQLException e) { e.printStackTrace(); } finally { // 4. 釋放資源 JDBCUtils.release(conn, stmt, rs); } } ? 軟編碼:從配置文件中讀取(配置文件名字jdbc.properties) <wiz_code_mirror> #配置文件 #jdbc.properties #mysql driverClass=com.mysql.cj.jdbc.Driver url=jdbc:mysql:///mydb4?serverTimezone=UTC&character=utf-8 user=root passwrod=111 <wiz_code_mirror> public class JDBCUtils { // 屬性 private static String driverClass; private static String url; private static String username; private static String password; // 請(qǐng)問 : 什么時(shí)候加載外部配置文件最合適 ??? ? // 特點(diǎn)1 : 隨著類的加載而加載. // 特點(diǎn)2 : 靜態(tài)代碼塊只在類加載的被執(zhí)行一次. 僅一次. static { Properties prop = new Properties(); try { prop.load(new FileReader("jdbc.properties")); // 這里直接放在項(xiàng)目的目錄下,具體要切合實(shí)際 // 如果程序執(zhí)行到這里, 說明外部資源文件加載成功, 需要給我們的靜態(tài)屬性賦值 driverClass = prop.getProperty("driverClass"); url = prop.getProperty("url"); username = prop.getProperty("username"); password = prop.getProperty("password"); // 直接執(zhí)行加載驅(qū)動(dòng) loadDriver(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("文件資源加載失敗!"); } } // 加載驅(qū)動(dòng) public static void loadDriver() { try { // 1. 加載驅(qū)動(dòng) Class.forName(driverClass); } catch (ClassNotFoundException e) { // e.printStackTrace(); // 驅(qū)動(dòng)加載失敗! throw new RuntimeException("驅(qū)動(dòng)加載失敗!"); } } // 建立連接 public static Connection getConnection() throws SQLException { // 2. 建立連接 return DriverManager.getConnection(url, username, password); } // 釋放資源 public static void release(Connection conn, Statement stmt, ResultSet rs) { // 4. 釋放資源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } // 將 rs 清空 rs = null; } // 直接調(diào)用 release(conn, stmt); } public static void release(Connection conn, Statement stmt) { // 4. 釋放資源 if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } } ? 測(cè)試類: <wiz_code_mirror> @Test public void test_query() { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 1. 建立連接 conn = JDBCUtils.getConnection(); // 2. 操作數(shù)據(jù) String sql = "select * from user where username = ? and password = ?;"; // 預(yù)編譯sql ? ? ? ? ? ?stmt = conn.prepareStatement(sql); // 設(shè)置sql語(yǔ)句的參數(shù) stmt.setString(1, username); stmt.setString(2, password); // 執(zhí)行sql語(yǔ)句 rs = stmt.executeQuery(); // 判斷返回的結(jié)果 if (rs.next()) { // 登錄成功 int id = rs.getInt("id"); String u_name = rs.getString("username"); String u_pwd = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email); ? } catch (SQLException e) { e.printStackTrace(); } finally { // 3. 釋放資源 JDBCUtils.release(conn, stmt, rs); } } ? JDBCUtils中避免sql注入問題之后最終版總結(jié): PreparedStatement的CRUD <wiz_code_mirror> @Test public void test_update() { Connection conn = null; PreparedStatement stmt = null; try { // 2. 建立連接 conn = JDBCUtils.getConnection(); // U 修改 ? ? ? ? ? ? ? ? ? ? ?// 3. 操作數(shù)據(jù) String sql = "update user set username = ?, password = ?, email = ? where id = ?;"; stmt = conn.prepareStatement(sql); // 設(shè)置參數(shù) stmt.setString(1, "張三"); stmt.setString(2, "888"); stmt.setString(3, "zs@qiezi.cn"); stmt.setInt(4, 1); // 執(zhí)行 int affectedRowNum = stmt.executeUpdate(); System.out.println(affectedRowNum); ? ? ? ? // 刪除 ? ? ? ? ? ? ? ? ? ?// 2. 操作數(shù)據(jù) String sql = "delete from user where id = ?;"; stmt = conn.prepareStatement(sql); stmt.setInt(1, 4); int affectedRowNum = stmt.executeUpdate(); System.out.println(affectedRowNum); ? ? ? ? ? ? ? ? ? ? ? ? ? // 增加 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 2. 操作數(shù)據(jù) String sql = "insert into user values(?,?,?,?);"; stmt = conn.prepareStatement(sql); // 設(shè)置參數(shù) stmt.setInt(1, 4); stmt.setString(2, "趙六"); stmt.setString(3, "888"); stmt.setString(4, "zl@qiezi.cn"); int affectedRowNumber = stmt.executeUpdate(); System.out.println(affectedRowNumber); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 查詢 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 2. 操作數(shù)據(jù) String sql = "select * from user where username = ? and password = ?;"; stmt = conn.prepareStatement(sql); // 設(shè)置sql語(yǔ)句的參數(shù) stmt.setString(1, username); stmt.setString(2, password); // 執(zhí)行sql語(yǔ)句 rs = stmt.executeQuery(); // 判斷返回的結(jié)果 if (rs.next()) { // 登錄成功 int id = rs.getInt("id"); String u_name = rs.getString("username"); String u_pwd = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " : " + u_name + " : " + u_pwd + " : " + email); ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } catch (SQLException e) { e.printStackTrace(); } finally { // 4. 釋放資源 JDBCUtils.release(conn, stmt); } } ?二、JdbcTemplate
? ? ? ? ?JdbcTemplate 介紹
JDBC已經(jīng)能夠滿足大部分用戶最基本的需求,但是在使用JDBC時(shí),必須自己來管理數(shù)據(jù)庫(kù)資源如:獲取PreparedStatement,設(shè)置SQL語(yǔ)句參數(shù),關(guān)閉連接等步驟。JdbcTemplate就是Spring對(duì)JDBC的封裝,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分 JdbcTemplate處理了資源的建立和釋放。他幫助我們避免一些常見的錯(cuò)誤,比如忘了總要關(guān)閉連接。他運(yùn)行核心的JDBC工作流,如Statement的建立和執(zhí)行,而我們只需要提供SQL語(yǔ)句和提取結(jié)果。 在JdbcTemplate中執(zhí)行SQL語(yǔ)句的方法大致分為3類: 1. execute:可以執(zhí)行所有SQL語(yǔ)句,一般用于執(zhí)行DDL語(yǔ)句。 2. update:用于執(zhí)行INSERT、UPDATE、DELETE等DML語(yǔ)句。 3. queryXxx:用于DQL數(shù)據(jù)查詢語(yǔ)句。 ********新增加,新復(fù)習(xí) DDL (數(shù)據(jù)定義語(yǔ)言) 數(shù)據(jù)定義語(yǔ)言 - Data Definition Language 用來定義數(shù)據(jù)庫(kù)的對(duì)象,如數(shù)據(jù)表、視圖、索引等 create drop alter truncate DML (數(shù)據(jù)操縱語(yǔ)言) 數(shù)據(jù)處理語(yǔ)言 - Data Manipulation Language 在數(shù)據(jù)庫(kù)表中更新,增加和刪除記錄 如 update, insert, delete 不包含查詢 DCL (數(shù)據(jù)控制語(yǔ)言) 數(shù)據(jù)控制語(yǔ)言 – Data Control Language 指用于設(shè)置用戶權(quán)限和控制事務(wù)語(yǔ)句 如grant,revoke,if…else,while,begin transaction DQL (數(shù)據(jù)查詢語(yǔ)言)(★★★★★) 數(shù)據(jù)查詢語(yǔ)言 – Data Query Language 數(shù)據(jù)表記錄的查詢。 select *********? ? ? ? ? ?JDBCTemplate使用:
API介紹: 1.org.springframework.jdbc.core.JdbcTemplate類方便執(zhí)行SQL語(yǔ)句 <wiz_code_mirror> public JdbcTemplate(DataSource dataSource) 創(chuàng)建JdbcTemplate對(duì)象,方便執(zhí)行SQL語(yǔ)句 ? ? public void execute(final String sql) execute可以執(zhí)行所有SQL語(yǔ)句,因?yàn)闆]有返回值,一般用于執(zhí)行DML語(yǔ)句。 ? public int update(final String sql) 用于執(zhí)行`INSERT`、`UPDATE`、`DELETE`等DML語(yǔ)句。 ? ? public <T> T queryForObject(String sql, Class<T> requiredType, Object... args): ? 傳入?yún)?shù), 執(zhí)行查詢語(yǔ)句,返回一個(gè)指定類型的數(shù)據(jù)。 ? ? ? public Map<String, Object> queryForMap(String sql, Object... args) 傳入?yún)?shù),執(zhí)行查詢語(yǔ)句,將一條記錄放到一個(gè)Map中。 ? ? public List<Map<String, Object>> queryForList(String sql, Object... args) 傳入?yún)?shù),執(zhí)行查詢語(yǔ)句,返回一個(gè)List集合,List中存放的是Map類型的數(shù)據(jù)。 ? ? public <T> List<T> query(String sql, RowMapper<T> rowMapper) 執(zhí)行查詢語(yǔ)句,返回一個(gè)List集合,List中存放的是RowMapper指定類型的數(shù)據(jù)。 ? ? public <T> List<T> query(String sql, RowMapper<T> rowMapper) 執(zhí)行查詢語(yǔ)句,返回一個(gè)List集合,List中存放的是RowMapper指定類型的數(shù)據(jù)。 ? ? public class BeanPropertyRowMapper<T> implements RowMapper<T> BeanPropertyRowMapper類實(shí)現(xiàn)了RowMapper接口 1.數(shù)據(jù)準(zhǔn)備: 這里采用c3p0數(shù)據(jù)流連接池,集成到JDBCUtils 工具類中,需要將c3p0的配置文件放入到src目錄下 導(dǎo)入依賴的jar包 - spring-beans-5.0.2.RELEASE.jar - spring-core-5.0.2.RELEASE.jar - spring-jdbc-5.0.2.RELEASE.jar - spring-tx-5.0.2.RELEASE.jar - com.springsource.org.apache.commons.logging-1.1.1.jar 2.創(chuàng)建JdbcTemplate對(duì)象,傳入c3p0連接池 3.調(diào)用 execute、update、queryXxx等方法 c3p0-config.xml 配置文件 <wiz_code_mirror> <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> ? ?<!-- 默認(rèn)配置,c3p0框架默認(rèn)加載這段默認(rèn)配置 --> ? ?<default-config> ? ? ? ?<!-- 配置JDBC 四個(gè)基本屬性 --> ? ? ? ?<property name="driverClass">com.mysql.cj.jdbc.Driver</property> ? ? ? ?<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb4?serverTimezone=UTC&characterEncoding=utf-8</property> ? ? ? ?<property name="user">root</property> ? ? ? ?<property name="password">111</property> ? ?</default-config> ? ?<!-- 可以自定義配置,為這段配置起一個(gè)名字,c3p0指定名稱加載配置 --> ? ?<named-config name="zidingyimingzi"> ? ? ? ?<property name="driverClass">com.mysql.cj.jdbc.Driver</property> ? ? ? ?<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb4?serverTimezone=UTC&characterEncoding=utf-8</property> ? ? ? ?<property name="user">root</property> ? ? ? ?<property name="password">111</property> ? ?</named-config> </c3p0-config> JDBCUtils 工具類 <wiz_code_mirror> public class JDBCUtils { ? ? ?// 核心連接池類 ? ?private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); ? ? ?public static DataSource getDataSource() { ? ? ? ?return dataSource; ? } ? ? ?// 獲取連接 ? ?public static Connection getConnection() throws SQLException { ? ? ? ?return dataSource.getConnection(); ? } ? ? ?// 釋放資源 ? ?public static void release(Connection conn, Statement stmt, ResultSet rs) { ? ? ? ?if (rs != null) { ? ? ? ? ? ?try { ? ? ? ? ? ? ? ?rs.close(); ? ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? ? ?e.printStackTrace(); ? ? ? ? ? } ? ? ? ? ? ?rs = null; ? ? ? } ? ? ? ? ?release(conn, stmt); ? } ? ? ?public static void release(Connection conn, Statement stmt) { ? ? ? ?if (stmt != null) { ? ? ? ? ? ?try { ? ? ? ? ? ? ? ?stmt.close(); ? ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? ? ?e.printStackTrace(); ? ? ? ? ? } ? ? ? ? ? ?stmt = null; ? ? ? } ? ? ? ? ?if (conn != null) { ? ? ? ? ? ?try { ? ? ? ? ? ? ? ?conn.close(); ? ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? ? ?e.printStackTrace(); ? ? ? ? ? } ? ? ? ? ? ?conn = null; ? ? ? } ? } } 測(cè)試類(實(shí)現(xiàn)增改) <wiz_code_mirror> public class JDBCTemplateExecute { public static void main(String[] args) { ? // 查詢語(yǔ)句 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 1. 創(chuàng)建表的SQL語(yǔ)句 ? ? ? ?String sql = "create table product (" + ? ? ? ? ? ? ? ?"pid int primary key auto_increment," + ? ? ? ? ? ? ? ?"pname varchar(20)," + ? ? ? ? ? ? ? ?"price double" + ? ? ? ? ? ? ? ?");"; ? ? ? ? ?// 2. 創(chuàng)建 jdbcTemplate 對(duì)象, 并將數(shù)據(jù)庫(kù)連接池作為參數(shù)傳入 JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); ? // 3. 使用 jdbcTemplate 對(duì)象調(diào)用 execute 方法, 執(zhí)行 sql 語(yǔ)句, 創(chuàng)建數(shù)據(jù)庫(kù)表. jdbcTemplate.execute(sql); ? ? ? ? ? ? ? ? ? ? ? ? // 增加數(shù)據(jù) ? ? ? ? ? ? ? ?// 2. 編寫 sql 語(yǔ)句 ? ? ? ?String sql = "insert into product values(null, ?, ?);"; ? ? ? ? ?// 3. 執(zhí)行 update 方法. ? ? ? ?jdbcTemplate.update(sql, "iPhone3GS", 3333); ? ? ? ?jdbcTemplate.update(sql, "iPhone4", 5000); ? ? ? ? ? ? ? ? ? ? ? ? // ? 修改數(shù)據(jù) ? ? ? ? ? ? ? ?// 2. 執(zhí)行 update 語(yǔ)句 ? ? ? ?String sql = "update product set pname = ?, price = ? where pid = ?;"; ? ? ? ?int count = jdbcTemplate.update(sql, "XVIII", 18888, 10); ? ? ? ?System.out.println("count = " + count); ? ? ? ? ? ? // 刪除數(shù)據(jù) ? ? ? ?// 2. 執(zhí)行 delete 操作 ? ? ? ?String sql = "delete from product where pid = ?;"; ? ? ? ?int count = jdbcTemplate.update(sql, 7); ? ? ? ?System.out.println("count = " + count); } } 總結(jié):JdbcTemplate的update方法用于執(zhí)行DML語(yǔ)句。同時(shí)還可以在SQL語(yǔ)句中使用?占位,在update方法的Object... args可變參數(shù)中傳入對(duì)應(yīng)的參數(shù)。 測(cè)試類(實(shí)現(xiàn)查詢) <wiz_code_mirror> ? ?@Test ? ?public void test1() { ? ? ? ? ?// 1. 創(chuàng)建一個(gè) JdbcTemplate 對(duì)象 ? ? ? ?JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource()); ? ? ? ? ? ? ? ? ? // queryForObject 方法 ? ? ? ? ? ? ? ? ? ? ? ?// 2. 執(zhí)行 queryForObject 方法 ? ? ? ?String sql = "select pname from product where price = 7777"; ? ? ? ?String pname = jdbcTemplate.queryForObject(sql, String.class); ? ? ? ?System.out.println("pname = " + pname); ? ? ? ? ? ? ? ? ? ? // queryForMap 方法 ? ? ? ? ? ? ? ?// 2. 執(zhí)行 queryForMap 方法 ? ? ? ?String sql = "select * from product where pid = ?;"; ? ? ? ?Map<String, Object> map = jdbcTemplate.queryForMap(sql, 6); ? ? ? ?System.out.println("map = " + map); ? ? ? ? ? ? ? ? ? ? ? ? ? ? // objectForList ? ? ? ? ? ? ? ?// 2. 執(zhí)行 objectForList 方法 ? ? ? ?String sql = "select * from product where pid < ?;"; ? ? ? ?List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, 8); ? ? ? ?for (Map<String, Object> map : list) { ? ? ? ? ? ?System.out.println(map); ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 使用RowMapper做映射返回對(duì)象 ? ? ? ? 1. 定義Product類 2. 創(chuàng)建JdbcTemplate對(duì)象 3. 編寫查詢的SQL語(yǔ)句 4. 使用JdbcTemplate對(duì)象的query方法,并傳入RowMapper匿名內(nèi)部類 5. 在匿名內(nèi)部類中將結(jié)果集中的一行記錄轉(zhuǎn)成一個(gè)Product對(duì)象 ? ? ? ? ? ? ? ?// 2. 執(zhí)行 query 方法 ? ? ? ?String sql = "select * from product;"; ? ? ? ?List<Product> list = jdbcTemplate.query(sql, new RowMapper<Product>() { ? ? ? ? ? ?@Override ? ? ? ? ? ?public Product mapRow(ResultSet rs, int i) throws SQLException { ? ? ? ? ? ? ? ? ?Product product = new Product(); ? ? ? ? ? ? ? ?int pid = rs.getInt("pid"); ? ? ? ? ? ? ? ?String pname = rs.getString("pname"); ? ? ? ? ? ? ? ?double price = rs.getDouble("price"); ? ? ? ? ? ? ? ?product.setPid(pid); ? ? ? ? ? ? ? ?product.setPname(pname); ? ? ? ? ? ? ? ?product.setPrice(price); ? ? ? ? ? ? ? ? ?return product; ? ? ? ? ? } ? ? ? }); ? ? ? ? ?// 遍歷 list 集合 ? ? ? ?for (Product product : list) { ? ? ? ? ? ?System.out.println(product); ? ? ? } ? ? ? ? ? 1. 定義Product類 2. 創(chuàng)建JdbcTemplate對(duì)象 3. 編寫查詢的SQL語(yǔ)句 4. 使用JdbcTemplate對(duì)象的query方法,并傳入BeanPropertyRowMapper對(duì)象 ? ? ? ? ? ? ? // 2. 執(zhí)行 query 方法 ? ? ? ?String sql = "select * from product;"; ? ? ? ?List<Product> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Product.class)); ? ? ? ? ?// 3. 遍歷 list 集合 ? ? ? ?for (Product product : list) { ? ? ? ? ? ?System.out.println(product); ? ? ? } ? ? } 總結(jié): JDBCTemplate的query方法用于執(zhí)行SQL語(yǔ)句,簡(jiǎn)化JDBC的代碼。同時(shí)還可以在SQL語(yǔ)句中使用?占位,在query方法的Object... args可變參數(shù)中傳入對(duì)應(yīng)的參數(shù)。 三、c3p0 在Hibernate和Spring 都提供對(duì)C3P0連接池支持. 導(dǎo)入2個(gè)包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.11.jar mysql的jar包 mysql-connector-java-8.0.11.jar 基本操作 // 核心連接池類 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); // 設(shè)置四個(gè)JDBC基本連接屬性 comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); comboPooledDataSource.setJdbcUrl("jdbc:mysql:///mydb4?serverTimezone=UTC&characterEnconding=utf-8"); comboPooledDataSource.setUser("root"); comboPooledDataSource.setPassword("111"); 常用基本連接池屬性acquireIncrement? 如果連接池中連接都被使用了,一次性增長(zhǎng)">3個(gè)新的連接
initialPoolSize? 連接池中初始化連接數(shù)量默認(rèn):3
maxPoolSize????? 最大連接池中連接數(shù)量默認(rèn):15連接
maxIdleTime????? 如果連接長(zhǎng)時(shí)間沒有時(shí)間,將被回收默認(rèn):0 連接永不過期
? ??minPoolSize????? 連接池中最小連接數(shù)量 默認(rèn):">3
通過c3p0創(chuàng)建數(shù)據(jù)庫(kù)連接池對(duì)象方式提取到JDBCUtils中 <wiz_code_mirror> public class JDBCUtils { // c3p0 數(shù)據(jù)庫(kù)連接池對(duì)象屬性 ? ?// 這里會(huì)自動(dòng)讀取 位于src目錄下的c3p0-config.xml 數(shù)據(jù)庫(kù)連接池配置文件 private static final ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 獲取連接 public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } // 釋放資源 public static void release(Connection conn, Statement stmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } release(conn, stmt); } public static void release(Connection conn, Statement stmt) { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } } ? c3p0-config.xml 數(shù)據(jù)庫(kù)連接池配置文件 位于src 目錄下 <wiz_code_mirror> <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> ? ?<!-- 默認(rèn)配置,c3p0框架默認(rèn)加載這段默認(rèn)配置 --> ? ?<default-config> ? ? ? ?<!-- 配置JDBC 四個(gè)基本屬性 --> ? ? ? ?<property name="driverClass">com.mysql.cj.jdbc.Driver</property> ? ? ? ?<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb4?serverTimezone=UTC&characterEncoding=utf-8</property> ? ? ? ?<property name="user">root</property> ? ? ? ?<property name="password">111</property> ? ?</default-config> ? ?<!-- 可以自定義配置,為這段配置起一個(gè)名字,c3p0指定名稱加載配置 --> ? ?<named-config name="zidingyi"> ? ? ? ?<property name="driverClass">com.mysql.cj.jdbc.Driver</property> ? ? ? ?<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb4?serverTimezone=UTC&characterEncoding=utf-8</property> ? ? ? ?<property name="user">root</property> ? ? ? ?<property name="password">111</property> ? ?</named-config> </c3p0-config> ? 測(cè)試類: <wiz_code_mirror> @Test public void test_jdbcUtils() { // 需求 : 查詢 user 表中的所有數(shù)據(jù) Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { // 1. 建立連接 conn = JDBCUtils.getConnection(); // 2. 操作數(shù)據(jù) String sql = "select * from user;"; stmt = conn.prepareStatement(sql); rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " : " + username + " : " + password + " : " + email); } } catch (SQLException e) { e.printStackTrace(); } finally { // 3. 釋放資源 JDBCUtils.release(conn, stmt, rs); } } ?四、druid
Druid (德魯伊) 是阿里巴巴開發(fā)的號(hào)稱為監(jiān)控而生的數(shù)據(jù)庫(kù)連接池,Druid是目前最好的數(shù)據(jù)庫(kù)連接池。在功能、性能、擴(kuò)展性方面,都超過其他數(shù)據(jù)庫(kù)連接池,同時(shí)加入了日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況。Druid已經(jīng)在阿里巴巴部署了超過600個(gè)應(yīng)用,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗(yàn)。Druid地址:https://github.com/alibaba/druid? DRUID連接池使用的jar包:druid-1.0.9.jar| 參數(shù) | 說明 |
| url | 連接數(shù)據(jù)庫(kù)的url:jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&characterEncoding=utf-8 |
| username | 數(shù)據(jù)庫(kù)的用戶名 |
| password | 數(shù)據(jù)庫(kù)的密碼 |
| driverClassName | 驅(qū)動(dòng)類名。根據(jù)url自動(dòng)識(shí)別,這一項(xiàng)可配可不配,如果不配置druid會(huì)根據(jù)url自動(dòng)識(shí)別dbType,然后選擇相應(yīng)的driverClassName(建議配置下) |
| initialSize | 初始化時(shí)建立物理連接的個(gè)數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時(shí) |
| maxActive | 最大連接池?cái)?shù)量 |
| maxIdle | 已經(jīng)不再使用,配置了也沒效果 |
| minIdle | 最小連接池?cái)?shù)量 |
| maxWait | 獲取連接時(shí)最大等待時(shí)間,單位毫秒。 |
轉(zhuǎn)載于:https://www.cnblogs.com/zhengyuan/p/9496355.html
總結(jié)
以上是生活随笔為你收集整理的22Java之JDBCTemplate总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统高级编程系列教程
- 下一篇: java美元兑换,(Java实现) 美元