传智播客Jdbc(精)_第1页
传智播客Jdbc(精)_第2页
免费预览已结束,剩余22页可下载查看

下载本文档

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

文档简介

1、北京传智播客教|7 www.itcaGC传智播客 一 k 级软件人才实作培训专审!简介JDBC (Java Data Base Connectivity Java数据库连 接),由一些接口和类构成的APIoJ2SE的一部分,iljava.sqljavax.sql包组成。北京传智播客教|7 www.itcaGV_丿丿北京:传智播客教I? C传智播客 一7T级软件人才实作培训专家!简介应用程序、JDBCAPK 数据库驱动及数据库 Z 间的关系北京传智播客教|7 厂 传智播客 一7T级软件人才夹作培训专家!连接数据的步骤注册驱动(只做一次)建立连接(Connection)创建执行SQL的语句(Sta

2、tement)执行语句处理执行结果(ResultSet)释放资源快速起步示例MySQL Dnver凶用!疔丿北京传智播客教仃注册驱动Class.forName(ucom.mysql.jdbc.Driver);推荐这种方式,不会对具体的驱动类产生依赖。DriverManager.registerDriver(com.mysql.jdbc. Driver);会造成DriverManager中产生两个一样的驱动,并会 对具体的驱动类产屋依赖。System.setProperty(jdbc.drivers, driverl:driver2,);虽然不会对具体的驱动类产生依赖;但注册不太方便, 所以很少

3、使用。驱动类型(四种类型)北京:传智播客教|7 C传智播客 一7T级软件人才实作培训专家!www. itcast.c n建立连接(C oniiectioii)Connection conn = DriverManager.getCormection(url,user, password);url格式:JDBC:子协议:子名称主机名:端口/数据库名? 届忡夕;=丿曲祚值&User,password可以用“属性名=属性值”方式 告诉薮据库;厂传丿北京:传智播客教I? 其 他 参 数 如 :useUnicode=true&characterEncoding=GBK。C传智播客 一 k

