Java Data Base Connectivity.ppt

上传人:laozhun 文档编号:2239461 上传时间:2023-02-05 格式:PPT 页数:28 大小:110.50KB
返回 下载 相关 举报
Java Data Base Connectivity.ppt_第1页
第1页 / 共28页
Java Data Base Connectivity.ppt_第2页
第2页 / 共28页
Java Data Base Connectivity.ppt_第3页
第3页 / 共28页
Java Data Base Connectivity.ppt_第4页
第4页 / 共28页
Java Data Base Connectivity.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《Java Data Base Connectivity.ppt》由会员分享,可在线阅读,更多相关《Java Data Base Connectivity.ppt(28页珍藏版)》请在三一办公上搜索。

1、北京传智播客教育,JDBC,讲师:李勇,北京传智播客教育,简介,JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API。J2SE的一部分,由java.sql,javax.sql包组成。,北京传智播客教育,简介,应用程序、JDBC API、数据库驱动及数据库之间的关系,北京传智播客教育,连接数据的步骤,注册驱动(只做一次)建立连接(Connection)创建执行SQL的语句(Statement)执行语句处理执行结果(ResultSet)释放资源快速起步示例,北京传智播客教育,注册驱动,Class.forName(“com.mysql.j

2、dbc.Driver”);推荐这种方式,不会对具体的驱动类产生依赖。DriverManager.registerDriver(com.mysql.jdbc.Driver);会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。System.setProperty(“jdbc.drivers”,“driver1:driver2”);虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。驱动类型(四种类型),北京传智播客教育,建立连接(Connection),Connection conn=DriverManager.getConnection(url,user

3、,password);url格式:JDBC:子协议:子名称/主机名:端口/数据库名?属性名=属性值&User,password可以用“属性名=属性值”方式告诉数据库;其他参数如:useUnicode=true&characterEncoding=GBK。,北京传智播客教育,创建执行SQL的语句(Statement),Statement Statement st=conn.createStatement();st.executeQuery(sql);PreparedStatementString sql=“select*from table_name where col_name=?”;Prep

4、aredStatement ps=conn.preparedStatement(sql);ps.setString(1,“col_value”);ps.executeQuery();,北京传智播客教育,处理执行结果(ResultSet),ResultSet rs=statement.executeQuery(sql);While(rs.next()rs.getString(“col_name”);rs.getInt(“col_name”);/,北京传智播客教育,释放资源,释放ResultSet,Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后

5、必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。,北京传智播客教育,基本的CRUD(创建、读取、更新、删除),模板代码 Connection conn=null;Statement st=null;ResultSet rs=null;try/获得Connection/创建Statement/处理查询结果ResultSet finally/释放资源ResultSet,Statement,Connection,北京传智播客教育,创建,增加对应SQL的INSERT,返回增加成功的行(记录)数 conn=getConne

6、ction();Statement st=conn.createStatement();String sql=“insert into user(name,age,regist_date)”+“values(name,10,now()”;int i=st.executeUpdate(sql);/i为插入的记录数,北京传智播客教育,读取,读取(查询)对应SQL的SELECT,返回查询结果conn=getConnection();st=conn.createStatement();String sql=select id,name,age,regist_date from user;rs=st.e

7、xecuteQuery(sql);while(rs.next()System.out.print(rs.getInt(id)+tt);System.out.print(rs.getString(name)+tt);System.out.print(rs.getInt(age)+tt);System.out.print(rs.getTimestamp(regist_date)+tt);System.out.println();,北京传智播客教育,更新,更新(修改)对应SQL的UPDATE,返回被修改的行(记录)数 conn=getConnection();Statement st=conn.cr

8、eateStatement();String sql=“update person set name=new name”;int i=st.executeUpdate(sql);/i为符合条件的记录数,北京传智播客教育,删除,删除对应SQL的DELETE,返回被删除的行(记录)数 conn=getConnection();Statement st=conn.createStatement();String sql=“delete from user where id=1”;int i=st.executeUpdate(sql);/i为删掉的记录数,北京传智播客教育,CRUD总结,增、删、改用S

9、tatement.executeUpdate来完成,返回整数(匹配的记录数),这类操作相对简单。查询用Statement.executeQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果;查询相对与增、删、改要复杂一些,因为有查询结果要处理。,北京传智播客教育,SQL注入,PreparedStatement和Statement,在SQL中包含特殊字符或SQL的关键字(如:or 1 or)时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。PreperedStatement(从Statement

10、扩展而来)相对Statement的优点:1.没有SQL注入的问题。2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。,北京传智播客教育,数据类型,详细信息见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);r

11、s.getTimestamp(i);2.CLOB text 存:ps.setCharacterStream(index,reader,length);ps.setString(i,s);取:reader=rs.getCharacterStream(i);reader=rs.getClob(i).getCharacterStream();string=rs.getString(i);3.BLOB blob 存:ps.setBinaryStream(i,inputStream,length);取:rs.getBinaryStream(i);rs.getBlob(i).getBinaryStream

12、();,北京传智播客教育,一个简单用户相关的数据访问层,J2EE三层架构简介表示层、业务逻辑层、数据访问层,三层之间用接口隔离。定义domain对象User,定义存取用户的接口用JDBC实现接口用配置文件(properties)和反射实现与具体类的耦合,北京传智播客教育,事务(ACID),原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。隔离性(isolcation):一个事务处理对另一个事务处理没有影响。持续性(durability):事务处理的效果

13、能够被永久保存下来。connection.setAutoCommit(false);/打开事务。mit();/提交事务。connection.rollback();/回滚事务。,北京传智播客教育,隔离级别多线程并发读取数据时的正确性,connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);V:可能出现,X:不会出现,北京传智播客教育,存储过程,存储过程CallableStatement(从PreperedStatement扩展来)cs=connection.prepareCall(“call psnam

14、e(?,?,?)”);cs.registerOutParameter(index,Types.INTEGER);cs.setXXX(i,xxxx);cs.executeUpdate();int id=cs.getInt(index);,北京传智播客教育,其他的几个API,Statement.getGeneratedKeys()PreparedStatement ps=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);ps.executeUpdate();ResultSet rs=st.getGeneratedKey

