简述JDBC

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事务对这条记录的修改作废。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值