黑马程序员JavaEE就业笔记串讲---JDBC
- 格式:doc
- 大小:173.00 KB
- 文档页数:18
使用JDBC进行增加、修改、删除数据所有的操作方法:executeUpdate()
使用JDBC查询数据库?
int id=rs.getInt("id");
String name=rs.getString("name");
String password=rs.getString("password");
int age=rs.getInt("age");
通过ResultSet接口中的getXxx()方法,可以取出数据,按类型取
getInt、getString、getFloat…
在开发中往往使用表格对数据显示进行处理
范例:用户输入信息,并将信息插入到数据库之中
必须准备一个表单,用于输入数据
问题:使用Statement需要一个完整的SQL语句,但是如果输入的内容中包含“'”,会造成数据输入的不正确。
解决:使用Statement的子接口——PreapredStatement
建议大家,在开发中不要去使用Statement对象,而去使用PreapredStatement操作数据库以上是JDBC1.0的使用,而且也是用的最多的,必须掌握的
JDBC2.0批处理
了解:移动游标
性能一个比一个差
这些定位操作,都是在内存之中,而且是将全部的数据取出来,再进行定位性能很差,不建议使用
一定注意,此类操作性能很差,如果数据量较少,可以采用此种方式,如果数据量较大,绝对不要使用重点了解以下概念:批处理
下次任务:如何使用JDBC连接Oracle数据库。
小鲁哥哥白话笔记-JDBC(API详解)前一章里我们让大家对JDBC的api有了一些了解,今天我们就聊一聊如何使用JDBC。
首先我们就聊一聊JDBC的注入问题:SQL注入问题假设有登录案例SQL语句如下:SELECT * FROM 用户表WHERE NAME = 用户输入的用户名AND PASSWORD = 用户输的密码;此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。
但是当用户输入的账号为XXX 密码为:XXX’OR ‘a’=’a时,则真正执行的代码变为:SELECT * FROM 用户表WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’OR ’a’=’a’;此时,上述查询语句时永远可以查询出结果的。
那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
为此,我们使用PreparedStatement来解决对应的问题。
那么PreparedStatement是一个什么类呢,它起到了什么作用,下面给大家详细的聊一聊它是什么,他有什么作用:使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
String sql = "insert into sort(sid,sname) values(?,?)";;PreparedStatement预处理对象代码:PreparedStatementpsmt = conn.prepareStatement(sql)常用方法:1.执行SQL语句:●intexecuteUpdate(); --执行insert update delete语句.●ResultSetexecuteQuery(); --执行select语句.●boolean execute(); --执行select返回true 执行其他的语句返回false.2.设置实际参数●void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。
小鲁哥哥白话笔记-JDBC(API详解)前边我们讲过SQL的一些基本操作,大家都是通过图形化工具对数据本身进行操作,今天我们讲一讲如何通过java代码去操作数据库,java中定义了一种规范,叫做JDBC.JDBC:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL 语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
是Java访问数据库的标准规范JDBC的使用是有标准的步骤的,大家根据固定的模式去写自己的JDBC代码就可以。
JDBC一共6个步骤:1.注册驱动.2.获得连接.3.获得语句执行平台4.执行sql语句5.处理结果6.释放资源.下边给大家聊一聊JDBC里API的使用:一、注册驱动:代码:Class.forName("com.mysql.jdbc.Driver");JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.DriverDriverManager工具类,提供注册驱动的方法registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:DriverManager.registerDriver(new com.mysql.jdbc.Driver());以上代码不推荐使用,存在两方面不足1.硬编码,后期不易于程序扩展和维护2.驱动被注册两次。
通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册public class Driver extends NonRegisteringDriver implements java.sql.Driver { static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}……}二、获得链接代码:Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);获取连接需要方法DriverManager.getConnection(url,username,password),三个参数分别表示,url需要连接数据库的位置(网址)user用户名password 密码url比较复杂,下面是mysql的url:jdbc:mysql://localhost:3306/mydbJDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
Java学习笔记之:JavaJDBC⼀、介绍JDBC(Java Data Base Connectivity,java数据库连接)是⼀种⽤于执⾏SQL语句的Java API,可以为多种关系数据库提供统⼀访问,它由⼀组⽤java语⾔编写的类和接⼝组成。
有了JDBC,向各种关系数据发送SQL语句就是⼀件很容易的事。
换⾔之,有了JDBC API,就不必为访问Sybase数据库专门写⼀个程序,为访问Oracle数据库⼜专门写⼀个程序,或为访问Informix数据库⼜编写另⼀个程序等等,程序员只需⽤JDBC API写⼀个程序就够了,它可向相应数据库发送SQL调⽤。
/*** JDBC:⽂件驱动* 1.引⼊jar包 ojdbc.jar 在⼯程的⽬录下创建⼀个lib⽂件夹⽤来存放jar包* 在ojdbc14.jar这个⽂件上右键==>build Path==> add to build Path* 2.编写DB类* a.加载驱动* b.设置参数url user pwd* c.连接数据库* d.编写sql语句* e.编译sql语句* f.如果存在条件* 设置条件后执⾏sql语句,如果没有条件直接执⾏sql语句 g.如果是增删改那么sql执⾏结束如果是查询,遍历结果集 f.关闭数据库****/⼆、初始化1.配置连接:在引⼊了ojdbc14.jar包之后,我们需要使⽤Class.forName⽅法加载驱动,然后通过DriverManager.getConnection来获取连接// 初始化public void init() {// 不同的数据库有不同的驱动String driverName = "oracle.jdbc.driver.OracleDriver";String url = "jdbc:oracle:thin:@192.168.1.150:1521:XE";String user = "hr";String password = "123456";try {// 加载驱动Class.forName(driverName);// 设置配置数据// 1.url(数据看服务器的ip地址数据库服务端⼝号数据库实例)// er// 3.passwordconn = DriverManager.getConnection(url, user, password);// 开始连接数据库System.out.println("数据库连接成功..");} catch (ClassNotFoundException e) {// TODO ⾃动⽣成的 catch 块e.printStackTrace();} catch (SQLException e) {// TODO ⾃动⽣成的 catch 块e.printStackTrace();}}2.初始化Connection conn = null;public static void main(String[] args) {DB db = new DB();db.init();}三、操作如果我们需要操作数据,就需要⼀个容器来保存它,这⾥我们可以⽤javabean来保存他们。
JDBC学习笔记Java相关课程系列笔记之四笔记内容说明目录一、 JDBC概述 11.1 什么是JDBC 11.2什么是驱动 11.3 SQL lite 11.4如何使用Java连接某种数据库 11.5连接数据库并操作 11.6连接数据库时常见的错误 1二、 JDBC核心API 22.1 Connection 22.2 Statement 22.3 ResultSet 22.4 DriverManager 22.5 UUID 32.6案例:使用JDBC连接数据库,并操作SQL语句 32.7案例:通过JDBC创建表 42.8案例:使用JDBC向表中插入数据 42.9遍历Student_chang表 5三、 JDBC核心API:PreparedStatement 63.1 Statement的缺点 63.2 PreparedStatement的优点 63.3 PreparedStatement的常用方法 63.4案例详见第五章StudentDAO类 6四、 Connection封装 7五、 DAO 85.1持久类封装 85.2 DAO层 85.3 Properties类 85.4案例:注册系统 8六、批处理 126.1批处理的优点 126.2 JDBC批处理API 126.3案例:详见8.4案例step7 12七、事务处理 137.1事务特性ACID 137.2 JDBC中对事务的支持(API) 13八、 DAO事务封装 148.1 ThreadLocal原理 148.2原理图 148.3 ThreadLocal核心API 148.4案例:登录系统(使用ThreadLocal实现连接共享) 14九、分页查询 179.1分页查询的基本原理 179.2为何使用分页查询 179.3 Oracle分页查询SQL语句 179.4 MySQL分页查询SQL语句 179.5“假”分页 179.6案例:分页查询 18JDBC概述1.1 什么是JDBC1)Java的设计者希望使用相同的方式访问不同的数据库。
1JDBC1.1JDBC概念1.1.1数据库驱动:数据库厂商提供的用来操作数据库的jar包1.1.2JDBC由于各大数据库厂商提供的数据库驱动各不相同, 导致了开发人员的学习成本十分的高. SUN公司为了简化数据库的操作, 提供了一套规范, 本质上就是一大堆的接口, 要求各大数据库厂商在提供驱动时都要实现JDBC这套接口, 实现之后, 只要学会JDBC这套接口, 所有的数据库驱动就都会使用了!JDBC由两个包组成, 分别是java.sql和javax.sql, 目前已经被集成到javase规范中!需要注意的是: JDBC中包含的就是一段接口, 真实操作数据库的代码都在具体的数据库驱动中. 也就是说在开发数据库程序时, 除了要导入JDBC相关的包之外, 还需要导入具体的数据库驱动包.1.2六个步骤实现JDBC程序 (!!掌握)//1.注册数据库驱动Class.for Name(“com.mysql.jdbc.Driver”);//2.获取数据库连接Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”, “root”, “root”);//简写形式为:Connection conn = DriverManager.getConnection(“jdbc:mysql:///mydb1”, “root”, “root”);//3.获取传输器Statement stat = conn.createStatement();//4.利用传输器发送sql到数据库执行, 返回执行结果ResultSet rs = stat.executeQuery(“select * from account”);int rows = stat.executeUpdate(“insert into account values(null, ‘y’, 666)”);//5.处理结果略//6.释放资源rs.close();stat.close();conn.close();1.3JDBC的增删改查(略) (!!掌握)1.4PreparedStatement (!!掌握)1.4.1Sql注入攻击//select * from user where username='张三'#'' and password=''//select * from user where username='张三' or '2=2' and password=''由于后台的SQL是拼接而来的, 其中的参数是用户提交的, 如果用户在提交参数时, 参杂了一些SQL关键字或者特殊符号, 就有可能会导致SQL语句语意的改变, 从而造成一些意外的操作!PreparedStatement优点:(1)可以防止sql注入攻击通过PreparedStatement对象发送sql, 是先把sql语句的骨架发送给数据库编译并确定下来, 后面发送的只能是参数的值, 不能影响sql语句的骨架, 即使参数中包含sql关键字或特殊符号, 也只会当成普通的文本来处理!(2)通过方法来设置参数, 省去了拼接SQL语句的麻烦!(3)可以提高程序的效率:通过PreparedStatement对象发送的sql语句(骨架)到数据库编译后会被数据缓存下来, 如果下次执行的sql与缓存中的相匹配, 就不再编译而是直接使用缓存中的语句, 可以减少sql语句编译的次数, 提高程序执行的效率!Statement对象发送的sql语句到数据库之后也会编译, 但是Statement对象是先拼接好再发送sql到数据库, 如果每次参数不同, 整条sql也就不同. 所以每次都需要编译!2批处理 (掌握)2.1批处理概述假设现有一大堆的sql要到数据库执行, 如果一条一条发送, 有多少条就需要发送多少次, 效率低下可以通过批处理提高发送sql语句的效率: 可以将这一大堆的sql添加到一个批中, 一次性将批发送给数据库, 数据库收到后打开批, 依次执行其中sql语句, 这样可以减少sql语句发送的次数, 从而提高程序执行的效率!2.2Statement方式来实现批处理优点:可以在一次批处理中添加结构不同的sql语句缺点:不能防止sql注入攻击没有预编译机制, 效率略低当发送结构相同的sql语句时, sql语句的骨架每次都需要编写。
JDBC第一天2007年6月4日一、JDBC原理概述1,JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的掉用规范。
2,JDBC的实现是由数据库厂商提供,以驱动程序形式提供。
3,JDBC在使用前要先加载驱动。
JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。
4、driver开发必须要实现Driver接口。
JDBC驱动程序的类型目前比较常见的JDBC驱动程序可分为以下四个种类:(1)JDBC-ODBC桥加ODBC驱动程序JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。
注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。
因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。
(2)本地API这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。
注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。
(3)JDBC网络纯Java驱动程序这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。
这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。
所用的具体协议取决于提供者。
通常,这是最为灵活的JDBC驱动程序。
有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。
为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。
几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。
(4)本地协议纯Java驱动程序这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。
1.知识点1.1. 上一个章节回顾1.2. 本章重点1.2.1.掌握JDBC的工作原理1.2.2.掌握如何获取数据库连接1.2.3.掌握如何对数据进行增、删、改、查2.具体内容2.1.为什么需要JDBC2.1.1.JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力2.1.2.2.2.JDBC程序的工作原理2.2.1.2.2.2.JDBC API2.2.2.1.提供者:sun公司2.2.2.2.内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:2.2.2.3.DriverManager类2.2.2.3.1.提供者:sun公司2.2.2.3.2.作用:载入各种不同的JDBC驱动2.2.2.3.3.JDBC 驱动2.2.2.3.3.1.提供者:数据库厂商2.2.2.3.3.2.作用:负责连接各种不同的数据库2.2.2.4.Connection接口2.2.2.5.Statement接口2.2.2.6.ResultSet接口2.2.3.JDBC API可做三件事:与数据库建立连接、执行SQL 语句、处理结果2.2.3.1.2.2.3.2.DriverManager :依据数据库的不同,管理JDBC驱动2.2.3.3.Connection :负责连接数据库并担任传送数据的任务2.2.3.4.Statement :由Connection 产生、负责执行SQL语句2.2.3.5.ResultSet:负责保存Statement执行后所产生的查询结果2.2.4.JDBC驱动程序管理器DriverManager:2.2.4.1.是JDBC的管理层,作用于用户和驱动程序之间。
它跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。
2.2.4.2.JDBC标准规定:所有的驱动程序类必须包含一个静态部分。
这个静态部分在加载该实例时由DriverManager类进行注册。
小鲁哥哥白话笔记-JDBC(API详解)前边我们讲过SQL的一些基本操作,大家都是通过图形化工具对数据本身进行操作,今天我们讲一讲如何通过java代码去操作数据库,java中定义了一种规范,叫做JDBC.JDBC:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL 语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
是Java访问数据库的标准规范JDBC的使用是有标准的步骤的,大家根据固定的模式去写自己的JDBC代码就可以。
JDBC一共6个步骤:1.注册驱动.2.获得连接.3.获得语句执行平台4.执行sql语句5.处理结果6.释放资源.下边给大家聊一聊JDBC里API的使用:一、注册驱动:代码:Class.forName("com.mysql.jdbc.Driver");JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.DriverDriverManager工具类,提供注册驱动的方法registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:DriverManager.registerDriver(new com.mysql.jdbc.Driver());以上代码不推荐使用,存在两方面不足1.硬编码,后期不易于程序扩展和维护2.驱动被注册两次。
通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册public class Driver extends NonRegisteringDriver implements java.sql.Driver { static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}……}二、获得链接代码:Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);获取连接需要方法DriverManager.getConnection(url,username,password),三个参数分别表示,url需要连接数据库的位置(网址)user用户名password 密码url比较复杂,下面是mysql的url:jdbc:mysql://localhost:3306/mydbJDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
黑马程序员JavaEE就业笔记串讲---JDBC 【JDBC的概述】JDBC:Java DataBase Connectivity Java数据库的连接.* 是SUN公司统一提供的一套接口规范(JDBC).各个数据库生产商提供实现. 驱动:两个硬件设备之间通信的桥梁.【JDBC的开发步骤】注册驱动:获得连接:获得执行SQL语句对象:释放资源:JDBC的API:【Connection】创建执行SQL的对象:进行事务管理:【Statement】执行SQL语句:执行批处理:【ResultSet】获得结果集中的数据:* getXXX(int idx);* select cname,cid from category;* getXXX(String name);默认情况下:next();* 正常的情况下结果集只能向下的.【自定义连接池】(了解)* SUN公司提供了一个连接池的接口.(javax.sql.DataSource).* 定义一个连接池:实现这个接口.* 使用List集合存放多个连接的对象.【自定义连接池的代码】public class MyDataSource implements DataSource{// 创建一个List集合用于存放多个连接对象.private List<Connection> list = new ArrayList<Connection>();// 在程序开始的时候,初始化几个连接,将连接存放到list中.public MyDataSource() {// 初始化3个连接:for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}@Override// 获得连接的方法:public Connection getConnection() throws SQLException { if(list.size() <= 0){for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}Connection conn = list.remove(0);return conn;}// 归还连接的方法:public void addBack(Connection conn){list.add(conn);}...}【自定义连接池中问题及如何解决】问题?1.如果使用自定义连接池,那么需要额外记住自定义连接池中的API.2.能不能使用面向接口的编程方式.解决:不额外提供API方法,就可以解决上述两个问题!!!能不能还调用Connection的close方法.能不能增强Connection的close方法,原有的销毁变为归还!!!如何增强Connection的close方法:* 增强一个Java类中的某个方法有几种方式???* 一种方式:继承的方式.* 能够控制这个类的构造的时候,才可以使用继承.* 二种方式:装饰者模式方式.* 包装对象和被包装的对象都要实现相同的接口.* 包装的对象中需要获得到被包装对象的引用.***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.* 三种方式:动态代理的方式.* 被增强的对象实现接口就可以.【继承和装饰者的案例】/*** 继承的方式增强一个类中某个方法:*/class Man{public void run(){System.out.println("跑....");}}class SuperMan extends Man{public void run(){// super.run();System.out.println("飞....");}}/*** 使用装饰者的方式完成类的方法的增强*/interface Waiter{public void server();}class Waiteress implements Waiter{@Overridepublic void server() {System.out.println("服务...");}}class WaiteressWrapper implements Waiter{ private Waiter waiter;public WaiteressWrapper(Waiter waiter) { this.waiter = waiter;}@Overridepublic void server() {System.out.println("微笑...");// this.waiter.server();}}【使用装饰者模式增强Connection的close方法】public class MyConnection implements Connection{private Connection conn;private List<Connection> list;public MyConnection(Connection conn,List<Connection> list) { this.conn = conn;this.list = list;}@Overridepublic void close() throws SQLException {list.add(conn);}...}连接池的getConnection方法:@Override// 获得连接的方法:public Connection getConnection() throws SQLException {if(list.size() <= 0){for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}Connection conn = list.remove(0);MyConnection myConn = new MyConnection(conn, list);return myConn;}【常见的开源的数据库连接池】:DBCP:DBCP(DataBase connection pool),数据库连接池。
是apache 上的一个java 连接池项目,也是tomcat 使用的连接池组件。
单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
C3P0:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。
目前使用它的开源项目有Hibernate,Spring等。
Tomcat内置连接池:【DBCP连接池的使用】第一步:引入DBCP连接池的jar包.第二步:编写DBCP代码:* 手动设置参数:* 配置文件设置参数:【DBCP连接池的使用】@Test/*** 手动方式:*/public void demo1(){Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///web_07");dataSource.setUsername("root");dataSource.setPassword("123");try{// 获得连接:conn = dataSource.getConnection();// 编写SQL:String sql = "select * from category";// 预编译SQL:stmt = conn.prepareStatement(sql);// 执行SQL:rs = stmt.executeQuery();while(rs.next()){System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));}}catch(Exception e){e.printStackTrace();}finally{JDBCUtils.release(rs,stmt, conn);}}@Test/*** 配置文件方式:*/public void demo2(){Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;Properties properties = new Properties();try{properties.load(new FileInputStream("src/dbcpconfig.properties"));DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);// 获得连接:conn = dataSource.getConnection();// 编写SQL:String sql = "select * from category";// 预编译SQL:stmt = conn.prepareStatement(sql);// 执行SQL:rs = stmt.executeQuery();while(rs.next()){System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));}}catch(Exception e){e.printStackTrace();}finally{JDBCUtils.release(rs,stmt, conn);}}【C3P0连接池的使用】第一步:引入C3P0连接池的jar包.第二步:编写代码:* 手动设置参数:* 配置文件设置参数:【C3P0改造工具类】public class JDBCUtils2 {private static final ComboPooledDataSource DATA_SOURCE =new ComboPooledDataSource();/*** 获得连接的方法*/public static Connection getConnection(){Connection conn = null;try {conn = DATA_SOURCE.getConnection();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return conn;}...}【JDBC的元数据MataData】(了解)-- 编写通用性较高的代码.DatabaseMetaData:获得数据库连接的信息,获得数据库的表的信息.* 获得数据库元数据:Connection中getMetaData();ParameterMetaData:获得SQL中的参数的个数及类型.* 获得参数元数据:PreparedStatement中getParameterMetaData()ResultSetMetaData:获得结果集中的列名及列的类型.* 获得结果集元数据:ResultSet中getMeta()【元数据的使用】@Test/*** 数据库元数据*/public void demo1(){Connection conn = null;conn = JDBCUtils2.getConnection();// 获得数据库元数据:try {DatabaseMetaData metaData = conn.getMetaData();System.out.println("获得驱动名称:"+metaData.getDriverName());System.out.println("获得驱动URL:"+metaData.getURL());System.out.println("获得用户名:"+metaData.getUserName());// 获得表中的主键:ResultSet rs = metaData.getPrimaryKeys(null, null, "category");if(rs.next()){String name = rs.getString("COLUMN_NAME");System.out.println(name);}} catch (SQLException e) {e.printStackTrace();}}@Test/*** 参数元数据:*/public void demo2(){Connection conn = null;PreparedStatement stmt = null;try{conn = JDBCUtils2.getConnection();String sql = "update category set cname = ? where cid = ?";stmt = conn.prepareStatement(sql);ParameterMetaData metaData = stmt.getParameterMetaData();int count = metaData.getParameterCount();System.out.println(count);}catch(Exception e){}}@Test/*** 结果集元数据:*/public void demo3(){Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try{conn = JDBCUtils2.getConnection();String sql = "select * from category";stmt = conn.prepareStatement(sql);rs = stmt.executeQuery();ResultSetMetaData metaData = rs.getMetaData();int count = metaData.getColumnCount();for(int i = 1;i<=count ;i++){String name = metaData.getColumnName(i);String type = metaData.getColumnTypeName(i);System.out.println(name+type);}}catch(Exception e){}}。