一、相关概念1.什么是JDBCJDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。2.数据库驱动我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。二、常用接口1.Driver接口Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:装载MySql驱动:Class.forName(com.mysql.jdbc.Driver);装载Oracle驱动:Class.forName(oracle.jdbc.driver.OracleDriver);2.Connection接口Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url,user,password)方法建立在JDBCURL中定义的数据库Connection连接上。连接MySql数据库:Connectionconn=DriverManager.getConnection(jdbc:mysql://host:port/database,user,password);连接Oracle数据库:Connectionconn=DriverManager.getConnection(jdbc:oracle:thin:@host:port:database,user,password);连接SqlServer数据库:Connectionconn=DriverManager.getConnection(jdbc:microsoft:sqlserver://host:port;DatabaseName=database,user,password);常用方法:ocreateStatement():创建向数据库发送sql的statement对象。oprepareStatement(sql):创建向数据库发送预编译sql的PrepareSatement对象。oprepareCall(sql):创建执行存储过程的callableStatement对象。osetAutoCommit(booleanautoCommit):设置事务是否自动提交。ocommit():在链接上提交事务。orollback():在此链接上回滚事务。3.Statement接口用于执行静态SQL语句并返回它所生成结果的对象。三种Statement类:oStatement:由createStatement创建,用于发送简单的SQL语句(不带参数)。oPreparedStatement:继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。oCallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。常用Statement方法:oexecute(Stringsql):运行语句,返回是否有结果集oexecuteQuery(Stringsql):运行select语句,返回ResultSet结果集。oexecuteUpdate(Stringsql):运行insert/update/delete操作,返回更新的行数。oaddBatch(Stringsql):把多条sql语句放到一个批处理中。oexecuteBatch():向数据库发送一批sql语句执行。4.ResultSet接口ResultSet提供检索不同类型字段的方法,常用的有:ogetString(intindex)、getString(StringcolumnName):获得在数据库里是varchar、char等类型的数据对象。ogetFloat(intindex)、getFloat(StringcolumnName):获得在数据库里是Float类型的数据对象。ogetDate(intindex)、getDate(StringcolumnName):获得在数据库里是Date类型的数据。ogetBoolean(intindex)、getBoolean(StringcolumnName):获得在数据库里是Boolean类型的数据。ogetObject(intindex)、getObject(StringcolumnName):获取在数据库里任意类型的数据。ResultSet还提供了对结果集进行滚动的方法:onext():移动到下一行oPrevious():移动到前一行oabsolute(introw):移动到指定行obeforeFirst():移动resultSet的最前面。oafterLast():移动到resultSet的最后面。使用后依次关闭对象及连接:ResultSet→Statement→Connection三、使用JDBC的步骤加载JDBC驱动程序→建立数据库连接Connection→创建执行SQL的语句Statement→处理执行结果ResultSet→释放资源1.注册驱动(只做一次)方式一:Class.forName(“com.MySQL.jdbc.Driver”);推荐这种方式,不会对具体的驱动类产生依赖。方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。2.建立连接Connectionconn=DriverManager.getConnection(url,user,password);URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:其他参数如:useUnicode=true&characterEncoding=utf83.创建执行SQL语句的statement//StatementStringid=5;Stringsql=deletefromtablewhereid=+id;Statementst=conn.createStatement();st.executeQuery(sql);//存在sql注入的危险//如果用户传入的id为“5or1=1”,那么将删除表中的所有记录//PreparedStatement有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如or'1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)Stringsql=“insertintouser(name,pwd)values(?,?)”;PreparedStatementps=conn.preparedStatement(sql);ps.setString(1,“col_value”);//占位符顺序从1开始ps.setString(2,“123456”);//也可以使用setObjectps.executeQuery();4.处理执行结果(ResultSet)ResultSetrs=ps.executeQuery();While(rs.next()){rs.getString(“col_name”);rs.getInt(1);//…}5.释放资源//数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放//都要加trycatch以防前面关闭出错,后面的就不执行了try{if(rs!=null){rs.close();}}catch(SQLExceptione){e.printStackTrace();}finally{try{if(st!=null){st.close();}}catch(SQLExceptione){e.printStackTrace();}finally{try{if(conn!=null){conn.close();}}catch(SQLExceptione){e.printStackTrace();}}}四、事务(ACID特点、隔离级别、提交commit、回滚rollback)1.批处理Batchpackagecom.test.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;/***测试ResultSet结果集的基本用法*/publicclassDemo05{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt=null;try{Class.forName(com.mysql.jdbc.Driver);conn=DriverManager.getConnection(jdbc:mysql://localhost:3306/testjdbc,root,mysql);conn.setAutoCommit(false);//设为手动提交longstart=System.currentTimeMillis();stmt=conn.createStatement();for(inti=0;i20000;i++){stmt.addBatch(insertintot_user(userName,pwd,regTime)values('hao+i+',666666,now()));}stmt.executeBatch();conn.commit();//提交事务longend=System.currentTimeMillis();System.out.println(插入200000条数据,耗时(ms):+(end-start));}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}finally{try{if(stmt!=null){stmt.close();}}catch(SQLExceptione){e.printStackTrace();}try{if(conn!=null){conn.close();}}catch(SQLExceptione){e.printStackTrace();}}}}插入2万条数据的测试2.测试事务的基本概念和用法packagecom.test.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;/***测试事务的基本概念和用法*/publicclassDemo06{publicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementps1=null;PreparedStatementps2=null;try{Class.forName(com.mys