1、DBUtils的概述
DbUtils是Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫,使用它能夠簡化JDBC應用程序的開發,同時也不會影響程序的性能,簡而言之DBUtils就是一個使用java代碼操作數據庫或者查詢數據的框架,應用此框架我們可以簡化我們的代碼,節省開發時長,增加開發效率。
2、DBUtils的使用
DBUtils依賴于連接池(這篇博客使用Druid連接池),而Druid連接池依賴于Properties類,Properties類通過配置文件加載,因此DBUtils的使用步驟如下 1.創建配置文件,填寫配置信息,并倒入需要的jar包:數據庫驅動jar包 、druid包、dbutils包 2.創建一個工具類用于加載配置文件,使用Druid連接池提供的靜態工廠類獲取獲取連接池對象 3.新建測試類,創建一個QueryRunner類傳入創建的連接池對象,將sql語句傳入update(增刪改)或者query(查詢)方法
2.1.創建配置文件
新建resource文件夾為src的同級目錄,將resourc文件標記為(Mark Directory As)resourc root文件夾,在resource中新建一個配置文件,將文件后綴名改為properities 配置信息參數說明 url:數據庫路徑 jdbc:mysql://[ip地址]:[端口號]/[數據庫名] (當連接本地地址時ip地址和端口號可以省略) username:數據庫賬號 passwo:數據庫密碼 driverClassName驅動名
# 數據庫連接參數
url=jdbc:mysql:///db
username=root
password=123
driverClassName=com.mysql.jdbc.Driver
# 連接池的參數
initialSize=10
maxActive=15
maxWait=2000
2.2 創建工具類加載配置文件獲取連接池
將加載配置文件的步驟放在static修飾的靜態代碼塊中而不是放在方法中,這樣可以使配置文件的加載和連接池的獲取由始至終只進行了一次,加快代碼運行速度,并將連接池成員聲明為靜態保證無論調用多少次方法使用的都是同一個連接池。 JDBCUtil中的工具類 getDataSource獲取連接池 getConnection 獲取連接 close關閉連接
public class JDBCUtil {private static DataSource dataSource;static {//創建Druid連接池//1. 使用Properties對象,加載配置文件中的數據Properties properties = new Properties();InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");try {properties.load(in);//2. 使用DruidDataSourceFactory工廠類,根據properties對象中的數據創建DataSourcedataSource = DruidDataSourceFactory.createDataSource(properties);//賦值給成員變量dataSource} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 獲取連接池對象的方法* @return*/public static DataSource getDataSource() {return dataSource;}public static Connection getConnection(){//從連接池獲取連接Connection conn = null;try {conn = dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}return conn;}/*** 關閉2資源的方法*/public static void close(Statement stm, Connection conn) throws SQLException {close(null,stm,conn);}/*** 關閉3資源的方法*/public static void close(ResultSet rst, Statement stm, Connection conn) throws SQLException {if (rst != null) {rst.close();}if (stm != null) {stm.close();}if (conn != null) {conn.close();}}
}
2.3測試DBUTiles
調用工具類獲取連接池的方法傳入QueryRunner的構造方法創建QueryRunner的對象,QueryRunner主要有兩個方法 1.int update(String sql, Object… params),執行增刪改的SQL語句, params參數就是可變參數,參數個數取決于語句中問號的個數,返回值為受影響的數據條數
@Test
public void test01() throws SQLException {//目標:使用DBUtils框架執行添加數據的SQL語句,往user表中存入數據String sql = "insert into user values (null,?,?,?)";QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());//調用update方法執行SQL語句int i = queryRunner.update(sql, "jay", "666666", "周杰棍");System.out.println(i);
}
2.query(String sql, ResultSetHandler rsh, Object… params),其中ResultSetHandler是一個接口,表示結果集處理者,下面介紹一下該接口
2.1ScalarHandler(),查詢數據結果為單個數據時使用,(列如查詢全班人數總數)
@Test
public void test04() throws SQLException {//1. 查詢單個數據:比如說查詢用戶的總量、查詢id為3的用戶的昵稱String sql = "select count(*) from user";//查詢用戶的總量QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());//調用query方法執行查詢的SQL語句,我們使用ScalarHandler處理單個數據的結果集Long count = (Long) queryRunner.query(sql, new ScalarHandler());System.out.println(count);
}
2.2 MapHandler() BeanHandler() 為查詢數據結果為一條數據時使用,其中MapHandler() 將結果存入Map集合中,key表示列名,value表示值 BeanHandler(E.class)查詢數據為一條數據時使用并將查詢結果存儲到JavaBean對象中,要求列名和對象屬性名一致,返回值類型為要封裝進的JavaBean類
@Test
public void test05() throws SQLException {//2. 查詢一條數據(一行數據),處理方式有兩種:1. 存入Map中(MapHandler) 2. 存入JavaBean對象中(BeanHandler)//第一種:將查詢到的一條數據存儲到Map中String sql = "select * from user where id=?";QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());Map<String, Object> map = queryRunner.query(sql, new MapHandler(), 3);System.out.println(map);//第二種:將查詢到的一條數據存儲到JavaBean對象中,要求是JavaBean對象的屬性名和結果集的字段名保持一致//User user = queryRunner.query(sql, new BeanHandler<User>(User.class), 3);//里面是使用反射創建user對象,并且調用set方法設置數據//System.out.println(user);
}
2.3 查詢多行數據 MapListHandler() 查詢多條數據并將結果存儲進一個List<Map<String,Object>>集合中 BeanListHandler(E.class)查詢多條數據將結果存入一個List集合中 E表示一個JavaBean對象
@Test
public void test06() throws SQLException {//3. 查詢多行數據,處理方式有種:1. 存入List<Map<String,Object>>中(MapListHandler) 2. 存入List<JavaBean>中(BeanListHandler)String sql = "select * from user";QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());//第一種:查詢到多條數據,存入List<Map<String,Object>>中/*List<Map<String, Object>> mapList = queryRunner.query(sql, new MapListHandler());System.out.println(mapList);*///第二種:查詢到多條數據,存入List<User>List<User> userList = queryRunner.query(sql, new BeanListHandler<User>(User.class));System.out.println(userList);
}
3.自定義DBUtils
3.1數據庫元數據
1… DataBaseMetaData:通過它可以獲取整體數據庫的環境信息:用戶名、驅動、url等等信息 2. ParameterMetaData:通過它能夠獲取參數信息,比如說參數個數 3. ResultSetMetaData:通過它能夠獲取結果集的列的信息,比如說;列數、列名等等信息
@Test
public void test08() throws SQLException {Connection conn = JDBCUtil.getConnection();//通過connection調用getMetaData方法,獲取數據庫元數據DatabaseMetaData metaData = conn.getMetaData();//獲取用戶名String userName = metaData.getUserName();System.out.println(userName);System.out.println(metaData.getDriverName());//獲取驅動名
}public void test09() throws SQLException {//介紹ParameterMetaDataString sql = "insert into user values (null,?,?,?)";Connection conn = JDBCUtil.getConnection();//獲取連接//預編譯SQL語句PreparedStatement pstm = conn.prepareStatement(sql);//使用pstm獲取參數元數據ParameterMetaData parameterMetaData = pstm.getParameterMetaData();//獲取參數個數int parameterCount = parameterMetaData.getParameterCount();System.out.println(parameterCount);
}public void test10() throws SQLException {//介紹ResultSetMetaData,結果集元數據String sql = "select * from user";Connection conn = JDBCUtil.getConnection();//獲取連接//預編譯SQL語句PreparedStatement pstm = conn.prepareStatement(sql);//預編譯完SQL語句,就已經知道了結果集的列數ResultSetMetaData resultSetMetaData = pstm.getMetaData();//獲取結果集的列數int columnCount = resultSetMetaData.getColumnCount();System.out.println(columnCount);//獲取每一列的列名for(int i=1;i<=columnCount;i++){//獲取每一列的列名String columnName = resultSetMetaData.getColumnName(i);System.out.println(columnName);String columnTypeName = resultSetMetaData.getColumnTypeName(i);System.out.println(columnTypeName);}
}
3.2編寫自定義DBUtils
1.增刪改功能 自定義增刪改功能時需要先獲取參數元素據(ParameterMetaData),參數元數據的getParameterMetaData()方法可以獲取傳入sql語句中的參數個數,比較sql語句中的參數個數是否與傳入參數個數相同,如果相同,則一一賦值,最后執行,如果不相同則拋出異常
public class MyQueryRunner {private DataSource dataSource;public MyQueryRunner(DataSource dataSource) {this.dataSource = dataSource;}/**** @param sql 語句* @param params 問號處的參數* @return*/public int update(String sql,Object... params) throws Exception {//1. 獲取連接Connection conn = dataSource.getConnection();//2. 預編譯PreparedStatement pstm = conn.prepareStatement(sql);//3. 設置參數//使用參數元數據,獲取參數個數ParameterMetaData parameterMetaData = pstm.getParameterMetaData();int parameterCount = parameterMetaData.getParameterCount();//判斷用戶傳入的參數個數,是否和我們需要的參數個數相同if (parameterCount == params.length) {//進行參數的設置for(int i=1;i<=params.length;i++){pstm.setObject(i,params[i-1]);}}else {throw new RuntimeException("parameter count does not match!!!");}//4. 執行SQL語句int i = pstm.executeUpdate();//5. 關閉資源pstm.close();conn.close();return i;}
}
2.查詢功能
。。。歡迎補充
總結
以上是生活随笔 為你收集整理的DBUtil使用步骤 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。