标签:des style blog http io color ar os 使用
元数据指的是"数据库"、"表"、"列"的定义信息。
Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象。 DataBaseMetaData对象的常用方法:
1 /**
2 * @Method: testDataBaseMetaData
3 * @Description: 获取数据库的元信息
4 * @Anthor:孤傲苍狼
5 *
6 * @throws SQLException
7 */
8 @Test
9 public void testDataBaseMetaData() throws SQLException {
10 Connection conn = JdbcUtils.getConnection();
11 DatabaseMetaData metadata = conn.getMetaData();
12 //getURL():返回一个String类对象,代表数据库的URL
13 System.out.println(metadata.getURL());
14 //getUserName():返回连接当前数据库管理系统的用户名
15 System.out.println(metadata.getUserName());
16 //getDatabaseProductName():返回数据库的产品名称
17 System.out.println(metadata.getDatabaseProductName());
18 //getDatabaseProductVersion():返回数据库的版本号
19 System.out.println(metadata.getDatabaseProductVersion());
20 //getDriverName():返回驱动驱动程序的名称
21 System.out.println(metadata.getDriverName());
22 //getDriverVersion():返回驱动程序的版本号
23 System.out.println(metadata.getDriverVersion());
24 //isReadOnly():返回一个boolean值,指示数据库是否只允许读操作
25 System.out.println(metadata.isReadOnly());
26 JdbcUtils.release(conn, null, null);
27 }
运行结果如下:
PreparedStatement.getParameterMetaData() 获得代表PreparedStatement元数据的ParameterMetaData对象。 Select * from user where name=? And password=? ParameterMetaData对象的常用方法:
1 /**
2 * @Method: testParameterMetaData
3 * @Description: 获取参数元信息
4 * @Anthor:孤傲苍狼
5 *
6 * @throws SQLException
7 */
8 @Test
9 public void testParameterMetaData() throws SQLException {
10 Connection conn = JdbcUtils.getConnection();
11 String sql = "select * from user wherer name=? and password=?";
12 //将SQL预编译一下
13 PreparedStatement st = conn.prepareStatement(sql);
14 ParameterMetaData pm = st.getParameterMetaData();
15 //getParameterCount() 获得指定参数的个数
16 System.out.println(pm.getParameterCount());
17 //getParameterType(int param):获得指定参数的sql类型,MySQL数据库驱动不支持
18 System.out.println(pm.getParameterType(1));
19 JdbcUtils.release(conn, null, null);
20 }
ResultSet. getMetaData() 获得代表ResultSet对象元数据的ResultSetMetaData对象。 ResultSetMetaData对象的常用方法:
1 /**
2 * @Method: testResultSetMetaData
3 * @Description: 结果集的元数据
4 * @Anthor:孤傲苍狼
5 *
6 * @throws Exception
7 */
8 @Test
9 public void testResultSetMetaData() throws Exception {
10 Connection conn = JdbcUtils.getConnection();
11 String sql = "select * from account";
12 PreparedStatement st = conn.prepareStatement(sql);
13 ResultSet rs = st.executeQuery();
14 //ResultSet.getMetaData()获得代表ResultSet对象元数据的ResultSetMetaData对象
15 ResultSetMetaData metadata = rs.getMetaData();
16 //getColumnCount() 返回resultset对象的列数
17 System.out.println(metadata.getColumnCount());
18 //getColumnName(int column) 获得指定列的名称
19 System.out.println(metadata.getColumnName(1));
20 //getColumnTypeName(int column)获得指定列的类型
21 System.out.println(metadata.getColumnTypeName(1));
22 JdbcUtils.release(conn, st, rs);
23 }
系统中所有实体对象都涉及到基本的CRUD操作 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
定义一个JdbcUtils工具类,工具类负责获取数据库连接,释放资源,执行SQL的update和query操作,代码如下:
1 package me.gacl.util;
2
3 import java.io.InputStream;
4 import java.sql.Connection;
5 import java.sql.DriverManager;
6 import java.sql.PreparedStatement;
7 import java.sql.ResultSet;
8 import java.sql.SQLException;
9 import java.sql.Statement;
10 import java.util.Properties;
11
12 public class JdbcUtils {
13
14 private static String driver = null;
15 private static String url = null;
16 private static String username = null;
17 private static String password = null;
18
19 static{
20 try{
21 //读取db.properties文件中的数据库连接信息
22 InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
23 Properties prop = new Properties();
24 prop.load(in);
25
26 //获取数据库连接驱动
27 driver = prop.getProperty("driver");
28 //获取数据库连接URL地址
29 url = prop.getProperty("url");
30 //获取数据库连接用户名
31 username = prop.getProperty("username");
32 //获取数据库连接密码
33 password = prop.getProperty("password");
34
35 //加载数据库驱动
36 Class.forName(driver);
37
38 }catch (Exception e) {
39 throw new ExceptionInInitializerError(e);
40 }
41 }
42
43 /**
44 * @Method: getConnection
45 * @Description: 获取数据库连接对象
46 * @Anthor:孤傲苍狼
47 *
48 * @return Connection数据库连接对象
49 * @throws SQLException
50 */
51 public static Connection getConnection() throws SQLException{
52 return DriverManager.getConnection(url, username,password);
53 }
54
55 /**
56 * @Method: release
57 * @Description: 释放资源,
58 * 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
59 * @Anthor:孤傲苍狼
60 *
61 * @param conn
62 * @param st
63 * @param rs
64 */
65 public static void release(Connection conn,Statement st,ResultSet rs){
66 if(rs!=null){
67 try{
68 //关闭存储查询结果的ResultSet对象
69 rs.close();
70 }catch (Exception e) {
71 e.printStackTrace();
72 }
73 rs = null;
74 }
75 if(st!=null){
76 try{
77 //关闭负责执行SQL命令的Statement对象
78 st.close();
79 }catch (Exception e) {
80 e.printStackTrace();
81 }
82 }
83
84 if(conn!=null){
85 try{
86 //关闭Connection数据库连接对象
87 conn.close();
88 }catch (Exception e) {
89 e.printStackTrace();
90 }
91 }
92 }
93
94 /**
95 * @Method: update