JavaWeb-JDBC

来源:互联网 发布:四叠半神话大系 知乎 编辑:程序博客网 时间:2024/06/06 18:42
一、JDBC简介
  1. JDBC的全称是Java Data Base Connectivity Java数据库连接
  2. 是为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC
  3. JDBC是规范。
  4. 各个数据库有不同的驱动
  5. JDBC规范相关的类在JDK中,java.sql.*或javax.sql.*
  6. 编写步骤:
    1. a、拷贝驱动
    2. b、注册驱动
    3. c、获取连接
    4. d、建立发送SQL语句的对象
    5. e、执行语句。如果是查询的话有返回结果
    6. f、遍历结果进行处理
    7. g、关闭资源,原则是最后打开的先关闭
  7. // Notice, do not import com.mysql.jdbc.*
    // or you will have problems!(注意,不要导入com.mysql.jdbc.*,否则// 将出现问题!)
  8. 数据库URL 
    1. URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
    2. 常用数据库URL地址的写法:
    3. Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
    4. SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
    5. MySql—jdbc:mysql://localhost:3306/sid
    6. Mysql的url地址的简写形式: jdbc:mysql:///sid
    7. 常用属性:useUnicode=true&characterEncoding=UTF-8
 二、JDBC常用接口
  1. DriverManager 详解
    1. Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
    2. DriverManager.registerDriver(new Driver())
    3. DriverManager.getConnection(url, user, password),

    4. 注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:
    5. 一、查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
    6. 二、程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。

    7. 推荐方式:Class.forName(“com.mysql.jdbc.Driver”);
    8. 采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
    9. 同样,在开发中也不建议采用具体的驱动类型指向getConnection方法返回的connection对象。
  2. DriverManager 注册驱动:
    1. DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
    2. 以上注册方式有2大缺点:
    3. a、对具体的数据库驱动严重依赖。
    4. b、会导致驱动类注册2遍。
    5. 替代方案:
    6. Class.forName("com.mysql.jdbc.Driver");

    7. 获取数据库的连接:
    8. //方式一:
    9. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12", "root", "sorry");
    10. //方式二:
    11. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12?user=root&password=sorry&useUnicode=true&characterEncoding=utf8");
    12. //方式三:
    13. Properties props = new Properties();
    14. props.setProperty("user", "root");
    15. props.setProperty("password", "sorry");
    16. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12",props);
  3. Connection
    1. 所有与数据库交互的代码都基于链接。
    2. createStatement():创建向数据库发送sql的statement对象。
    3.        常用方法
      • createStatement():创建向数据库发送sql的statement对象。
      • prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
      • prepareCall(sql):创建执行存储过程的callableStatement对象。 
      • setAutoCommit(boolean autoCommit):设置事务是否自动提交。 
      • commit() :在链接上提交事务。
      • rollback() :在此链接上回滚事务
  4. Statement
    1. 向数据库发送SQL语句。
    2. ResultSet executeQuery(String sql):参数sql只能是DQL语句。返回的是封装了查询结果的ResultSet对象
    3. int executeUpdate(String sql):参数sql是DML语句,就返回的是语句影响到的行数。也可以执行没有返回结果的DDL语句,返回值不代表影响到的行数。
    4. boolean execute(String sql):参数sql可以是任意的SQL语句。返回的结果不代表成功与否。如果执行的SQL语句有结果集,返回true。其他返回false。
    5.         常用方法
      • executeQuery(String sql) :用于向数据发送查询语句。
      • executeUpdate(String sql):用于向数据库发送insert、update或delete语句
      • execute(String sql):用于向数据库发送任意sql语句
      • addBatch(String sql) :把多条sql语句放到一个批处理中。
      • executeBatch():向数据库发送一批sql语句执行。 
  5. ResultSet
    1. 封装了查询结果。内部有一个游标,默认指向第一行的前面。next()方法:游标下移,并且返回是否有记录。
    2.         通过setXXX,如 set String, set Date。
    3.         ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法: 
      1. 获取任意类型的数据 
        1. getObject(int index) 
        2. getObject(string columnName) 
      2. 获取指定类型的数据,(封装数据时方便)例如: 
        1. getString(int index) 
        2. getString(String columnName)
  6. PreparedStatement:是Statement的子接口(从此以后都用这个)
    1.      作用:
      1. 预编译SQL语句,执行效率高。
      2. 防注入
      3. 采用占位符?替换参数
    2.      常用方法
      1. next():移动到下一行
      2. Previous():移动到前一行
      3. absolute(int row):移动到指定行
      4. beforeFirst():移动resultSet的最前面。
      5. afterLast() :移动到resultSet的最后面
三、利用JDBC对数据库中的表CRUD

四、改写原来的用户注册和登陆案例
五、SQL注入问题
  1. SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为。
    1. statement存在sql注入攻击问题,例如登陆用户名采用' or 1=1 or name=‘
    2. 对于防范 SQL 注入,可以采用PreparedStatement取代Statement。
六、客户管理系统CRUD
  1. Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
  2. Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
  3. Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
  4. 练习:编写程序对User表进行增删改查操作。
  5. 练习:编写工具类简化CRUD操作(配置文件读取配置信息)。(异常暂不处理,连Oracle)

七、数据库分页
  1. MySQL分页的实现:
    1. Select * from table limit M,N   &&& 
    2.   oracle分页 SELECT*FROM ( SELECT A.*, ROWNUM RN
      FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
    3. M:记录开始索引位置
    4. N:取多少条记录。
  2. 完成WEB页面的分页显示
    1. 先获得需分页显示的记录总数,然后在web页面中显示页码。
    2. 根据页码,从数据库中查询相应的记录显示在web页面中。
    • 以上两项操作通常使用Page对象进行封装。
  3. Oracle分页语句:
    1. select * from (
    2. select rownum r_, row_.*  from (
    3. select * from student order by id
    4. ) row_ where rownum <=5
    5.       ) where r_>=1

    6. 1位置:起始索引位置。
    7. 5位置:结束索引位置。
原创粉丝点击