4、 级软件人才卖作培训专家!、仓U建执行SQL的语句(Statement)StatementStatement st = conn.createStatement();st.executeQuery(sql);PreparedStatementString sql = “select * from table_name where col name=?n;PreparedStatement ps = conn.preparedStatement(sql);ps.setStri ng(1col_valuej;ps.executeQuery();北京传智播客教仃C传智播客 一 k 级软件人才卖作培训

5、专家!、处理执行结果(ResultSet)ResultSet rs = statement.executeQuery(sql);While(rs.next()rs.getString(ucol_namen);rs.getlnt(ucol_namen);II.北京传智播客教仃厂 传智播客 一7T级软件人才实作培训专家!、释放资源释放ResultSet, Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完 后必须马上释放,如果Connection不能及时正确的关 闭将导致系统宕机。Connection的使用原则是尽量晚 创建,尽量早的释放。V_丿北京

6、传智播客教仃基本的CRUD(创建、读取、更新、删除)模板代码Connection conn = null;Statement st=null;ResultSet rs = null;try 获得Connection创睡Statement厂传北京传智播客教仃处理查询结果ResultSet finally 释放资源ResultSet, Statement,Connection北京传智播客教仃创建增加对应SQL的INSERT,返回增加成功的行(记录) 数conn = getC onn ection();Statement st = conn.createStatement();String sql二

7、“insert into user(name, age,regist_date )” +Uvalues(*name, 10, now()M;int i = st.executeUpdate(sql);i为插入的记录数北京传智播客教仃厂 传智播客 一级软件人才实作培训专家!读取读取(查询)対应 SQL 的 SELECT,返回查询结果conn = getC onn ecti on();st = conn .createStatement();String sql = select id, name, age,regist_date from user11;rs = st.executeQuery(

8、sql);while (rs.next() System.out.pnt(rs.getlnt(id,) + tt);System.out.print(rs.getString(name) + tt);System.out.pnnt(rs.getlnt(Hage) +Htt);System.out.print(rs.getTimestamp(,regist_date,) + ” tt ”);System.out.println();厂传北京传智播客教仃丿北京传智播客教I? 厂 传智播客 一 k 级软件人才夹作培训专家!更新更新(修改)对应 SQL 的 UPDATE,返冋被修改的行(记录)数con

9、n = getConn ection();Statement st = conn.createStatement();String sql=uupdate person set name=new nametn;int i = st.executeUpdate(sql);i为符合条件的记录数V_丿北京传智播客教仃删除删除对应SQL的DELETE,返回被删除的行(记录)数conn = getConn ection();Statement st = conn.createStatement();String sql-*delete from user where id=1n;int i = st.e

10、xecuteUpdate(sql);i为删掉的记录数厂传髙丿北京传智播客教仃C传智播客 一7T级软件人才实作培训专家!CRUD总结增、删、改IJStatement.executeUpdate完成,返 回整数(匹配的记录数),这类操作相对简单。查询JIJStatement.executeQuery:完成,返回的是ResultSet对彖,ResultSet中包含了查询的结杲;查 询相对与增、册ij、改要复杂一些,因为有查询结果耍 处理。北京传智播客教I? C传智播客 一7T级软件人才实作培训专家!SQL注入9PreparedS tatemen t和Statement在 SQL 中包含特殊字符或 S

11、QL 的关键字(如:orloL)时Statement 将出现不可预料的结果(出现异常或查询的结果 不正确),町用 PreparedStatement 來解决。 PreperedStatement (从 Statement 扩展而来)相对 Statement 的优点:1.没有 SQL 注入的问题。2Statement 会使数据斥频繁编译 SQL,町能造成数据库缓 冲区溢出。3数据库和驱动可以对 PreperedStatement 进彳亍优化(只有 在相关联的数据库连接没有关闭的情况下有效)。丿北京传智播客教I? 厂 传智播客 一 k 级软件人才卖作培训专家!数据类型详细信息见java.sql.T

12、ypes几种特殊且比较常用的类型1 .DATA,TIME,TIMESTAMPS date,time,datetime/;ps.octDatc(i,d); ps.GCtTimc(i,t);ps.GCtTimcGtamp(i, to);I仪:rs.getDate(i); rs.getTime(i); rs.getTimestamp(i);2. CLOB T text存:ps.setCharacterStream(index, reader, length); ps.setString(i, s);取:reader = rs. getCharacterStream(i);reader = rs.ge

13、tClob(i).getCharacterStream(); string = rs.getStri ng(i);3. BLOB T blob存:ps.setBinaryStream(i, inputstream, length);取:rs.getBinaryStream(i);rs.getBlob(i).getBinaryStream();北京传智播客教仃一个简单用户相关的数据访问层 J2EE三层架构简介表示层、业务逻辑层、数据访问层,三层之间用 接口隔离。定义domain对彖User,定义存取用户的接口用JDBC实现接口用配置文件(properties)和反射实现与具体类的耦合厂传北京传智

14、播客教仃C传智播客一高级软件人才卖作培训专家事务(ACID)原子性(atomicity):组成事务处理的语句形成了一个逻辑单 元,不能只执行其中的一部分。致性(consistency):在事务处理执行前后,数据库是一 致的(数据库数据完整性约束)。隔离性(isolation):个事务处理对另一个事务处理的影 响。持续性(durability):事务处理的效果能够被永久保存下來。connection.setAutoCommit(false);/ 打开事务。conn ectio mit(); 提交事务。 connection.rollback();/|nl 滚爭务。北京传智播客教仃厂 传智播客 一

15、高级软件人才卖作培训专家!、当只想撤销事务中的部分操作时可便用 SavePointSavePoint sp = connectiorisetSavepoint();conn ectio n.rollerbak(sp);connectioricommit();C传智播客 一 k 级软件人才夹作培训专家!、事务(JTA)跨越多个数据源的事务,使用 JTA 容器实现事务。分成两阶段提交。 Javax.transactlon.UserTransacilon lx =丿北京传智播客教仃(UserTra nsaction)ctx .Iookupfj ndiName);tx.begin();/connect

16、ion 1 connection2(可能来口不同的数据库)mit();/tx.rollback();V_丿北京传智播客教疗C传智播客 一 k 级软件人才夹作培训专家!、隔离级别多线程并发读取数据时的止确性conn ection.setTransactionlsolation(C onn ection.TRANSACTION_READ_COMMITTED);V:可能出现,X:不会出现隔离级别脏读不可重复读幻读读未捉交(Read uncommitted)VVV读已提交(Read committed)XVV可重复读(Repeatable read)XXV可串行化(Serializable )XXXC

17、传智播客 一高级软件人才夹作培训专家!存储过程北京传智播客教仃存储过程CallableStatement(从PreperedStatement扩展來)cs =connection.prepareCall(ucall psname(?,?,?)n);cs.registerOutParameter(index, TypesNTEGER); cs.setXXX(i,xxxx);cs.executeUpdate();int id=cs.getlnt(index);北京传智播客教I? C传智播客 一 k 级软件人才夹作培训专家!其他的几个API PreparedStatement.getGe nerat

18、edKeys() PreparedStatement ps =connection.prepar9Statement(sql,StatementRETURN_ GENERATED _KEYS);ps.executeUpdate();ResultSet rs = st.getGeneratedKeys();rs.getlnt(1);批处理,町以大幅度提升大量增、删、改的速度。PreparedStatement.addBatch();PreparedStatement.executeBatch();丿北京传智播客教|7 C传智播客 一髙级软件人才夹作培训专家!其他的几个API町滚动的结果集Stat

19、ement st =connection.createStatement(ResultSet.TYPE SCROLL SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs = st.executeQuery(sql);rs.beforeFirst(); rs.afterLast();rs.first();rs.isFirst();rs.last();rsJsLast();rs.absolute(9);rs.moveTolnsertRow();可更新的结果集conn.createStatement(ResultSet.TYPE_SCROLL SEN

20、SITIVE,ResultSeLCONCURUPDATABLE);rs.updateString(Hcol namew,Mnew value*);rs.updateRow();北京传智播客教|7 C传智播客 一髙级软件人才夹作培训专家!DatabaseMetaDatafllParameterlVletaDataDatabaseMetaData meta =connectio n.getMetaData();通过DatabaseMetaData可以获得数据库相关的信息如:数拯库版本、数拯库名、数据库厂商信息、是否 支坪事务、是否支持某种事务隔离级别,是否支持滚 动绪果集等。ParameterMe

21、taData pmd =preparedStatement.getParameterMetaData();通过ParameterMetaDatanf以获得参数信息。北空传智播客教仃C传智播客 一髙级软件人才卖作培训专家!、ResultSetMetaDataResultSetMetaData meta = rs.getMetaData();通过 ResultSetMetaData 町以获得结果冇儿列、各列名、各列别 名.各列类型等。町以将 ResultSet 放入 Map(key:列名 value:列值)。用反射 ResultSetMetaData 将查询结果读入对彖中(简单的 O/RMappi

22、ng)1)让 SQL 语句中列别名和要读入的对象属性名一样;2)通过 ResultSetMetaData 获得结果列数和列别名;3)通过反射将对彖的所有 setXxx 方法找到;4)将 3) 找到的方法 setXxx 和 2) 找到的列别名进行匹配 (即方法 中的 xxx 于列别名和等):5)由上一步找到的方法和列别名对应关系进行赋值 Methodinvoke(obj, rs.getObject(columnAliasName);0)return this.connPool.removeFirst(O); returncreateConnection();private Connection

