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