15、s();rs.getInt(1);批处理,可以大幅度提升大量增、删、改的速度。PreparedStatement.addBatch();PreparedStatement.executeBatch();可滚动的结果集Statement st=connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs=st.executeQuery(sql);rs.beforeFirst();rs.afterLast();rs.first();rs.isFirst();rs

16、.last();rs.isLast();rs.absolute(9);rs.moveToInsertRow();,北京传智播客教育,DatabaseMetaData,DatabaseMetaData meta=connection.getMetaData();通过DatabaseMetaData可以获得数据库相关的信息如:数据库版本、数据库名、数据库厂商信息、是否支持事务、是否支持某种事务隔离级别,是否支持滚动结果集等。,北京传智播客教育,ResultSetMetaData,ResultSetMetaData meta=rs.getMetaData();通过ResultSetMetaData可

17、以获得结果有几列、各列名、各列别名、各列类型等。可以将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)

18、;,北京传智播客教育,数据源和连接池,DataSource用来取代DriverManager来获取Connection;通过DataSource获得Connection速度很快;通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改。一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度;连接池可以理解成一个能够存放Connection的Collection;我们的程序只和DataSource打交道,不会直接访问连接池;,北京传智播客教育,一个简单的数据源实现,使用装饰模式的Co

19、nnection(核心代码)class MyConnection implements Connectionprivate Connection realConn;private LinkedList connPool;MyConnection(Connection rConn,LinkedList cPool)this.realConn=rConn;this.connPool=cPool;public void close()this.connPool.addLast(this);/.,北京传智播客教育,一个简单的数据源实现,DataSource(核心代码)class MyDataSourc

20、e implements DataSourceprivate LinkedList connPool=new Vector();public Connection getConneciton()if(this.connPool.size()0)return this.connPool.removeFirst(0);return createConnection();private Connection createConnection()Connection realConn=DriverManager.getConnection();Connection myConn=new MyConnection(realConn,this.connPool);return myConn;/.,北京传智播客教育,常用的开源实现DBCP,使用DBCP必须用的三个包:commons-dbcp-1.2.1.jar,commons-pool-1.2.jar,commons-collections-3.1.jar。Java API:BasicDataSourceFactory.createDataSource(properties);,

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号