传智播客-Jdbc-李勇_第1页
传智播客-Jdbc-李勇_第2页
传智播客-Jdbc-李勇_第3页
传智播客-Jdbc-李勇_第4页
传智播客-Jdbc-李勇_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JDBC讲师:

李勇IT资讯交流网WWW.IT315.ORG简介JDBC(JavaDataBaseConnectivity,java数据库连接),由一些接口和类构成的API。J2SE的一部分,由java.sql,javax.sql包组成。IT资讯交流网WWW.IT315.ORG简介应用程序、JDBCAPI、数据库驱动及数据库之间的关系IT资讯交流网WWW.IT315.ORG连接数据的步骤注册驱动(只做一次)建立连接(Connection)创建执行SQL的语句(Statement)执行语句处理执行结果(ResultSet)释放资源快速起步示例IT资讯交流网WWW.IT315.ORG注册驱动Class.forName(“com.mysql.jdbc.Driver”);

推荐这种方式,不会对具体的驱动类产生依赖。DriverManager.registerDriver(com.mysql.jdbc.Driver);

会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。System.setProperty(“jdbc.drivers”,“driver1:driver2”);

虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。驱动类型(四种类型)IT资讯交流网WWW.IT315.ORG建立连接(Connection)Connectionconn=DriverManager.getConnection(url,user,password);url格式:

JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…User,password可以用“属性名=属性值”方式告诉数据库;其他参数如:useUnicode=true&characterEncoding=GBK。IT资讯交流网WWW.IT315.ORG创建执行SQL的语句(Statement)Statement Statementst=conn.createStatement();

st.executeQuery(sql);PreparedStatement Stringsql=“select*fromtable_namewherecol_name=?”;

PreparedStatement

ps=conn.preparedStatement(sql); ps.setString(1,“col_value”);

ps.executeQuery();IT资讯交流网WWW.IT315.ORG处理执行结果(ResultSet)ResultSet

