简述JDBC

  • Post author:
  • Post category:其他


1.JDBC是什么,有什么用?

JDBC是java连接数据库。用来操作数据库。jdbc是一组接口。接口里的方法是操作数据库的抽象方法。方法的实现交给各数据库厂家,如mysql驱动就是一些实现了java.sql包下接口的实现类打成的jar包。java操作数据库必须记载数据库对应的驱动。

2.JDBC编程六部

1.注册驱动

2.获取连接

3.获取数据库操作对象

4.执行sql

5.遍历结果集

6.关闭资源

注册驱动:java.sql.DriverManager类下有public static void registerDriver(

Driver

driver) throws

SQLException

方法用于注册驱动。要求传入一个数据库Driver实现类对象。如DriverManager.registerDriver(new com.mysql.jdbc.Driver());

(常用)注册驱动的另一种方法,Class.forName(“java.sql.Driver实现类”)。如

Class.forName(“com.mysql.jdbc.Driver”);

加载驱动类,类在加载的时候会执行类中的静态代码块一次,com.mysql.jdbc.Driver类中的静态代码块中的语句就是DriverManager.registerDriver(new com.mysql.jdbc.Driver());

获取连接:DriverManager.getConnection(url,username,password);

支持中文的url:jdbc:mysql://主机:端口/数据库名?useUnicode=true&characterEncoding=utf-8

username:数据库用户名

password: 数据库密码

获取数据库操作对象

Statement stm=conn.createStatement();

PreparedStatement pstm=conn.prepareStatement(sql);


使用Statement对象操作数据库会出现sql注入的情况。

因为sql是通过拼字符串得到的。例如

“select username,password from user where username=’ “+un+” ‘ and “password=’ “+pd+” ‘ “。此时我们令un为abc,pd为

123 ‘ or ‘1’=’1

。最终得到

“select username,password from user where username=’abc’ and “password=’

123 ‘ or ‘1’=’1

‘ ” 因为1始终等于1,所有永远能查到全部。


PreparedStatement解决了sql注入的问题,PreparedStatement是先编译后传值,避免了sql注入的问题,传入值中所含有的关键字不会被识别。


PreparedStatement不是万能的,有时候我们需要使用Statement进行sql注入。

例如我们需要对查询结果进行排序,用户输入desc进行降序,输入asc进行升序。

“select * from product where … order by ? “使用preparedStatement传值时会给字符串加上单引号,但desc或asc是关键字所以使用preparedStatement不能完成要求。要用

Statement进行sql注入。

order=”desc” ;”select * from product where … order by”+order

statement对象执行sql


ResultSet

executeQuery(

String

sql)

int executeUpdate(

String

sql)

PreparedStatement对象执行sql


ResultSet

executeQuery()

int executeUpdate()

Result结果集对象

while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         String last = rs.getString("name");
      }

关闭资源

先关小的再关大的。先resultset后statement后connection。

finally{
      try{
         if(rs!=null)
            rs.close();
      }catch(SQLException e){
         se.printStackTrace();
      }
      try{
         if(stm!=null)
            stm.close();
      }catch(SQLException e){
         se.printStackTrace();
      }
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException e){
         se.printStackTrace();
      }
   }

3.事务

事务默认是自动提交的,一条DML语句代表一个事务。要将把多条DML当做事务首先需要关闭事务自动提交机制。执行完后提交事务。出错后回滚。

4.悲观锁乐观锁

悲观锁(行级锁):在select语句后面执行添加for update。查询到的记录会被上锁,直到当前事务提交之后才释放锁,在这期间其他事务是不可以读到这些记录的。会排队等待。

乐观锁 :事务是并发访问的,每条记录都有一个版本号。若A事务开始时查到表中某记录的版本号为1.0。然后B事务访问这条记录知道版本号是1.0,后来B事务对这条记录进行了修改然后提交事务,提交时发现这条记录的版本号仍然为1.0即没被修改过所以将记录修改并且修改该记录的版本号为1.1。过了一会A事务对这条记录进行修改,提交事务时发现这条记录的版本号已经不是1.0了,所以执行回滚操作,A事务对这条记录的修改作废。



版权声明:本文为zjs1201原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。