一、元数据

元数据:数据库、表、列的定义信息

1、DataBaseMetaData对象

getURL():返回一个String类对象,代表数据库的URL。

getUserName():返回连接当前数据库管理系统的用户名。

getDatabaseProductName():返回数据库的产品名称。

getDatabaseProductVersion():返回数据库的版本号。

getDriverName():返回驱动驱动程序的名称。

getDriverVersion():返回驱动程序的版本号。

isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

 /**
* 获取数据库的元数据
* @throws SQLException
*/
@Test
public void test1() throws SQLException{
Connection con = JdbcUtils_DBCP.getConnection(); //获取数据库的元数据
DatabaseMetaData meta = con.getMetaData();
//获取数据库的版本
System.out.println(meta.getDatabaseMajorVersion());
//获取数据库的产品名称
System.out.println(meta.getDatabaseProductName());
//获取数据库默认的隔离级别
System.out.println(meta.getDefaultTransactionIsolation()); /**
* 结果:
* 5
MySQL
2
*
*/
}

2、 ParameterMetaData对象

PreparedStatement . getParameterMetaData()

获得代表PreparedStatement元数据的ParameterMetaData对象。

Select * from user where name=? And password=?

    ParameterMetaData对象

getParameterCount()

获得指定参数的个数

getParameterType(int param)

获得指定参数的sql类型

 /**
* 获取参数元数据
* @throws SQLException
*/
@Test
public void test2() throws SQLException{
Connection con = JdbcUtils_DBCP.getConnection();
String sql = "insert into account(name,money) values(?,?)";
//预编译sql语句
PreparedStatement ps = con.prepareStatement(sql);
//获取参数元数据
ParameterMetaData meta = ps.getParameterMetaData(); //获取参数的个数 结果:2
System.out.println(meta.getParameterCount()); //获取参数的类型
System.out.println(meta.getParameterType(1));
}

3、ResultSetMetaData对象

ResultSet. getMetaData()

获得代表ResultSet对象元数据的ResultSetMetaData对象。

ResultSetMetaData对象

getColumnCount()

返回resultset对象的列数

getColumnName(int column)

获得指定列的名称

getColumnTypeName(int column)

获得指定列的类型

 /*
* 获取结果集元数据
*/ @Test
public void test3() throws SQLException{
Connection con = JdbcUtils_DBCP.getConnection();
String sql = "select * from account";
//预编译sql语句
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery(); //获取元数据
ResultSetMetaData meta = rs.getMetaData();
System.out.println(meta.getColumnCount());
System.out.println(meta.getColumnName(1));
System.out.println(meta.getColumnName(2));
System.out.println(meta.getColumnName(3)); //结果:id name money
}

二、对JDBC进行优化

1、对增、删、改进行优化

所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。

 //优化JDBC的增、删、改
/**
*
* @param sql 接受参数
* @param params 参数 替换掉sql语句的?号
* @throws SQLException
*/
public static void create_delete_update(String sql,Object params[]) throws SQLException{
Connection con = null;
PreparedStatement st = null;
ResultSet result = null; try{
con = getConnection();
st = con.prepareStatement(sql); //把sql的?号替换掉
for(int i=0;i<params.length;i++){ //因为不清楚表的列数据是什么类型,所以用Object
st.setObject(i+1,params[i]);
} st.executeUpdate(); }finally{
release(con, st, result);
}
}

2、对查找进行优化

     //优化sql查询
