Java Database Connectivity(Java语言连接数据库)
2.JDBC的本质是什么?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDNhD98L-1636273055310)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210521144936599.png)]
为什么要指定一套JDBC接口呢?
每个数据库底层实现的原理都不一样,每个数据库产品
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esiPG2S1-1636273055312)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210521150041549.png)]
SUN公司定义这个接口,各个数据库厂家纷纷响应,去编写实现类,java程序员调用这些实现类,来连接数据库。
3.jdbc开发前的准备工作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFSk0zbB-1636273055313)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210523152326733.png)]
4.JDBC编程六步(重点)第一步:注册驱动(作用:告诉java程序员,即将要连接哪个品牌的数据库)
第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了)
第三步:获取数据库 *** 作对象(专门执行sql语句的对象)
第四步:执行sql语句(DQL,DML)
第五步:处理查询结果集(只有第四步执行的是select语句的时候,才有第五步查询结果集。)
第六步:释放资源.
5.java代码实现JDBCpackage JDBC; import java.sql.*; public class JdbcTest03 { public static void main(String[] args) { Connection connection=null; Statement statement=null; ResultSet resultSet=null; try { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接 String url="jdbc:mysql://localhost:3306/bjpowernode"; String username="root"; String password="123456"; connection= DriverManager.getConnection(url,username,password); //3.获取出具库 *** 作对象 statement=connection.createStatement(); //4.执行sql语句 // insert delete update 语句用函数executeUpdate() //select 语句得用executeQuery()函数 String sql="select * from t_student"; //返回以ResultSet 查询结果集 //5.处理查询结果集 resultSet=statement.executeQuery(sql); //ResultSet类的next()函数,有数据就返回true,没有数据就返回false System.out.println("son"+"t"+"sname"+"t"+"classno"); System.out.println("---------------------------------"); while(resultSet.next()){ //这是第一种获取,注意:getString()的下标从1开始(建议少用) //第二种获取(重要):这种方式获取程序会更为健壮 String sno=resultSet.getString("sno"); String sName=resultSet.getString("sname"); String classNo=resultSet.getString("classno"); System.out.println(sno+"t"+sName+"t"+classNo); } } catch (Exception e) { e.printStackTrace(); }finally { if(resultSet!=null) { try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }5.sql语句的注入问题(背)
为什么会导致sql注入?
用户输入的信息含有sql语句的关键字,这些关键字参与sql语句的编译过程,导致原来的sql语句意思被扭曲,进而到达sql注入。
怎么解决sql语句的注入问题?
只要用户输入的信息不参与sql语句的编译过程,就可以解决了。
代码实现:
将第三步获取数据库 *** 作对象(Statement)改为(PreparedStatement)欲编译的数据库 *** 作对象。
PreparedStatement继承了java.sql.Statement,其执行原理是:预先对sql语句的框架编译,然后再给sql语句传值。
package JDBC; import java.sql.*; public class JdbcTest04 { public static void main(String[] args) { Connection connection=null; PreparedStatement preparedStatement=null; ResultSet resultSet=null; try { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接 String url="jdbc:mysql://localhost:3306/bjpowernode"; String userName="root"; String passWord="123456"; connection= DriverManager.getConnection(url,userName,passWord); //3.获取数据库 *** 作对象 ?:为占位符 String sql="select * from t_user where logName=? and logPwd=?"; //DBMS会对sql语句经行预编译,这样就不会出现sql注入了 preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1,"张三"); preparedStatement.setString(2,"123456"); //4.执行sql语句 注意:这里不用再写参数(否则会再编译一次) resultSet=preparedStatement.executeQuery(); //5.查询处理结果集 } catch (Exception e) { e.printStackTrace(); }finally { if(resultSet!=null) { try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(preparedStatement!=null){ try { preparedStatement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }6.JDBC的行级锁
在select语句后面加行级锁、悲观锁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXQqBrrt-1636273055315)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210527090503438.png)]
JDBC工具类:
package JDBC; import java.sql.*; public class MyJdbc { private MyJdbc(){} static{ try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { String url="jdbc:mysql://localhost:3306/bjpowernode"; String username="root"; String password="123456"; return DriverManager.getConnection(url,username,password); } public static void close(Connection conn, Statement stmt, ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(stmt!=null){ try { stmt.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
行级锁演示程序:
package JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JdbcTest09 { public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { //1-2步 conn=MyJdbc.getConnection(); //3步骤 conn.setAutoCommit(false); String sql="select * from emp where job=? for update"; ps=conn.prepareStatement(sql); ps.setString(1,"MANAGER"); rs=ps.executeQuery(); while(rs.next()){ System.out.println(rs.getString("ename")+"t"+ rs.getString("job")+"t"+ rs.getString("sal")); } conn.commit(); } catch (SQLException throwables) { if(conn!=null){ try { conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } } throwables.printStackTrace(); }finally { MyJdbc.close(conn,ps,rs); } } } package JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class JdbcTest10 { public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; try { conn=MyJdbc.getConnection(); conn.setAutoCommit(false); String sql="update emp set sal=sal*1.1 where job=?"; ps=conn.prepareStatement(sql); ps.setString(1,"MANAGER"); int count=ps.executeUpdate(); System.out.println(count); conn.commit(); } catch (SQLException throwables) { if(conn!=null){ try { conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } } throwables.printStackTrace(); }finally{ MyJdbc.close(conn,ps,null); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)