password=root # initialSize=10 #最大连接数量 maxActive=50 # maxIdle=20 # minIdle=5 # maxWait=60000 5.C3P0数据源
配置参数:
driverClass jdbcUrl user
password
acquireIncrement:当连接池中已经没有连接时,连接池自动获取连接时一次获取的连接个数。 initialPoolSize:连接池初始化时,获取连接的个数。 maxPoolSize:连接池可以保有的最大的连接的数量。
maxIdleTime:当连接空闲多久时释放连接。如果该时间值设置问为0,表示从不释放连接。 minPoolSize:连接池应该保有的最小的连接的数量。 方式1: ComboPooledDataSource source = new ComboPooledDataSource(); source.setDriverClass(\ source.setJdbcUrl(\ source.setUser(\ source.setPassword(\方式2: ComboPooledDataSource source = new ComboPooledDataSource(); conn = source.getConnection(); 在类加载目录下名称为c3p0-config.xml的配置文件中配置:
如何为tomcat配置数据源:
(1)tomcat/conf/context.xml文件中配置
(2)tomcat/conf/[engin]/[Host]/context.xml文件中可以配置
(3)tomcat/conf/server.xml文件中的
(4)tomcat/conf/[engin]/[Host]/自己创建一个.xml文件,在这个文件中使用
(5)web应用还有第三种配置方式:将web应用直接放置到虚拟主机管理的目录.此时可以在web应用的META-INF文件夹下创建一个context.xml文件,在其中可以写
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,这套API的主要作用在于:它可以把Java对象放在一个容器中(支持JNDI容器 Tomcat),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
十五、JDBC元数据
1.DataBaseMetaData
元数据:数据库、表、列的定义信息。 Connection.getMetaData()
DataBaseMetaData对象
? getURL():返回一个String类对象,代表数据库的URL。 ? getUserName():返回连接当前数据库管理系统的用户名。 ? getDriverName():返回驱动驱动程序的名称。
? getPrimaryKeys(String catalog, String schema, String table):返回指定表主键的结果集。 ? getTables() public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ComboPooledDataSource source = new ComboPooledDataSource(); try{ conn = source.getConnection(); //--获取当前数据库的元数据 } DatabaseMetaData metaData = conn.getMetaData(); //----获取数据库连接时使用的URL String url = metaData.getURL(); System.out.println(url); //----获取数据库的用户名 String username = metaData.getUserName(); System.out.println(username); //----获取驱动的名称 String driverName = metaData.getDriverName(); System.out.println(driverName); //----获取数据库中指定表的主键信息 rs = metaData.getPrimaryKeys(null, null, \ while(rs.next()){ short cseq = rs.getShort(\ String cname = rs.getString(\ System.out.println(cseq+\ } //----获取表 rs = metaData.getTables(null, null, \ while(rs.next()){ String tabName = rs.getString(\ System.out.println(tabName); } }catch (Exception e) { e.printStackTrace(); }finally{ DbUtils.closeQuietly(conn, ps, rs); } 2.ParameterMetaData
PreparedStatement . getParameterMetaData() ? 获得代表PreparedStatement元数据的ParameterMetaData对象。 ? Select * from user where name=? And password=? ParameterMetaData对象 ? getParameterCount() :获得指定参数的个数 ? getParameterTypeName(int param) :获得指定参数的sql类型(Mysql不支持) public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ComboPooledDataSource source = new ComboPooledDataSource(); try{ conn = source.getConnection(); ps = conn.prepareStatement(\ //--获取参数元数据 ParameterMetaData metaData = ps.getParameterMetaData(); //----参数的个数 int count = metaData.getParameterCount(); System.out.println(count); //----获取参数的类型 } String type = metaData.getParameterTypeName(1); System.out.println(type); String type2 = metaData.getParameterTypeName(2); System.out.println(type2); }catch (Exception e) { e.printStackTrace(); }finally{ DbUtils.closeQuietly(conn, ps, rs); } 3.ResultSetMetaData
ResultSet. getMetaData()
? 获得代表ResultSet对象元数据的ResultSetMetaData对象。 ResultSetMetaData对象
? getColumnCount() :返回resultset对象的列数 ? getColumnName(int column) :获得指定列的名称
? getColumnTypeName(int column) :获得指定列的类型 public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ComboPooledDataSource source = new ComboPooledDataSource(); try{ conn = source.getConnection(); ps = conn.prepareStatement(\ rs = ps.executeQuery(); //--获取结果集元数据 ResultSetMetaData metaData = rs.getMetaData(); //----获取结果集中的列数 int cc = metaData.getColumnCount(); //System.out.println(cc); //----获取结果集中指定列的名称 //String cn = metaData.getColumnName(2); //System.out.println(cn); //----获取结果集中指定列的类型的名称 //String ct = metaData.getColumnTypeName(3); //System.out.println(ct); System.out.println(\for(int i = 1;i<=cc;i++){ String cn = metaData.getColumnName(i); String ct = metaData.getColumnTypeName(i); System.out.print(cn+\} System.out.println(); System.out.println(\while(rs.next()){ for(int i =1 ;i<=cc;i++){ Object obj = rs.getObject(i); System.out.print(obj+\ } } System.out.println(); } System.out.println(\ }catch (Exception e) { e.printStackTrace(); }finally{ DbUtils.closeQuietly(conn, ps, rs); } 十六、DBUtils框架
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
API介绍:
? org.apache.commons.dbutils.QueryRunner --- 核心 ? org.apache.commons.dbutils.ResultSetHandler ? 工具类
? org.apache.commons.dbutils.DbUtils。
1.DbUtils类
DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下: ? public static void close(…) throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提
供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。 ? public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,
还能隐藏一些在程序中抛出的SQLException。
? public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛
出SQL异常。
? public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返
回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
2. QueryRunner
2.1简介
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
QueryRunner类提供了两个构造方法: ? 默认的构造方法。
? 需要一个 javax.sql.DataSource 来作参数的构造方法。
2.2主要方法
两个构造方法:
? QueryRunner() --需要控制事务时,使用这组方法
int update(Connection conn, String sql)
Execute an SQL INSERT, UPDATE, or DELETE query without replacement parameters. int update(Connection conn, String sql, Object... params) Execute an SQL INSERT, UPDATE, or DELETE query. int update(Connection conn, String sql, Object param)
Execute an SQL INSERT, UPDATE, or DELETE query with a single replacement parameter.