常用数据库的驱动程序及JDBC: Oracle数据库: 驱动程序包名:ojdbc14.jar 驱动类的名字:oracle.jdbc.driver.OracleDriver JDBC URL:jdbc:oracle:thin:@dbip:port:databasename 说明:驱动程序包名有可能会变 JDBC URL中黑色字体部分必须原封不动的保留,为该驱动识别的URL格式。红色字体部分需要根据数据库的安装情况填写。其中各个部分含义如下: dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。 port –为数据库的监听端口,需要看安装时的配置,缺省为1521。 databasename –为数据库的SID,通常为全局数据库的名字。 SQL Server数据库 驱动程序包名:msbase.jar mssqlserver.jar msutil.jar 驱动类的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename 说明:驱动程序包名有可能会变 JDBC URL中黑色字体部分必须原封不动的保留,为该驱动识别的URL格式。红色字体部需要根据数据库的安装情况填写。其中各个部分含义如下: dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。 port –为数据库的监听端口,需要看安装时的配置,缺省为1433。 databasename –数据库的名字。 MySQL数据库 驱动程序包名:mysql-connector-java-3.1.11-bin.jar 驱动类的名字:com.mysql.jdbc.Driver JDBC URL:jdbc:mysql://dbip:port/databasename 说明:驱动程序包名有可能会变 JDBC URL中黑色字体部分必须原封不动的保留,为该驱动识别的URL格式。红色字体部需要根据数据库的安装情况填写。其中各个部分含义如下: dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。 port –为数据库的监听端口,需要看安装时的配置,缺省为3306。 databasename –数据库的名字。 Access数据库 驱动程序包名:该驱动程序包含在JavaSE中,不需要额外安装。 驱动类的名字:sun.jdbc.odbc.JdbcOdbcDriver JDBC URL:jdbc:odbc:datasourcename 说明:该驱动只能工作在Windows系统中,首先需要在操作系统中建立一个可以访问Access数据库的本地数据源(ODBC),如果名字为allandb,那么URL写法如下: jdbc:odbc:allandb PreparedStatement接口: 预编译的sql语句对象 作用: 解决了书写sql语句时一些特殊的字符与sql保留字符冲突的问题,非常方便 /** *知识点: *PreparedStatement接口及方法的使用 *程序目标: *java文件: *PreparedInsert.java:连接数据库,插入一条数据 *JdbcUtil.java:实现一个工具类,功能:1.连接数据库 2.关闭资源 */
package com.jdbc.c_preparedstatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import com.jdbc.Util.JDBCUtil; public class Login { //SELECT * FROM USER WHERE userName='james' OR 1=1 -- ' AND PASSWORD='123456'; //sql注入行为 private static String user = " 'james' OR 1=1 -- "; private static String password = "123456"; public static void main(String[] args) { //testStatement(); testPreparedStatement(); } private static void testPreparedStatement() { Connection conn =null; PreparedStatement stmt = null; ResultSet rs = null; try{ conn =JDBCUtil.getConn(); String sql = "SELECT * FROM USER WHERE userName=? AND PASSWORD=?;"; stmt = conn.prepareStatement(sql); //给问号设置参数 stmt.setString(1, user); stmt.setString(2, password); //发送参数并执行sql rs = stmt.executeQuery(); if (rs.next()) { System.out.println("登陆成功"); }else { System.out.println("登录失败"); } }catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtil.close(conn, stmt, rs); } } private static void testStatement() { Connection conn =null; Statement stmt = null; ResultSet rs = null; try{ conn = JDBCUtil.getConn(); stmt = conn.createStatement(); String sql ="SELECT * FROM USER WHERE userName='"+user+"' AND PASSWORD='"+password+"';"; rs = stmt.executeQuery(sql); if (rs.next()) { System.out.println("登陆成功"); }else { System.out.println("登录失败"); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtil.close(conn, stmt, rs); } } }数据库的增删改查的例子: /** *知识点: *JDBC+SQL+ORACLE *程序目标: *UserDao.java:实现了数据库的增删改查 *JdbcUtil.java:工具类,有连库和关闭资源的方法 */
package com.jdbc.c_preparedstatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.jdbc.Util.JDBCUtil; public class Demo { public static void main(String[] args) { //testInsert(); //testUpdate(); //testDelete(); testSelect(); } private static void testSelect() { Connection conn =null; PreparedStatement stmt = null; ResultSet rs = null; try{ //获取连接 conn = JDBCUtil.getConn(); //定义预编译sql String sql = "SELECT * FROM student WHERE id=?;"; //获取预编译sql对象 stmt = conn.prepareStatement(sql); //给问好赋值 stmt.setInt(1, 3); //发送参数并执行sql语句 //ResultSet executeQuery()throws SQLException在此 //PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。 rs = stmt.executeQuery(); //遍历结果集 while (rs.next()) { System.out.println(rs.getInt("id")+"--"+rs.getString("name")+"--"+rs.getInt("age")); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtil.close(conn, stmt, rs); } } private static void testDelete() { Connection conn =null; PreparedStatement stmt = null; try{ conn = JDBCUtil.getConn(); //写一个参数化的sql String sql = "DELETE FROM student WHERE id=?;"; //获取预编译的sql对象 stmt = conn.prepareStatement(sql); //给?设置参数 stmt.setInt(1, 2); //发送参数并执行sql int count = stmt.executeUpdate(); System.out.println(count); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtil.close(conn, stmt, null); } } private static void testUpdate() { Connection conn =null; PreparedStatement stmt = null; try{ conn = JDBCUtil.getConn(); String sql = "UPDATE student SET NAME=? WHERE id=?;"; //执行预编译sql stmt = conn.prepareStatement(sql); //给?赋值 stmt.setString(1, "张学友"); stmt.setInt(2, 5); //发送参数到数据库服务器,并执行sql,将执行结果返回 int count = stmt.executeUpdate(); System.out.println(count); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtil.close(conn, stmt, null); } } private static void testInsert() { //定义连接对象和预编译sql对象 Connection conn = null; PreparedStatement stmt = null; try{ //获取连接 conn = JDBCUtil.getConn(); //PreparedStatement prepareStatement(String sql) //throws SQLException创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。 String sql = "INSERT INTO student VALUES(?,?,?);";//参数化的sql,动态sql stmt = conn.prepareStatement(sql);//需要一个预编译的sequel语句,将sq发送到数据库端,检查sql语法及用户权限等信息 //给之前参数化的sql语句设置参数 //两个参数:1:是给第几个?设置数据 2:给?设置的数据 stmt.setInt(1, 5); stmt.setString(2, "黎明"); stmt.setInt(3, 60); //int executeUpdate()throws SQLException int count = stmt.executeUpdate(); System.out.println(count); }catch(Exception e){ e.printStackTrace(); }finally{ //释放资源 JDBCUtil.close(conn, stmt, null); } } } 补充 JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName(“com.mysql.jdbc.Driver”); Class.forName(“com.mysql.jdbc.Driver”).newInstance(); JDBC URL 定义驱动程序与数据源之间的连接常见参数: user 用户名 password 密码 autoReconnect 联机失败,是否重新联机(true/false) maxReconnect 尝试重新联机次数 initialTimeout 尝试重新联机间隔 maxRows 传回最大行数 useUnicode 是否使用Unicode字体编码(true/false) characterEncoding 何种编码(GB2312/UTF-8/…) relaxAutocommit 是否自动提交(true/false) capitalizeTypeNames 数据定义的名称以大写表示 建立连接对象 String url=”jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password”; Connection con = DriverManager.getConnection(url); 建立SQL陈述式对象(Statement Object) Statement stmt = con.createStatement(); 执行SQL语句 executeQuery() String query = “select * from test”; ResultSet rs=stmt.executeQuery(query); 结果集ResultSet while(rs.next()) {rs.getString(1);rs.getInt(2);} executeUpdate() String upd=”insert into test (id,name) values(1001,xuzhaori)”; int con=stmt.executeUpdate(upd); execute() 示例:
ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet接口的常用方法如下表所示!
直接使用ResultSet对象执行更新数据 新增数据 Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE); ResultSet uprs=stmt.executeQuery(“select * from test”); uprs.moveToInsertRow(); uprs.updateInt(1,1001); uprs.updateString(2,”许召日”); uprs.insertRow; 更新数据 Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE); ResultSet uprs=stmt.executeQuery(“select * from test”); uprs.last(); uprs.updateString(“name”,”xuzhaori”); uprs.updateRow; 删除数据 Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE); ResultSet uprs=stmt.executeQuery(“select * from test”); uprs.absolute(4); uprs.deleteRow();
批处理 con.setAutoCommit(false); 关闭自动认可模式 Statement stmt=con.createStatement(); int[] rows; stmt.addBatch(“insert into test values(1001,xuzhaori)”); stmt.addBatch(“insert into test values(1002,xuyalin)”); rows=stmt.executeBatch(); con.commit(); 没有任何错误,执行批处理stmt.executeBatch();