1. 元数据- DataBaseMetaData
元数据:数据库、表、列的定义信息。
Connection.getDatabaseMetaData()
DataBaseMetaData对象
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
2. 元数据- ParameterMetaData
   PreparedStatement . getParameterMetaData()
•   获得代表PreparedStatement元数据的ParameterMetaData对象。
•   Select * from user where name=? And password=?
   ParameterMetaData对象
•   getParameterCount()
•   获得指定参数的个数
•   getParameterType(int param)
•   获得指定参数的sql类型
3. 元数据- ResultSetMetaData
   ResultSet. getMetaData()
获得代表ResultSet对象元数据的ResultSetMetaData对象。
   ResultSetMetaData对象
•   getColumnCount() :返回resultset对象的列数
•   getColumnName(int column) :获得指定列的名称
•   getColumnTypeName(int column):获得指定列的类型
4.重点内容:使用元数据简化JDBC代码
   业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
5. 以上知识点的案例分析
DatabaseMetaData类
package com.csdn.demo;import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import com.csdn.uil.DBManager_c3p0;public class Demo3 {private static Connection con = null;public static void main(String[] args) {try {con = DBManager_c3p0.getCon();DatabaseMetaData dbmd = con.getMetaData();System.out.println(dbmd.getURL());System.out.println(dbmd.getDriverName());System.out.println(dbmd.getDriverVersion());System.out.println(dbmd.getDatabaseProductName());System.out.println(dbmd.getDatabaseProductVersion());} catch (SQLException e) {e.printStackTrace();}}
}
ParameterMetaData类
package com.csdn.demo;import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;import com.csdn.uil.DBManager_c3p0;public class Demo4 {/*** @param args* mysql驱动对于ParameterMetaData类的某些方法不支持,就是访问属性的某些方法,oracle支持*/private static Connection con = null;private static PreparedStatement ps = null;public static void main(String[] args) {try {con = DBManager_c3p0.getCon();String sql = "select * from user where id = ?";ps = con.prepareStatement(sql);ParameterMetaData pm = ps.getParameterMetaData();System.out.println(pm.getParameterCount());} catch (SQLException e) {e.printStackTrace();}}}
ResultSetMetaData类
package com.csdn.demo;import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;import com.csdn.uil.DBManager_c3p0;public class Demo5 {/*** @param args*/private static Connection con = null;private static PreparedStatement ps = null;public static void main(String[] args) {try {con = DBManager_c3p0.getCon();String sql = "select * from user where id = ?";ps = con.prepareStatement(sql);ResultSetMetaData rs = ps.getMetaData();System.out.println(rs.getColumnClassName(1));System.out.println(rs.getCatalogName(1));int count = rs.getColumnCount();for(int i=0;i<count;i++){System.out.println(rs.getColumnName(1));System.out.println(rs.getColumnType(1));System.out.println(rs.getColumnTypeName(1));}} catch (SQLException e) {e.printStackTrace();}}
}
DBManager_c3p0(连接池)类
package com.csdn.uil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DBManager_c3p0 {private static ComboPooledDataSource ds = null;static{//这里要注意的是:xml配置文件的名字一定要是c3p0-config.xml,可以doc参考帮助,帮助中有命名,如果名字写错了会无法加载驱动,空指针的错ds = new ComboPooledDataSource("mysql");/*try {ds =new ComboPooledDataSource();ds.setDriverClass("com.mysql.jdbc.Driver");//自己写的时候一定要区分com.mysql.jdbc和jdbc:mysql:的顺序区别,写错之后会出无法加载driver驱动的错ds.setJdbcUrl("jdbc:mysql://localhost:3306/login");ds.setUser("root");ds.setPassword("root");ds.setInitialPoolSize(10);ds.setMaxPoolSize(20);ds.setMinPoolSize(5);} catch (PropertyVetoException e) {e.printStackTrace();}*/}public static Connection getCon() throws SQLException{return ds.getConnection();}public static void closeDB(Connection con,PreparedStatement ps,ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if(con!=null){try {con.close();} catch (SQLException e) {e.printStackTrace();}}}//CUD增删改模版public static void update(String sql,Object[] params){Connection con = null;PreparedStatement ps = null;try {con = DBManager_c3p0.getCon();ps = con.prepareStatement(sql);for(int i=0;i<params.length;i++){ps.setObject(i+1,params[i]);}int i = ps.executeUpdate();if(i>0){System.out.println("成功了!!");}} catch (SQLException e) {e.printStackTrace();}finally{DBManager_c3p0.closeDB(con,ps,null);}}public static Object query(String sql,Object[] params,ResultSetHandler rsh){Connection con = null;PreparedStatement ps = null;ResultSet rs = null;try {con = DBManager_c3p0.getCon();ps = con.prepareStatement(sql);for(int i=0;i<params.length;i++){ps.setObject(i+1,params[i]);}rs = ps.executeQuery();return rsh.handler(rs);} catch (SQLException e) {throw new RuntimeException(e);}finally{DBManager_c3p0.closeDB(con,ps,null);}}
}
操作实现类:BeanHandler类
package com.csdn.uil;import java.sql.ResultSet;
import java.sql.ResultSetMetaData;import java.lang.reflect.Field ;public class BeanHandler implements ResultSetHandler {private Class clazz;public BeanHandler(Class clazz) {super();this.clazz = clazz;}@Overridepublic Object handler(ResultSet rs) {try {if(!rs.next()){return null;               }Object bean = clazz.newInstance();ResultSetMetaData rm = rs.getMetaData();int count = rm.getColumnCount();for(int i=0;i<count;i++){String columnName = rm.getColumnName(i+1);Object value = rs.getObject(columnName);Field f = bean.getClass().getDeclaredField(columnName);f.setAccessible(true);f.set(bean,value);}return bean;} catch (Exception e) {throw new RuntimeException();}}}
实现类:Model类
package com.csdn.model;import org.junit.Test;
import com.csdn.domain.users;
import com.csdn.uil.BeanHandler;
import com.csdn.uil.DBManager_c3p0;public class Model {@Testpublic void insert(){String sql = "insert into user (username,password) values(?,?)";Object[] params = {"aa","aa"};DBManager_c3p0.update(sql, params);}@Testpublic void delete(){String sql = "delete from user where id = ?";Object[] params = {18};DBManager_c3p0.update(sql, params);}@Testpublic void update(){String sql = "update user set username = ?,password = ? where id = ?";Object[] params = {"bb","bb",17};DBManager_c3p0.update(sql, params);}@Testpublic void find(){String sql = "select id,username,password from user where id = ?";Object[] params = {1};users users = (users)DBManager_c3p0.query(sql, params, new BeanHandler(users.class));System.out.println(users.getId()+";"+users.getUsername()+";"+users.getPassword());}@Testpublic void findAll(){String sql = "select id,username,password from user";//因为做的处理器有参数,所以即使没有置换参数也要创建一个空数组传参数Object[] params = {};List<Users> list = (List<Users>)DBManager_c3p0.query(sql, params, new ListHandler(Users.class));System.out.println(list);//输出一个对象System.out.println(list.size());for(Users user : list){System.out.println(user.getId()+";"+user.getUsername()+";"+user.getPassword());}}
}
返回list的查询模版
package com.csdn.uil;import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Field;public class ListHandler implements ResultSetHandler{private Class clazz;public ListHandler(Class clazz) {super();this.clazz = clazz;}@Overridepublic Object handler(ResultSet rs) {try {List list = new ArrayList();while(rs.next()){Object bean = clazz.newInstance();ResultSetMetaData meta = rs.getMetaData();int count = meta.getColumnCount();for(int i=0;i<count;i++){String columnName = meta.getColumnName(i+1);Object columnValue = rs.getObject(columnName);//这里是获取bean里的字段,所以要用bean.getClass()Field field = bean.getClass().getDeclaredField(columnName);field.setAccessible(true);field.set(bean, columnValue);}list.add(bean);}return list;} catch (Exception e) {throw new RuntimeException(e);}}}

转载于:https://www.cnblogs.com/yangkai-cn/archive/2012/11/27/4017032.html

心得3--JDBC增删改查模版编写与案例相关推荐

  1. jdbc增删改查_JDBC第二期

    上一期我们介绍了JDBC的基本使用方法:连接数据库的步骤,以及如何对数据库进行操作(对这些还有疑问的同学可以查看前几期的文章有提到). ★ 之前我们主要是使用Statement类来实现对sql语句的调 ...

  2. jdbc增删改查有哪些步骤_用Mybatis如何实现对数据库的增删改查步骤

    使用Mybatiss实现对数据库的增删改查 文件目录 1.导入jar包,这里使用maven <dependencies><!--mybatis依赖--><!-- org. ...

  3. jdbc增删改查有哪些步骤_JDBC打造通用增删改方法

    [JDBC]打造通用增删改方法原创 简介:在我们学习JDBC的时候或者编写简单的Servlet程序的时候,经常需要增删改查等操作,很多小伙伴的做法是:增删改查各写一个方法,这样写虽然可以实现我们想要的 ...

  4. java jdbc标签jsp_jsp+servlet+javabean+jdbc实现增删改查和分页功能 案例源码

    [实例简介] 客户管理案例 1.目的:总结JDBC,和Servlet JSP结合到一起. 2.开发中的一些小技巧. 3.客户管理平台功能 * 添加客户 * 查询所有的客户的信息 * 修改客户信息 * ...

  5. JAVA JDBC 增删改查简单例子

    1.数据库配置文件jdbc.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test username= ...

  6. php增删改查心得体会,php增删改查入门示例

    在php编程中,增删改查是对数据库最基本的操作,分享下连接数据库以及增删改查的一些例子. 1.链接数据库通用方法:conn.php //第一步:链接数据库 $conn=@mysql_connect(& ...

  7. java--spring5之spring实现jdbc增删改查----4

    1.引入依赖: aspectjweaver-1.6.8.jar cglib-2.2.0.jar.zip commons-logging-1.1.1.jar druid-1.1.9.jar hamcre ...

  8. JDBC增删改查练习案例

    目录 先创建数据库表 查询全部信息 步骤: 非红色为不变的步骤 添加 根据ID更新数据 根据ID删除数据 先创建数据库表 CREATE DATABASE if not EXISTS info char ...

  9. 使用JDBC增删改查

    insert   增加 update  更新 select 查询 delete 删除 首先先需要写个连接类 protected Connection conn;  protected Prepared ...

最新文章

  1. CentOS下的Memcache安装
  2. VMware虚拟机安装Centos7
  3. Android-View点击水波纹特效
  4. 站在汽修厂的角度看需求
  5. 11WinDlg 对话框一
  6. mac memcached_Mac OS X上的Java Memcached
  7. vlc内部运行机制以及架构分析
  8. Redis常用数据类型和事物以及并发
  9. linux malloc速度,性能 – memcpy()的速度受malloc()的不同方式的影响很大
  10. Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
  11. 数字图像处理与python实现 岳亚伟_数字图像处理与Python实现
  12. 传说中的马尔科夫链到底是个什么鬼?
  13. Button,LinkButton,ImageButton,HyperLink使用
  14. 拓端tecdat|共享单车大数据报告
  15. jedate限制开始日期不能大于结束日期
  16. Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题
  17. c++使用hiredis库操作redis讲解
  18. Spring Cloud 链路追踪
  19. python如何使用geotools_ArcGIS工具之ET GeoWizards、GeoTools、GeoTools
  20. 无人驾驶技术入门(四)| 百度无人车传感器 IMU 深入剖析

热门文章

  1. TensorFLow RCNN
  2. 1.11 神经网络的权重初始化
  3. 深圳大学计算机科学考研,深圳大学考研计算机专业要多少分数会被百分百录取...
  4. 宏碁(acer)被攻击:黑客索要 3.25 亿元赎金
  5. 升级至 vCenter Server 6.5 的最佳实践 (2147686)
  6. JavaScript学习总结(13)——JavaScript常用正则表达式
  7. Ajax学习总结(1)——Ajax实例讲解与技术原理
  8. Java设计模式之单例模式(七种写法)
  9. GitChat · 前端 | Vue 组件库实践和设计
  10. 企业管理器控制台本地无法访问