23、createConnection()Connection realConn = DriverManager.getConnection();Connection myConn = newMyConnection(realConn,this.connPool);return myConn;-nrTT.-丿北京传智播客教仃常用的开源实现DBCP使用DBCP必须用的三个包:commons-dbcp-1.2.1 .jar,commons-pool-1.2.jar, commons-collections-3.1 .jar配置参数。JavaAPI:BasicDataSourceFactory.creat

24、eDataSource( properties);北京传智播客教仃C传智播客一髙级软件人才卖作培训专家!、使用继承优化JDB C代码(模板模式)优化查询操作,区分开变化和不变的部分:sql和ResultSet的处理是变化部分,创建和释放资源部分是不变部分。 提取超类,将不变部分放入超类,变化部分留给子类实现。超类的主要代码:public Object find(String sql, Object args)(rs = ps.executeQuery();if (rs.next() return rowMapper(rs);protected abstract Object rowMapper

25、(Resu tSet rs);传智播客髙级软件人才实作培训专家!、丿北京传智播客教|7 C传智播客 一髙级软件人才卖作培训专家!、使用组合优化JDB C代码(策略模式)优化查询操作,区分开变化和不变的部分:sql利ResultSet的处理是变化部分,创建和释放资源部分是不变部分。提取接厂I封装变化部分。 JDBC操作主要代码:public Object find(String sql, Object args, RowMapper rowMapper) rs = ps.executeQuery();if (rs.next()return rowMapper.mapRow(rs);冋调接M:pu

26、blic interface RowMapper public Object mapRow(ResultSet rs) throws SQLException;-北京传智播客教|7 C传智播客 一髙级软件人才卖作培训专家!、Spring iKlJdbcTemplate丿北京:传智播客教厂 传智播客 一7T级软件人才卖作培训专家!Spring 的 JdbcTevnplate 更新public int update(String sql, Object args)。插入数据并获得结果:public Object execute(ConnectionCallback action)其他方法简介V_丿

27、北京:传智播客教厂 传智播客 一7T级软件人才卖作培训专家!SpringIT9NamedParameterJdbcTemplateig sql, SqIParameterSourcePPer)丿北京传智播客教|7 C传智播客 一 k 级软件人才实作培训专家!Spring 的 Simple JdbcTemplateSimpleJdbcT emplate内部包禽了 个N amedParameterJdbcTemplate;所以NamedParameterJdbcTemplate能做的爭怙SimpleJdbcTemplate能I , SimpleJdbcTemplate相对J NamedParame

28、terJdbcTemplate主要増加f JDK5.0的 和可变长度参数支持。public List query(String sql, Paiameteriz9dRowMapper rm, Object. args)public T queryForObject(String sql, ParameterizedRowMapper rm,SqIParameterSource args)public List query(String sql, ParameterizedRowMapper rm,SqIParameterSource args)getJdbcOperations返冋的是JdbcOperations(实现JdbcTemplate)aetNamed ParameterJdbcOperations返回的是NamedParameterJdbcOperations(实现是NamedParameterJdbcTemplate)北京传智播客教I? 实现 UserDao 接口实现UserDao接口修改perties文件,切换U serDao的 实现。测试UserDao的新的实现类。伶询带有参数,和行映射方法:

温馨提示

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

评论

0/150

提交评论