rs=statement.executeQuery(sql);While(rs.next()){

rs.getString(“col_name”);

rs.getInt(“col_name”); //…}IT资讯交流网WWW.IT315.ORG释放资源释放ResultSet,Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。IT资讯交流网WWW.IT315.ORG基本的CRUD(创建、读取、更新、删除)

模板代码

Connectionconn=null;Statementst=null;ResultSet

rs=null;try{ //获得Connection //创建Statement //处理查询结果ResultSet}finally{ //释放资源ResultSet,Statement,Connection}IT资讯交流网WWW.IT315.ORG创建增加对应SQL的INSERT,返回增加成功的行(记录)数

conn=getConnection(); Statementst=conn.createStatement(); Stringsql=“insertintouser(name,age,regist_date

)”+ “values(‘name’,10,now())”;

inti=st.executeUpdate(sql); //i为插入的记录数IT资讯交流网WWW.IT315.ORG读取读取(查询)对应SQL的SELECT,返回查询结果conn=getConnection();st=conn.createStatement();Stringsql="selectid,name,age,regist_datefromuser";rs=st.executeQuery(sql);while(rs.next()){

System.out.print(rs.getInt("id")+"\t\t");

System.out.print(rs.getString("name")+"\t\t");

System.out.print(rs.getInt("age")+"\t\t");

System.out.print(rs.getTimestamp("regist_date")+"\t\t");

System.out.println();}IT资讯交流网WWW.IT315.ORG更新更新(修改)对应SQL的UPDATE,返回被修改的行(记录)数conn=getConnection();Statementst=conn.createStatement();Stringsql=“updatepersonsetname='newname‘”;inti=st.executeUpdate(sql);//i为符合条件的记录数IT资讯交流网WWW.IT315.ORG删除删除对应SQL的DELETE,返回被删除的行(记录)数

conn=getConnection();Statementst=conn.createStatement();Stringsql=“deletefromuserwhereid=1”;inti=st.executeUpdate(sql);//i为删掉的记录数IT资讯交流网WWW.IT315.ORGCRUD总结增、删、改用Statement.executeUpdate来完成,返回整数(匹配的记录数),这类操作相对简单。查询用Statement.executeQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果;查询相对与增、删、改要复杂一些,因为有查询结果要处理。IT资讯交流网WWW.IT315.ORGSQL注入,PreparedStatement和Statement

在SQL中包含特殊字符或SQL的关键字(如:'or1or')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。PreperedStatement(从Statement扩展而来)相对Statement的优点:

1.没有SQL注入的问题。

2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。

3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。IT资讯交流网WWW.IT315.ORG数据类型详细信息见java.sql.Types几种特殊且比较常用的类型

1.DATA,TIME,TIMESTAMP

date,time,datetime存:ps.setDate(i,d);ps.setTime(i,t);ps.setTimestamp(i,ts);

取:rs.getDate(i);rs.getTime(i);rs.getTimestamp(i); 2.CLOBtext

存:ps.setCharacterStream(index,reader,length);

ps.setString(i,s);

取:reader=rs.getCharacterStream(i); reader=rs.getClob(i).getCharacterStream(); string=rs.getString(i); 3.BLOBblob

存:ps.setBinaryStream(i,inputStream,length);

取:rs.getBinaryStream(i);

rs.getBlob(i).getBinaryStream();

IT资讯交流网WWW.IT315.ORG一个简单用户相关的数据访问层

J2EE三层架构简介 表示层、业务逻辑层、数据访问层,三层之间用接口隔离。定义domain对象User,定义存取用户的接口用JDBC实现接口用配置文件(properties)和反射实现与具体类的耦合IT资讯交流网WWW.IT315.ORG事务(ACID)原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。隔离性(isolcation):一个事务处理对另一个事务处理的影响。持续性(durability):事务处理的效果能够被永久保存下来。connection.setAutoCommit(false);//打开事务。mit();//提交事务。connection.rollback();//回滚事务。IT资讯交流网WWW.IT315.ORG事务(SavePoint)当只想撤销事务中的部分操作时可使用SavePointSavePointsp=connection.setSavepoint();connection.rollerbak(sp);mit();IT资讯交流网WWW.IT315.ORG事务(JTA)跨越多个数据源的事务,使用JTA容器实现事务。分成两阶段提交。javax.transaction.UserTransaction

tx=(UserTransaction)ctx.lookup(“jndiName");

tx.begin();

//connection1connection2(可能来自不同的数据库)…

mit();//tx.rollback();IT资讯交流网WWW.IT315.ORG隔离级别多线程并发读取数据时的正确性

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

V:可能出现,X:不会出现隔离级别

脏读

不可重复读

幻读

读未提交(Readuncommitted)VVV读已提交(Readcommitted)xVV可重复读(Repeatableread)xxV可串行化(Serializable

)xxxIT资讯交流网WWW.IT315.ORG存储过程存储过程CallableStatement(从PreperedStatement扩展来)cs=connection.prepareCall(“{call

psname(?,?,?)}”);cs.registerOutParameter(index,Types.INTEGER);cs.setXXX(i,xxxx);cs.executeUpdate();intid=cs.getInt(index);IT资讯交流网WWW.IT315.ORG其他的几个APIPreparedStatement.getGeneratedKeys()

PreparedStatement

ps=connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

ps.executeUpdate();

ResultSet

rs=st.getGeneratedKeys();rs.getInt(1);批处理,可以大幅度提升大量增、删、改的速度。

PreparedStatement.addBatch();

PreparedStatement.executeBatch();IT资讯交流网WWW.IT315.ORG其他的几个API可滚动的结果集

Statementst=

connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet

rs=st.executeQuery(sql);

rs.beforeFirst();rs.afterLast();rs.first();rs.isFirst();rs.last();rs.isLast(); rs.absolute(9);rs.moveToInsertRow();可更新的结果集

conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_UPDATABLE);

rs.updateString("colname","newvalue");

rs.updateRow();IT资讯交流网WWW.IT315.ORGDatabaseMetaData和ParameterMetaDataDatabaseMetaDatameta=connection.getMetaData();通过DatabaseMetaData可以获得数据库相关的信息如:数据库版本、数据库名、数据库厂商信息、是否支持事务、是否支持某种事务隔离级别,是否支持滚动结果集等。ParameterMetaData

pmd= preparedStatement.getParameterMetaData();通过ParameterMetaData可以获得参数信息。IT资讯交流网WWW.IT315.ORGResultSetMetaDataResultSetMetaDatameta=rs.getMetaData();通过ResultSetMetaData可以获得结果有几列、各列名、各列别名、各列类型等。可以将ResultSet放入Map(key:列名value:列值)。用反射ResultSetMetaData将查询结果读入对象中(简单的O/RMapping)

1)让SQL语句中列别名和要读入的对象属性名一样;