public static Object query(String sql,Object params[],ResultSetHandler handler) throws SQLException{
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
con = getConnection();
st = con.prepareStatement(sql);
//替代问号
for(int i=0;i<params.length;i++){
st.setObject(i+1, params[i]);
} //执行
rs = st.executeQuery(); //由于不知道调用者怎么处理结果集,所有由调用者调用时传入一个处理器对象,调用处理器对象的处理方法
return handler.handler(rs);
}finally{
release(con, st, rs);
}
} } //暴露接口
interface ResultSetHandler{
public Object handler(ResultSet rs);
} //实现把结果封装到bean里面,适用于查找一条数据
class BeanHandler implements ResultSetHandler{
Class clazz;
public BeanHandler(Class clazz){
this.clazz = clazz;
} //处理方法,把数据封装到javabean
public Object handler(ResultSet rs) {
try {
if(!rs.next()){
return null;
} //创建封装结果的bean对象
Object bean = clazz.newInstance(); //得到结果集数的元数据,已获取结果集的信息
ResultSetMetaData meta = rs.getMetaData(); //得到结果集的列数
int count = meta.getColumnCount(); //for循环赋值给bean对象
for(int i=0;i<count;i++){
String name = meta.getColumnName(i+1);
Object value = rs.getObject(name); //反射出bean上与列名相应的属性
Field f = bean.getClass().getDeclaredField(name);
//由于属性是私有的,要把属性设置成可见的
f.setAccessible(true);
//设置属性
f.set(bean, value);
} return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} //把结果封装到一个集合里面去
class BeanListHandler implements ResultSetHandler{
Class clazz;
public BeanListHandler(Class clazz){
this.clazz = clazz;
} public Object handler(ResultSet rs){
List list = new ArrayList();
try{
while(rs.next()){
//创建bean对象
Object bean = clazz.newInstance();
ResultSetMetaData meta = rs.getMetaData(); //获取列数
int count = meta.getColumnCount();
for(int i=0;i<count;i++){
//列名
String name = meta.getColumnName(i+1);
Object value = rs.getObject(name);
Field f = bean.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(bean, value);
}
list.add(bean);
}
}catch(Exception e){
throw new RuntimeException(e);
}
return list;
}
}

3、完整代码

 package com.utils;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory; public class DButils { //数据库连接池
private static DataSource ds = null;
static{
try{
//读取配置文件
InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties prop = new Properties();
prop.load(in);
BasicDataSourceFactory factory = new BasicDataSourceFactory();
//创建连接池
ds = factory.createDataSource(prop);
}catch(Exception e){
throw new ExceptionInInitializerError(e);
}
} //获取连接
public static Connection getConnection() throws SQLException{ return ds.getConnection();
} //释放资源
public static void release(Connection con,Statement st,ResultSet result){
if(result!=null){
try {
result.close();
} catch (Exception e) {
e.printStackTrace();
}
result = null;
} if(st!=null){
try {
st.close();
} catch (Exception e) {
e.printStackTrace();
}
st = null;
} if(con!=null){
try {
con.close();
} catch (Exception e) {
e.printStackTrace();
} }
} //优化JDBC的增、删、改
/**
*
* @param sql 接受参数
* @param params 参数 替换掉sql语句的?号
* @throws SQLException
*/
public static void create_delete_update(String sql,Object params[]) throws SQLException{
Connection con = null;
PreparedStatement st = null;
ResultSet result = null; try{
con = getConnection();
st = con.prepareStatement(sql); //把sql的?号替换掉
for(int i=0;i<params.length;i++){ //因为不清楚表的列数据是什么类型,所以用Object
st.setObject(i+1,params[i]);
} st.executeUpdate(); }finally{
release(con, st, result);
}
} //优化sql查询
public static Object query(String sql,Object params[],ResultSetHandler handler) throws SQLException{
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
con = getConnection();
st = con.prepareStatement(sql);
//替代问号
for(int i=0;i<params.length;i++){
st.setObject(i+1, params[i]);
} //执行
rs = st.executeQuery(); //由于不知道调用者怎么处理结果集,所有由调用者调用时传入一个处理器对象,调用处理器对象的处理方法
return handler.handler(rs);
}finally{
release(con, st, rs);
}
} } //暴露接口
interface ResultSetHandler{
public Object handler(ResultSet rs);
} //实现把结果封装到bean里面,适用于查找一条数据
class BeanHandler implements ResultSetHandler{
Class clazz;
public BeanHandler(Class clazz){
this.clazz = clazz;
} //处理方法,把数据封装到javabean
public Object handler(ResultSet rs) {
try {
if(!rs.next()){
return null;
} //创建封装结果的bean对象
Object bean = clazz.newInstance(); //得到结果集数的元数据,已获取结果集的信息
ResultSetMetaData meta = rs.getMetaData(); //得到结果集的列数
int count = meta.getColumnCount(); //for循环赋值给bean对象
for(int i=0;i<count;i++){
String name = meta.getColumnName(i+1);
Object value = rs.getObject(name); //反射出bean上与列名相应的属性
Field f = bean.getClass().getDeclaredField(name);
//由于属性是私有的,要把属性设置成可见的
f.setAccessible(true);
//设置属性
f.set(bean, value);
} return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
} //把结果封装到一个集合里面去
class BeanListHandler implements ResultSetHandler{
Class clazz;
public BeanListHandler(Class clazz){
this.clazz = clazz;
} public Object handler(ResultSet rs){
List list = new ArrayList();
try{
while(rs.next()){
//创建bean对象
Object bean = clazz.newInstance();
ResultSetMetaData meta = rs.getMetaData(); //获取列数
int count = meta.getColumnCount();
for(int i=0;i<count;i++){
//列名
String name = meta.getColumnName(i+1);
Object value = rs.getObject(name);
Field f = bean.getClass().getDeclaredField(name);
f.setAccessible(true);
f.set(bean, value);
}
list.add(bean);
}
}catch(Exception e){
throw new RuntimeException(e);
}
return list;
}
}

测试:

 package com.utils;

 import java.sql.SQLException;
import java.util.Iterator;
import java.util.List; import org.junit.Test; import com.domain.Account; public class Demo { //测试添加
@Test
public void testAdd() throws SQLException{
Account a = new Account();
a.setName("陈海宏");
a.setMoney(30);
add(a);
} @Test
//测试删除
public void testDelete() throws SQLException{
delete(1);
} @Test
//测试更改
public void testUpdate() throws SQLException{
Account a = new Account();
a.setId(2);
a.setName("王五");
a.setMoney(30);
update(a);
} @Test
//测试查找单项记录
public void testFind() throws SQLException{
Account a = find(7);
System.out.println(a.getName());
} //测试查找单记录
@Test
public void testGetAll() throws SQLException{
List list = getAll();
//对集合进行迭代
Iterator it = list.iterator();
while(it.hasNext()){
Account a = (Account) it.next();
System.out.println(a.getId()+"+"+a.getName()+"+"+a.getMoney()); }
} //添加
public void add(Account a) throws SQLException{ //准备sql语句
String sql = "insert into account(name,money) values(?,?)";
//替换?的参数数据
Object params[] = {a.getName(),a.getMoney()};
DButils.create_delete_update(sql, params); } //删除
public void delete(int id) throws SQLException{ //准备sql语句
String sql = "delete from account where id=?";
//替换?的参数数据
Object params[] = {id};
DButils.create_delete_update(sql, params);
} //更新
public void update(Account a) throws SQLException{
String sql = "update account set name = ?,money = ? where id=?";
Object params[] = {a.getName(),a.getMoney(),a.getId()};
DButils.create_delete_update(sql, params);
} //查找单项记录
public Account find(int i) throws SQLException{
String sql = "select * from account where id=?";
Object params[] = {i};
return (Account) DButils.query(sql, params,new BeanHandler(Account.class));
} //查找所有记录
public List getAll() throws SQLException{
String sql = "select * from account";
Object params[] = {};
return (List) DButils.query(sql, params,new BeanListHandler(Account.class));
}
}

优化JDBC开发的更多相关文章

  1. DbUtils是Apache出品一款简化JDBC开发的工具类

    DbUtils     - DbUtils是Apache出品一款简化JDBC开发的工具类     - 使用DbUtils可以让我们JDBC的开发更加简单     - DbUtils的使用:       ...

  2. spark之JDBC开发(连接数据库测试)

    spark之JDBC开发(连接数据库测试) 以下操作属于本地模式操作: 1.在Eclipse4.5中建立工程RDDToJDBC,并创建一个文件夹lib用于放置第三方驱动包 [hadoop@CloudD ...

  3. 优化JDBC编程-多提提意见

    优化JDBC编程这是我根据MS SQL SERVER 2000 JDBC DRIVER HELP,并参考其它资料整理而成.ms的这个帮助文件实在有失大家风范,示例代码很.....有兴趣者可以去下载ht ...

  4. JAVA基础之JDBC开发、JSTL语法、EL表达式与数据分页

    一.直接使用JDBC开发的问题 1.当表中的列很多时,需要写很长的SQL语句 还需要写大量 setXXX() 设置参数语句 读取数据时还需要写大量setXXXX()设置属性语句 2.非常容易出错,而且 ...

  5. JDBC开发,数据库的连接

    JDBC开发步骤 1.建完工程后,右击工程,new,新建一个文件夹Folder,装jar包,        2.将下载好的驱动包打开,找到jar文件,CTRL+C,选中装jar包的文件夹,CTRL+V ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  7. 数据层优化-jdbc连接池简述、druid简介

    终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...

  8. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  9. JDBC开发

    1.JDBC简介 )数据库驱动 )Sun公司为简化数据库开发,定义了一套jdbc接口,这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库. ...

随机推荐

