传智播客Jdbc3方立勋.ppt

上传人:sccc 文档编号:4923213 上传时间:2023-05-23 格式:PPT 页数:28 大小:199.51KB
返回 下载 相关 举报
传智播客Jdbc3方立勋.ppt_第1页
第1页 / 共28页
传智播客Jdbc3方立勋.ppt_第2页
第2页 / 共28页
传智播客Jdbc3方立勋.ppt_第3页
第3页 / 共28页
传智播客Jdbc3方立勋.ppt_第4页
第4页 / 共28页
传智播客Jdbc3方立勋.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《传智播客Jdbc3方立勋.ppt》由会员分享,可在线阅读,更多相关《传智播客Jdbc3方立勋.ppt(28页珍藏版)》请在三一办公上搜索。

1、北京传智播客教育,JDBC开发,讲师:方立勋,北京传智播客教育,Tip:使用数据库连接池优化程序性能,DB,dao,servlet,用户3,用户1,用户2,用户n,connection,缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。,应用程序直接获取链接的缺点,北京传智播客教育,Tip:使用数据库连接池优化程序性能,DB,dao,servlet,用户3,用户1,用户2,用户n,connection,connecti

2、on,connection,connection,connection,连接池,用从连接池中获得的连接与数据库通迅,北京传智播客教育,Tip:编写数据库连接池,编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:Connection getConnection()Connection getConnection(Stringusername,Stringpassword)实现DataSource接口,并实现连接池功能的步骤:在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedLi

3、st对象中。实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。Collection保证将自己返回到LinkedList中是此处编程的难点。,北京传智播客教育,Tip:数据库连接池核心代码,使用动态代理技术构建连接池中的connection,proxyConn=(Connection)Proxy.newProxyInstance(t

4、his.getClass().getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler()/此处为内部类,当close方法被调用时将conn还回池中,其它方法直接执行public Object invoke(Object proxy,Method method,Object args)throws Throwable if(method.getName().equals(close)pool.addLast(conn);return null;return method.invoke(conn,args););

5、,北京传智播客教育,Tip:开源数据库连接池,现在很多WEB服务器(Weblogic,WebSphere,Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。也有一些开源组织提供了数据源的独立实现:DBCP 数据库连接池C3P0 数据库连接池实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。,北京传智播客教育,Tip:DBCP数据源,DBCP 是 Apache 软件基金组织下的开源连接池实现,使用

6、DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:Commons-dbcp.jar:连接池的实现Commons-pool.jar:连接池实现的依赖库Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。,北京传智播客教育,Tip:DBCP数据源,使用DBCP示例代码:,staticInputStream in=JdbcUtil.class.getClassLoader().getResourceAsStream(dbcpconfig.properties);Properties prop=new Properties();

7、prop.load(in);BasicDataSourceFactory factory=new BasicDataSourceFactory();dataSource=factory.createDataSource(prop);,北京传智播客教育,Tip:C3P0 数据源,北京传智播客教育,Tip:配置Tomcat数据源,查看Tomcat文档,示例代码:,Context initCtx=new InitialContext();Context envCtx=(Context)initCtx.lookup(java:comp/env);dataSource=(DataSource)envCt

8、x.lookup(jdbc/datasource);,特别提醒:此种配置下,驱动jar文件需放置在tomcat的lib下,北京传智播客教育,Tip:JNDI技术简介,JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。,北京传智播客教育

9、,编写自己的JDBC框架,北京传智播客教育,Tip:元数据 DataBaseMetaData,元数据:数据库、表、列的定义信息。Connection.getDatabaseMetaData()DataBaseMetaData对象getURL():返回一个String类对象,代表数据库的URL。getUserName():返回连接当前数据库管理系统的用户名。getDatabaseProductName():返回数据库的产品名称。getDatabaseProductVersion():返回数据库的版本号。getDriverName():返回驱动驱动程序的名称。getDriverVersion():

10、返回驱动程序的版本号。isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。,北京传智播客教育,Tip:元数据 ParameterMetaData,PreparedStatement.getParameterMetaData()获得代表PreparedStatement元数据的ParameterMetaData对象。ParameterMetaData对象getParameterCount()获得指定参数的个数getParameterType(intparam)获得指定参数的sql类型,北京传智播客教育,Tip:元数据 ResultSetMetaData,ResultS

11、et.getMetaData()获得代表ResultSet对象元数据的ResultSetMetaData对象。ResultSetMetaData对象getColumnCount()返回resultset对象的列数getColumnName(intcolumn)获得指定列的名称getColumnTypeName(intcolumn)获得指定列的类型,北京传智播客教育,Tip:使用元数据简化JDBC代码,业务背景:系统中所有实体对象都涉及到基本的CRUD操作:所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法

12、中,并定义参数接收变化的SQL语句。实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。,北京传智播客教育,Tip:O-R Mapping简介,什么是O-R Mapping常用O-R Mapping映射工具HibernateIbatisCommons DbUtils(只是对JDBC简单封装),北京传智播客教育,ApacheDBUtils框架,北京传智播客教育,简介,commons-dbutils

13、是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。API介绍:mons.dbutils.QueryRmons.dbutils.ResultSetHandler工具类mons.dbutils.DbUtils、。,北京传智播客教育,DbUtils类,DbUtils:提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:public static void close()

14、throws java.sql.SQLException:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。public static void closeQuietly():这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。public static void commitAndCloseQuietly(Connection conn):用来提交连接,然后关闭连接,并且在

15、关闭连接时不抛出SQL异常。public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。,北京传智播客教育,QueryRunner类,该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。QueryRunner类提供了两个构造方法:默认的构造方法需要一个 javax.sql.DataSource 来作参数的构造方法。,北

16、京传智播客教育,QueryRunner类的主要方法,public Object query(Connection conn,String sql,Object params,ResultSetHandler rsh)throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。public Object query(String sql,Object params,ResultSetHandler rsh)throws SQLExceptio

17、n:几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource)或使用的setDataSource 方法中重新获得 Connection。public Object query(Connection conn,String sql,ResultSetHandler rsh)throws SQLException:执行一个不需要置换参数的查询操作。public int update(Connection conn,String sql,Object params)throws SQLException:用来执行一个更新(插入、更新或删除

18、)操作。public int update(Connection conn,String sql)throws SQLException:用来执行一个不需要置换参数的更新操作。,北京传智播客教育,ResultSetHandler接口,该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。ResultSetHandler 接口提供了一个单独的方法:Object handle(java.sql.ResultSet.rs)。,北京传智播客教育,ResultSetHandler 接口的实现类,ArrayHandler:把结果集中的第一行数据转成对象数组。ArrayList

19、Handler:把结果集中的每一行数据都转成一个数组,再存放到List中。BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。,北京传智播客教育,ResultSetHandler 接口的实现类,ColumnListHandler:将结果集中某一列的数据存放到List中。KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。MapHandler:将结果集中的第一行数

20、据封装到一个Map里,key是列名,value就是对应的值。MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List,北京传智播客教育,Tip:使用Jdbc操作多个表,部门和员工(一对多关系)对象关系 数据库关系,int Id String nameSet employees,int Id String nameDepartment d,Department,Employee,Id int name String,Id int name String department_id int,Department表,Employee表,外键,北京传智播客教育,Tip:使用Jdbc操作多个表,老师和学生(多对多关系),Id int name varchar,Id int name varchar,Teacher表,Student表,teacher_id intstudent_id int,中间表,外键,外键,数据库表结构,北京传智播客教育,Tip:注意事项,不管java的对象存在何种关系,反映到关系型数据库中,都是使用外键表示纪录(即对象)的关联关系。设计java对象如涉及到多个对象相互引用,要尽量避免使用一对多,或多对多关系,而应使用多对一描述对象之间的关系(或使用延迟加载的方式)。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号