2)通过ResultSetMetaData获得结果列数和列别名;

3)通过反射将对象的所有setXxx方法找到; 4)将3)找到的方法setXxx和2)找到的列别名进行匹配(即方法中的xxx于列别名相等);

5)由上一步找到的方法和列别名对应关系进行赋值

Method.invoke(obj,rs.getObject(columnAliasName));IT资讯交流网WWW.IT315.ORG数据源和连接池DataSource用来取代DriverManager来获取Connection;通过DataSource获得Connection速度很快;通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改。一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度;连接池可以理解成一个能够存放Connection的Collection;我们的程序只和DataSource打交道,不会直接访问连接池;IT资讯交流网WWW.IT315.ORG一个简单的数据源实现使用代理模式的Connection(核心代码)

classMyConnectionimplementsConnection{ privateConnectionrealConn; privateLinkedList

connPool;

MyConnection(Connection

rConn,LinkedList

cPool){

this.realConn=rConn;

this.connPool=cPool; } publicvoidclose(){

this.connPool.addLast(this); } //…. }IT资讯交流网WWW.IT315.ORG一个简单的数据源实现DataSource(核心代码)

classMyDataSourceimplementsDataSource{ privateLinkedList

connPool=newVector(); publicConnectiongetConneciton(){

if(this.connPool.size()>0) returnthis.connPool.removeFirst(0); returncreateConnection(); } privateConnectioncreateConnection(){ ConnectionrealConn=DriverManager.getConnection(); ConnectionmyConn= newMyConnection(realConn,this.connPool); returnmyConn; } //…. }IT资讯交流网WWW.IT315.ORG常用的开源实现DBCP使用DBCP必须用的三个包:

commons-dbcp-1.2.1.jar,commons-pool-1.2.jar,commons-collections-3.1.jar。配置参数。JavaAPI:BasicDataSourceFactory.createDataSource(properties);

IT资讯交流网WWW.IT315.ORG使用继承优化JDBC代码(模板模式)优化查询操作,区分开变化和不变的部分:

sql和ResultSet的处理是变化部分,创建和释放资源部分是不变部分。提取超类,将不变部分放入超类,变化部分留给子类实现。超类的主要代码:

publicObjectfind(String

sql,Object[]args){ …

rs=ps.executeQuery(); if(rs.next())returnrowMapper(rs); … } protectedabstractObjectrowMapper(ResultSet

rs);IT资讯交流网WWW.IT315.ORG使用组合优化JDBC代码(策略模式)优化查询操作,区分开变化和不变的部分:

sql和ResultSet的处理是变化部分,创建和释放资源部分是不变部分。提取接口封装变化部分。JDBC操作主要代码:

publicObjectfind(String

sql,Object[]args,RowMapper

rowMapper){ …

rs=ps.executeQuery(); if(rs.next())return

rowMapper.mapRow(rs); … }回调接口:

publicinterfaceRowMapper{ publicObjectmapRow(ResultSet

rs)throwsSQLException; }IT资讯交流网WWW.IT315.ORGSpring的JdbcTemplate查询带有参数,和行映射方法: publicObjectqueryForObject(String

sql,Object[]args,RowMapper

rowMapper),使用自定义的UserRowMapper完成映射。一个RowMapper的常用实现BeanPropertyRowMapper,该实现可将结果集转换成一个JavaBean(字段名与JavaBean属性名不符合规范,可用别名处理)。publicListquery(String

sql,Object[]args,RowMapper

rowMapper)返回多个结果。publicint

queryForInt(String

sql)(如:selectcount(*)fromuser),其他结果比如String可用queryForObject方法向下转型。publicMapqueryForMap(String

sql,Object[]args)返回若类型的Map(key:字段名或别名,value:列值)。publicListqueryForList(String

sql,Object[]args)返回多Map。IT资讯交流网WWW.IT315.ORGSpring的JdbcTemplate更新publicint

update(String

sql,Object[]args)。插入数据并获得结果:

publicObjectexecute(ConnectionCallbackaction)其他方法简介IT资讯交流网WWW.IT315.ORGSpring的NamedParameterJdbcTemplateNamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干;NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。publicObjectqueryForObject(String

sql,MapparamMap,Ro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论