您好,登錄后才能下訂單哦!
在jdbc中可以使用: 數據庫元數據、參數元數據、結果集元數據
(1)數據庫元數據
通過Connection對象的getMetaData() 方法可以得到DatabaseMetaData對象。DatabaseMetaData對象包含了數據庫的元信息。
DatabaseMetaData java.sql.Connection.getMetaData()
Retrieves a DatabaseMetaData object that contains metadata about the database. The metadata includes information about the database's tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on.
java.sql.DatabaseMetaData
(1)這個接口由驅動程序廠商實現,通過這個接口可以得到數據庫的capabilities
This interface is implemented by driver vendors to let users know the capabilities of a Database
(2)不同的DBMS提供不同的特性,實現特性的方式也不同,數據類型也不同
Different relational DBMSs often support different features, implement features in different ways, and use different data types.
getURL():返回一個String類對象,代表數據庫的URL。
getUserName():返回連接當前數據庫管理系統的用戶名。
getDatabaseProductName():返回數據庫的產品名稱。
getDatabaseProductVersion():返回數據庫的版本號。
getDriverName():返回驅動驅動程序的名稱。
getDriverVersion():返回驅動程序的版本號。
isReadOnly():返回一個boolean值,指示數據庫是否只允許讀操作。
(2)參數元數據
java.sql.ParameterMetaData
An object that can be used to get information about the types and properties for each parameter marker in a PreparedStatement object.
通過ParameterMetaData對象的getParameterCount()方法可以獲得PreparedStatement對象中的參數個數。
int java.sql.ParameterMetaData.getParameterCount()
Retrieves the number of parameters in the PreparedStatement object.
(3)結果集元數據
通過ResultSet對象的getMetaData()方法得到ResultSetMetaData對象。
ResultSetMetaData java.sql.ResultSet.getMetaData()
Retrieves the number, types and properties of this ResultSet object's columns.
java.sql.ResultSetMetaData
An object that can be used to get information about the types and properties of the columns in a ResultSet object.
package com.rk.metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.SQLException; import com.rk.utils.JDBCUtil; //1. 數據庫元數據 public class Demo01 { public static void main(String[] args) throws SQLException { // 獲取連接 Connection conn = JDBCUtil.getConnection(); // 獲取數據庫元數據 DatabaseMetaData metaData = conn.getMetaData();// alt + shift + L 快速獲取方法返回值 System.out.println("DatabaseProductName:" + metaData.getDatabaseProductName());//返回數據庫的產品名稱。 System.out.println("DatabaseProductVersion:" + metaData.getDatabaseProductVersion());//返回數據庫的版本號 System.out.println("DriverName:" + metaData.getDriverName());//返回驅動驅動程序的名稱 System.out.println("getDriverVersion:" + metaData.getDriverVersion());//返回驅動程序的版本號 System.out.println("URL:" + metaData.getURL());//返回一個String類對象,代表數據庫的URL System.out.println("UserName:" + metaData.getUserName());//返回連接當前數據庫管理系統的用戶名 System.out.println("ReadOnly:" + metaData.isReadOnly());//返回一個boolean值,指示數據庫是否只允許讀操作 JDBCUtil.closeQuietly(conn); } }
package com.rk.metadata; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.SQLException; import com.rk.utils.JDBCUtil; //2. 參數元數據 public class Demo02 { public static void main(String[] args) throws SQLException { // 獲取連接 Connection conn = JDBCUtil.getConnection(); // SQL String sql = "SELECT * FROM T_Dogs WHERE Name=? and Age>?"; PreparedStatement pstmt = conn.prepareStatement(sql); // 參數元數據 ParameterMetaData parameterMetaData = pstmt.getParameterMetaData(); // 獲取參數的個數 int count = parameterMetaData.getParameterCount(); System.out.println("count:" + count); JDBCUtil.closeQuietly(pstmt); JDBCUtil.closeQuietly(conn); } }
package com.rk.metadata; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import com.rk.utils.JDBCUtil; //3. 結果集元數據 public class Demo03 { public static void main(String[] args) throws SQLException { // 獲取連接 Connection conn = JDBCUtil.getConnection(); String sql = "SELECT * FROM T_Dogs"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); // 得到結果集元數據(目標:通過結果集元數據,得到列的名稱) ResultSetMetaData rs_metaData = rs.getMetaData(); // 迭代每一行結果 while(rs.next()) { // 1. 獲取列的個數 int count = rs_metaData.getColumnCount(); // 2. 遍歷,獲取每一列的列的名稱 for(int i=0;i<count;i++) { // 得到列的名稱 String columnName = rs_metaData.getColumnName(i+1); //得到列的類型 String columnClassName = rs_metaData.getColumnClassName(i+1); // 獲取每一行的每一列的值 Object columnValue = rs.getObject(columnName); // 測試 System.out.print(columnName+"("+columnClassName+")="+columnValue+"\t"); } System.out.println(); } JDBCUtil.closeQuietly(rs); JDBCUtil.closeQuietly(pstmt); JDBCUtil.closeQuietly(conn); } }
BaseDAO.java
package com.rk.dao; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import com.rk.utils.JDBCUtil; public class BaseDAO { /** * 更新的通用方法 */ public void update(String sql,Object... paramValues) { Connection conn = null; PreparedStatement pstmt = null; try { // 獲取連接 conn = JDBCUtil.getConnection(); // 創建執行命令的stmt對象 pstmt = conn.prepareStatement(sql); // 參數元數據: 得到占位符參數的個數 ParameterMetaData metaData = pstmt.getParameterMetaData(); int count = metaData.getParameterCount(); // 設置占位符參數的值 if(paramValues != null && paramValues.length>0) { // 循環給參數賦值 for(int i=0;i<count;i++) { pstmt.setObject((i+1), paramValues[i]); } } // 執行更新 pstmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); } finally { JDBCUtil.closeQuietly(pstmt); JDBCUtil.closeQuietly(conn); } } /** * 查詢的通用方法 */ public <T> List<T> query(String sql,Class<T> clazz, Object... paramValues) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 返回的集合 List<T> list = new LinkedList<T>(); // 1. 獲取連接 conn = JDBCUtil.getConnection(); // 2. 創建stmt對象 pstmt = conn.prepareStatement(sql); // 3. 獲取占位符參數的個數, 并設置每個參數的值 ParameterMetaData pmd = pstmt.getParameterMetaData(); int parameterCount = pmd.getParameterCount(); if(paramValues != null && paramValues.length>0) { for(int i=0;i<parameterCount;i++) { pstmt.setObject((i+1), paramValues[i]); } } // 4. 執行查詢 rs = pstmt.executeQuery(); // 5. 獲取結果集元數據 ResultSetMetaData rsmd = rs.getMetaData(); // ---> 獲取列的個數 int columnCount = rsmd.getColumnCount(); // 6. 遍歷rs while(rs.next()) { // 要封裝的對象 T t = clazz.newInstance(); // 7. 遍歷每一行的每一列, 封裝數據 for(int i=0;i<columnCount;i++) { // 獲取每一列的列名稱 String columnName = rsmd.getColumnName(i+1); String name = columnName.substring(0, 1).toLowerCase() + columnName.substring(1); // 獲取每一列的列名稱, 對應的值 Object columnValue = rs.getObject(columnName); // 封裝: 設置到t對象的屬性中 【BeanUtils組件】 BeanUtils.copyProperty(t, name, columnValue); } // 把封裝完畢的對象,添加到list集合中 list.add(t); } return list; } catch (Exception e) { throw new RuntimeException(e); } finally { JDBCUtil.closeQuietly(rs); JDBCUtil.closeQuietly(pstmt); JDBCUtil.closeQuietly(conn); } } }
DogDAO.java
package com.rk.dao; import java.util.List; import com.rk.entity.DogInfo; public class DogDAO extends BaseDAO { public void save(DogInfo dog) { String sql = "INSERT INTO T_Dogs(Name,Age,BirthDay) VALUES(?,?,?)"; super.update(sql,dog.getName(),dog.getAge(),dog.getBirthDay()); } public List<DogInfo> findAll() { String sql = "SELECT * FROM T_Dogs"; return super.query(sql, DogInfo.class); } public DogInfo findById(int id) { String sql = "SELECT * FROM T_Dogs WHERE Id=? "; List<DogInfo> list = super.query(sql, DogInfo.class, id); return (list != null && list.size()>0)?list.get(0):null; } public void update(DogInfo dog) { String sql = "UPDATE T_Dogs SET Name=?,Age=?,BirthDay=? WHERE Id=?"; super.update(sql, dog.getName(),dog.getAge(),dog.getBirthDay(),dog.getId()); } public void delete(int id) { String sql = "DELETE FROM T_Dogs WHERE Id=?"; super.update(sql, id); } }
Demo04.java
package com.rk.metadata; import java.util.Date; import java.util.List; import com.rk.dao.DogDAO; import com.rk.entity.DogInfo; public class Demo04 { public static void main(String[] args) { //保存 // DogInfo d = new DogInfo(); // d.setName("汪汪"); // d.setAge(2); // d.setBirthDay(new Date()); // // DogDAO dao = new DogDAO(); // dao.save(d); //查找所有 // DogDAO dao = new DogDAO(); // List<DogInfo> list = dao.findAll(); // for(DogInfo dog : list) // { // System.out.println(dog); // } //查找特定id記錄 // DogDAO dao = new DogDAO(); // DogInfo d = dao.findById(1); // System.out.println(d); //更新 // DogInfo d = new DogInfo(); // d.setId(1); // d.setName("旺財"); // d.setAge(3); // d.setBirthDay(new Date()); // DogDAO dao = new DogDAO(); // dao.update(d); //刪除 DogDAO dao = new DogDAO(); dao.delete(1); } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。