您好,欢迎访问三七文档
JDBC简介JDBC(JavaDatabaseConnectivity,java数据库连接),是一种执行SQL语句的JavaAPI,由一些接口和类构成的API。J2SE的一部分,由java.sql,javax.sql包组成(查看JDK文档)。简介应用程序、JDBCAPI、数据库驱动及数据库之间的关系连接数据的步骤注册驱动(只做一次)建立连接(Connection)创建执行SQL的语句(Statement)执行语句处理执行结果(ResultSet)释放资源快速起步示例注册驱动Class.forName(“com.mysql.jdbc.Driver”);Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);推荐这种方式,不会对具体的驱动类产生依赖。DriverManager.registerDriver(com.mysql.jdbc.Driver);会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。System.setProperty(“jdbc.drivers”,“driver1:driver2”);虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用。驱动类型(四种类型):JDBC-ODBC桥+ODBC驱动程序;本地API;JDBC网络纯Java驱动程序;本地协议纯Java驱动程序。建立连接(Connection)Connectionconn=DriverManager.getConnection(url,user,password);url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…User,password可以用“属性名=属性值”方式告诉数据库;其他参数如:useUnicode=true&characterEncoding=GBK。StringconnectionUrl=jdbc:sqlserver://localhost:1433;databaseName=bookstore;user=sa;password=friends;;Connectionconn=DriverManager.getConnection(connectionUrl);创建执行SQL的语句(Statement)StatementStatementst=conn.createStatement();st.executeQuery(sql);PreparedStatementStringsql=“select*fromtable_namewherecol_name=?”;PreparedStatementps=conn.preparedStatement(sql);ps.setString(1,“col_value”);ps.executeQuery();处理执行结果(ResultSet)ResultSetrs=statement.executeQuery(sql);While(rs.next()){rs.getString(“col_name”);rs.getInt(“col_name”);//…}释放资源释放ResultSet,Statement,Connection.数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。基本的CRUD(创建、读取、更新、删除)模板代码Connectionconn=null;Statementst=null;ResultSetrs=null;try{//获得Connection//创建Statement//处理查询结果ResultSet}finally{//释放资源ResultSet,Statement,Connection}创建增加对应SQL的INSERT,返回增加成功的行(记录)数conn=getConnection();Statementst=conn.createStatement();Stringsql=“insertintouser(name,age,regist_date)”+“values(‘name’,10,now())”;inti=st.executeUpdate(sql);//i为插入的记录数读取读取(查询)对应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();}更新更新(修改)对应SQL的UPDATE,返回被修改的行(记录)数conn=getConnection();Statementst=conn.createStatement();Stringsql=“updatepersonsetname='newname‘”;inti=st.executeUpdate(sql);//i为符合条件的记录数删除删除对应SQL的DELETE,返回被删除的行(记录)数conn=getConnection();Statementst=conn.createStatement();Stringsql=“deletefromuserwhereid=1”;inti=st.executeUpdate(sql);//i为删掉的记录数CRUD总结增、删、改用Statement.executeUpdate来完成,返回整数(匹配的记录数),这类操作相对简单。查询用Statement.executeQuery来完成,返回的是ResultSet对象,ResultSet中包含了查询的结果;查询相对与增、删、改要复杂一些,因为有查询结果要处理。SQL注入,PreparedStatement和Statement在SQL中包含特殊字符或SQL的关键字(如:'or1or')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。PreperedStatement(从Statement扩展而来)相对Statement的优点:1.没有SQL注入的问题。2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。数据类型详细信息见java.sql.Types几种特殊且比较常用的类型1.DATA,TIME,TIMESTAMPdate,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();一个简单用户相关的数据访问层J2EE三层架构简介表示层、业务逻辑层、数据访问层,三层之间用接口隔离。定义domain对象User,定义存取用户的接口用JDBC实现接口用配置文件(properties)和反射实现与具体类的耦合事务(ACID)原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。隔离性(isolcation):一个事务处理对另一个事务处理的影响。持续性(durability):事务处理的效果能够被永久保存下来。connection.setAutoCommit(false);//打开事务。connection.commit();//提交事务。connection.rollback();//回滚事务。事务(SavePoint)当只想撤销事务中的部分操作时可使用SavePointSavePointsp=connection.setSavepoint();connection.rollerbak(sp);connection.commit();事务(JTA)跨越多个数据源的事务,使用JTA容器实现事务。分成两阶段提交。javax.transaction.UserTransactiontx=(UserTransaction)ctx.lookup(“jndiName);tx.begin();//connection1connection2(可能来自不同的数据库)…tx.commit();//tx.rollback();隔离级别多线程并发读取数据时的正确性connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);V:可能出现,X:不会出现隔离级别脏读不可重复读幻读读未提交(Readuncommitted)VVV读已提交(Readcommitted)xVV可重复读(Repeatableread)xxV可串行化(Serializable)xxx存储过程存储过程CallableStatement(从PreperedStatement扩展来)cs=connection.prepareCall(“{callpsname(?,?,?)}”);cs.registerOutParameter(index,Types.INTEGER);cs.setXXX(i,xxxx);cs.executeUpdate();intid=cs.getInt(index);其他的几个APIPreparedStatement.getGeneratedKeys()PreparedStatementps=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);ps.executeUpdate();ResultSetrs=st.getGeneratedKeys();rs.getInt(1);批处理,可以大幅度提升大量增、删、改的速度。PreparedStatement.addBatch();PreparedStatement.executeBatch();其他的几个API可滚动的结果集Statementst=connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=st.executeQuery(sql);rs.beforeFirst();
本文标题:JDBC-PPT
链接地址:https://www.777doc.com/doc-6707339 .html