2011级-csdn-java-张侃— JDBC开发—连接池(二)
2012-11-27 14:27
447 查看
l 配置Tomcat数据源
示例代码:
context.xml
DemoServlet.java
运行结果:
JNDI技术简介
lJNDI(Java Naming and DirectoryInterface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
l 这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
l 其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
编写自己的JDBC框架
l 元数据-DataBaseMetaData
l 元数据:数据库、表、列的定义信息。
lConnection.getDatabaseMetaData()
lDataBaseMetaData对象
lgetURL():返回一个String类对象,代表数据库的URL。
lgetUserName():返回连接当前数据库管理系统的用户名。
lgetDatabaseProductName():返回数据库的产品名称。
lgetDatabaseProductVersion():返回数据库的版本号。
lgetDriverName():返回驱动驱动程序的名称。
lgetDriverVersion():返回驱动程序的版本号。
lisReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
l 元数据-ParameterMetaData
lPreparedStatement .getParameterMetaData()
l 获得代表PreparedStatement元数据的ParameterMetaData对象。
lSelect * from user where name=?And password=?
lParameterMetaData对象
lgetParameterCount()
l 获得指定参数的个数
lgetParameterType(int param)
l 获得指定参数的sql类型
lResultSet. getMetaData()
l 获得代表ResultSet对象元数据的ResultSetMetaData对象。
lResultSetMetaData对象
lgetColumnCount()
l 返回resultset对象的列数
lgetColumnName(int column)
l 获得指定列的名称
lgetColumnTypeName(int column)
l 获得指定列的类型
l 使用元数据简化JDBC代码
l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
l 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
l 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
Apache—DBUtils框架
lcommons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
l API介绍:
•org.apache.commons.dbutils.QueryRunner--BDManager
•org.apache.commons.dbutils.ResultSetHandler—处理结果集
• 工具类
•org.apache.commons.dbutils.DbUtils、。
DbUtils类
lDbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
•public static void close(…)throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
•public static voidcloseQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
•public static voidcommitAndCloseQuietly(Connection conn):用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
•public static booleanloadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
QueryRunner类
l 该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
lQueryRunner类提供了两个构造方法:
• 默认的构造方法
• 需要一个javax.sql.DataSource 来作参数的构造方法。
QueryRunner类的主要方法
lpublic Object query(Connectionconn, String sql, Object[] params,ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
lpublic Object query(String sql,Object[] params, ResultSetHandler rsh) throwsSQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource方法中重新获得Connection。
lpublic Object query(Connectionconn, String sql, ResultSetHandler rsh) throwsSQLException : 执行一个不需要置换参数的查询操作。
lpublic int update(Connectionconn, String sql, Object[] params) throwsSQLException:用来执行一个更新(插入、更新或删除)操作。
lpublic int update(Connectionconn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
ResultSetHandler接口
l 该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
lResultSetHandler 接口提供了一个单独的方法:Object handle(java.sql.ResultSet .rs)。
ResultSetHandler 接口的实现类
lArrayHandler:把结果集中的第一行数据转成对象数组。
lArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
lBeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
lBeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ResultSetHandler 接口的实现类
lColumnListHandler:将结果集中某一列的数据存放到List中。
lKeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
lMapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
lMapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
示例代码:
context.xml
<Context> <Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" maxActive="8" maxIdle="4" /> </Context>
DemoServlet.java
package com.hbsi.servlet; import java.io.IOException; import java.sql.Connection; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; public class DemoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //初始化jndi容器 Context initCxt = new InitialContext(); //检索出web服务器中的jndi容器 Context envCxt =(Context) initCxt.lookup("java:comp/env"); //从jndi容器中检索出连接池 DataSource ds = (DataSource) envCxt.lookup("jdbc/testDB"); Connection conn = ds.getConnection(); System.out.println(conn); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
运行结果:
JNDI技术简介
lJNDI(Java Naming and DirectoryInterface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
l 这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
l 其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
编写自己的JDBC框架
l 元数据-DataBaseMetaData
l 元数据:数据库、表、列的定义信息。
lConnection.getDatabaseMetaData()
lDataBaseMetaData对象
lgetURL():返回一个String类对象,代表数据库的URL。
lgetUserName():返回连接当前数据库管理系统的用户名。
lgetDatabaseProductName():返回数据库的产品名称。
lgetDatabaseProductVersion():返回数据库的版本号。
lgetDriverName():返回驱动驱动程序的名称。
lgetDriverVersion():返回驱动程序的版本号。
lisReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
l 元数据-ParameterMetaData
lPreparedStatement .getParameterMetaData()
l 获得代表PreparedStatement元数据的ParameterMetaData对象。
lSelect * from user where name=?And password=?
lParameterMetaData对象
lgetParameterCount()
l 获得指定参数的个数
lgetParameterType(int param)
l 获得指定参数的sql类型
lResultSet. getMetaData()
l 获得代表ResultSet对象元数据的ResultSetMetaData对象。
lResultSetMetaData对象
lgetColumnCount()
l 返回resultset对象的列数
lgetColumnName(int column)
l 获得指定列的名称
lgetColumnTypeName(int column)
l 获得指定列的类型
l 使用元数据简化JDBC代码
l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
l 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
l 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
Apache—DBUtils框架
lcommons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
l API介绍:
•org.apache.commons.dbutils.QueryRunner--BDManager
•org.apache.commons.dbutils.ResultSetHandler—处理结果集
• 工具类
•org.apache.commons.dbutils.DbUtils、。
DbUtils类
lDbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
•public static void close(…)throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
•public static voidcloseQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
•public static voidcommitAndCloseQuietly(Connection conn):用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
•public static booleanloadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
QueryRunner类
l 该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
lQueryRunner类提供了两个构造方法:
• 默认的构造方法
• 需要一个javax.sql.DataSource 来作参数的构造方法。
QueryRunner类的主要方法
lpublic Object query(Connectionconn, String sql, Object[] params,ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
lpublic Object query(String sql,Object[] params, ResultSetHandler rsh) throwsSQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource方法中重新获得Connection。
lpublic Object query(Connectionconn, String sql, ResultSetHandler rsh) throwsSQLException : 执行一个不需要置换参数的查询操作。
lpublic int update(Connectionconn, String sql, Object[] params) throwsSQLException:用来执行一个更新(插入、更新或删除)操作。
lpublic int update(Connectionconn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
ResultSetHandler接口
l 该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
lResultSetHandler 接口提供了一个单独的方法:Object handle(java.sql.ResultSet .rs)。
ResultSetHandler 接口的实现类
lArrayHandler:把结果集中的第一行数据转成对象数组。
lArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
lBeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
lBeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ResultSetHandler 接口的实现类
lColumnListHandler:将结果集中某一列的数据存放到List中。
lKeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
lMapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
lMapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
相关文章推荐
- 2011级-csdn-java-张侃— JDBC开发—连接池(一)
- 2011级-csdn-java-张侃— JDBC开发—文件的上传和下载(一)
- 2011级-csdn-java-张侃— JDBC开发—文件的上传和下载(二)
- 2011级-csdn-java-张侃— Servlet监听器在开发中的应用案例
- 2011级-csdn-java-张侃— JavaWEB开发-国际化(二)
- 2011级-csdn-java-张侃— JavaWEB开发-国际化(一)
- 2011级-csdn-java-张侃—struts2文件上传错误信息国际化的处理(案例)
- 2011级-csdn-java-张侃— 过滤器(自动登录)
- 2011级-csdn-java-张侃—自定义JSP标签(二)
- 2011级-csdn-java-张侃— Servlet事件监听器
- 2011级-csdn-java-张侃— Hibernate原理与应用(二)
- 2011级-csdn-java-张侃— struts2-上传功能
- 2011级-csdn-java-张侃—Spring加载配置web
- 2011级-csdn-java-张侃—Struts2了解
- 2011级-csdn-java-张侃— Struts2——HelloWorld
- 2011级-csdn-java-张侃— 过滤器
- 2011级-csdn-java-张侃— Hibernate原理与应用(三)
- 2011级-csdn-java-张侃—Spring(2)
- 2011级-csdn-java-张侃— struts2的优点
- 2011级-csdn-java-张侃—第十一周周报