1.元数据
- DatabaseMetaData
-- 作用
(1) DatabaseMetaData实例的获取
(2) 获得当前[数据库](http://lib.csdn.net/base/mysql)以及驱动的信息
(3) 获得当前数据库中表的信息
(4)获得某个表的列信息
(5)获得表的关键字信息
(6)获取指定表的外键信息
-- 获取数据库元数据
DatabaseMetaData metaData = conn.getMetaData();
--实现过程
//1. 获取数据库元数据
@Test
public void testDB() throws Exception {
// 获取连接
Connection conn = JdbcUtil.getConnection();
// 获取数据库元数据
DatabaseMetaData metaData = conn.getMetaData();
System.out.println(metaData.getUserName());
System.out.println(metaData.getURL());
System.out.println(metaData.getDatabaseProductName());
}

image.png
//2. 获取参数元数据
@Test
public void testParams() throws Exception {
// 获取连接
Connection conn = JdbcUtil.getConnection();
String sql = "select * from admin where id=? and username=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 参数元数据
ParameterMetaData p_metaDate = pstmt.getParameterMetaData();
// 获取参数的个数
int count = p_metaDate.getParameterCount();
// 测试
System.out.println(count);
}

image.png
// 3. 获取结果集元数据
@Test
public void testRs() throws Exception {
String sql = "select * from admin ";
// 获取连接
Connection conn = JdbcUtil.getConnection();
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);
// 获取每一行的每一列的值
Object columnValue = rs.getObject(columnName);
// 测试
System.out.print(columnName + "=" + columnValue + ",");
}
System.out.println();
}
}

将数据表中的信息全部显示出来

数据表中的信息
2.Dao操作的抽取
- 目的:减少代码的重复性
实现过程
- 1.创建通用的dao
package com.ouya.util;
import org.apache.commons.beanutils.BeanUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
/**
* 创建通用的dao,所有的dao都继承此类;
* Created by pc on 17-4-30.
*/
public class BaseDao {
//初始化参数
private static Connection conn;
private static PreparedStatement pstmt;
private static ResultSet rs;
/**
* 更新的通用方法
*
* @param sql
* @param paramsValue
*/
public void update(String sql, Object[] paramsValue) {
try {
//获取链接
conn = JdbcUtil.getConnection();
//创建执行命令的pstmt对象
pstmt = conn.prepareStatement(sql);
//参数元数据:得到占位符参数的个数
int count = pstmt.getParameterMetaData().getParameterCount();
//设置占位符参数的值
if (paramsValue != null && paramsValue.length > 0) {
//循环给参数赋值
for (int i=1;i<count;i++) {
pstmt.setObject(i + 1, paramsValue[i]);
}
}
//执行更新
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
JdbcUtil.closeAll(conn,pstmt,rs);
}
}
/**
* 查询的通用方法
* @param sql
* @param paramsValue
* @param clazz
* @param <T>
* @return
*/
public <T> List<T> query(String sql, Object[] paramsValue, Class<T> clazz) {
try {
//返回的集合
List<T> list = new ArrayList<T>();
//对象
T t = null;
conn = JdbcUtil.getConnection();
pstmt = conn.prepareStatement(sql);
int count = pstmt.getParameterMetaData().getParameterCount();
if (paramsValue != null && paramsValue.length > 0) {
for (int i=0;i<count;i++) {
pstmt.setObject(1, paramsValue[i]);
}
}
//执行查询
rs = pstmt.executeQuery();
//获取结果集元素
ResultSetMetaData rsmd = rs.getMetaData();
//获取列的个数
int columnCount = rsmd.getColumnCount();
//遍历rs
while (rs.next()) {
//要封装的对象
t = clazz.newInstance();
//遍历每一行的每一列,封装数据
for (int i=1;i<count;i++) {
//获取每一列的列名称
String columnName = rsmd.getColumnName(i + 1);
//获取每一列的列名称对应的值
Object value = rs.getObject(columnName);
BeanUtils.copyProperty(t, columnName, value);
}
//把封装完毕的对象添加到集合中
list.add(t);
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
JdbcUtil.closeAll(conn, pstmt, rs);
}
return null;
}
}
- 2.写DemoDao类,定义数据表的增删改查
package com.ouya.util;
import org.apache.commons.beanutils.BeanUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
/**
* 创建通用的dao,所有的dao都继承此类;
* Created by pc on 17-4-30.
*/
public class BaseDao {
//初始化参数
private static Connection conn;
private static PreparedStatement pstmt;
private static ResultSet rs;
/**
* 更新的通用方法
*
* @param sql
* @param paramsValue
*/
public void update(String sql, Object[] paramsValue) {
try {
//获取链接
conn = JdbcUtil.getConnection();
//创建执行命令的pstmt对象
pstmt = conn.prepareStatement(sql);
//参数元数据:得到占位符参数的个数
int count = pstmt.getParameterMetaData().getParameterCount();
//设置占位符参数的值
if (paramsValue != null && paramsValue.length > 0) {
//循环给参数赋值
for (int i = 0; i < count; i++) {
pstmt.setObject(i + 1, paramsValue[i]);
}
}
//执行更新
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(conn, pstmt, rs);
}
}
/**
* 查询的通用方法
*
* @param sql
* @param paramsValue
* @param clazz
* @param <T>
* @return
*/
public <T> List<T> query(String sql, Object[] paramsValue, Class<T> clazz) {
try {
//返回的集合
List<T> list = new ArrayList<T>();
//对象
T t = null;
conn = JdbcUtil.getConnection();
pstmt = conn.prepareStatement(sql);
int count = pstmt.getParameterMetaData().getParameterCount();
if (paramsValue != null && paramsValue.length > 0) {
for (int i = 0; i < count; i++) {
pstmt.setObject(1, paramsValue[i]);
}
}
//执行查询
rs = pstmt.executeQuery();
//获取结果集元素
ResultSetMetaData rsmd = rs.getMetaData();
//获取列的个数
int columnCount = rsmd.getColumnCount();
//遍历rs
while (rs.next()) {
//要封装的对象
t = clazz.newInstance();
//遍历每一行的每一列,封装数据
for (int i = 1; i < columnCount; i++) {
//获取每一列的列名称
String columnName = rsmd.getColumnName(i + 1);
//获取每一列的列名称对应的值
Object value = rs.getObject(columnName);
BeanUtils.copyProperty(t, columnName, value);
}
//把封装完毕的对象添加到集合中
list.add(t);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
JdbcUtil.closeAll(conn, pstmt, rs);
}
//return null;
}
}
- 3.创建DemoDaoTest,进行测试
package com.ouya.util;
import org.junit.Test;
import java.util.List;
/**
* Created by pc on 17-4-30.
*/
public class DemoDaoTest {
DemoDao demoDao = new DemoDao();
@Test
public void testUpDate() {
//删除
// demoDao.delete(2);
//插入
// Admin admin = new Admin();
// admin.setPwd("sss");
// admin.setUsername("sss");
// demoDao.insert(admin);
//查询
List<Admin> list = demoDao.getAll();
System.out.println(list);
//根据id查询
// List<Admin> list = (List<Admin>) demoDao.findById(1);
// System.out.println(list);
}
}
- 4.操作成功截图

id为2的数据已经删除了

插入成功

查询数据