  1. Deadline下:写论文的总结

    终于赶在了11月底截止的时刻提交上了导航年会的论文.三天加上两个半晚上差不多干完了80%的活,无论是否能够被录,这次的写作收获很大. 认识到了: 1. 读文献时,一定要带着问题,如果是我来做,我会怎么 ...

  2. UserUI程序实现过程简述

    1.__tmainCRTStartup 2. mainret = _tWinMain( (HINSTANCE)&__ImageBase, NULL, lpszCommandLine, Star ...

  3. Memcached与Redis对比,Redis基础笔记回顾

    Memcached 1.为什么要把数据存入内存?快 2.Memcached和Redis的区别 (1)Memcached缓存.Redis数据库,Memcached不支持持久化到磁盘 (2)Redis提供 ...

  4. Stacks And Queues

    栈和队列 大型填坑现场,第一部分的还没写,以上. 栈和队列是很基础的数据结构,前者后进先出,后者先进先出,如下图: 下面开始将客户端和具体实现分开,这样有两个好处:一是客户端不知道实现的细节,但同时也 ...

  5. js实现svg图形转存为图片下载[转]

    我们知道canvas画布可以很方便的js原生支持转为图片格式并下载,但是svg矢量图形则并没有这方面原生的支持.研究过HighChart的svg图形的图片下载机制,其实现原理大体是浏览器端收集SVG代 ...

  6. 对于高并发短连接造成Cannot assign requested address解决方法

    https://www.cnblogs.com/dadonggg/p/8778318.html 感谢这篇文章给予的启发 在tcp四次挥手断开连接时,主动释放连接的一方最后会进入TIME_WAIT状态, ...

  7. robotframwork的WEB功能测试(二)—登录

    小结一下截止到目前,我接触的系统的登录模拟. 1. 带token的session:这种用抓包工具很容易抓到,使用这个链接就可以模拟已登录. 2. 使用cookie:有的系统是判断cookie来判断是否 ...

  8. PAT乙级1032

    1032 挖掘机技术哪家强 (20 分)   为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 ...

  9. B. Fafa and the Gates

    http://codeforces.com/problemset/problem/935/B Two neighboring kingdoms decided to build a wall betw ...

  10. NYOJ 252 01串 普通dp

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=252 分析: dp[2][0]=2;//表示长度为2的满足要求的且以0结尾的串个数 ...