JavaWeb-JDBC
来源:互联网 发布:四叠半神话大系 知乎 编辑:程序博客网 时间:2024/06/06 18:42
一、JDBC简介
四、改写原来的用户注册和登陆案例
五、SQL注入问题
- JDBC的全称是Java Data Base Connectivity Java数据库连接
- 是为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC
- JDBC是规范。
- 各个数据库有不同的驱动
- JDBC规范相关的类在JDK中,java.sql.*或javax.sql.*
- 编写步骤:
- a、拷贝驱动
- b、注册驱动
- c、获取连接
- d、建立发送SQL语句的对象
- e、执行语句。如果是查询的话有返回结果
- f、遍历结果进行处理
- g、关闭资源,原则是最后打开的先关闭
// Notice, do not import com.mysql.jdbc.*
// or you will have problems!(注意,不要导入com.mysql.jdbc.*,否则// 将出现问题!)
- 数据库URL
- URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:
- 常用数据库URL地址的写法:
- Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
- SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
- MySql—jdbc:mysql://localhost:3306/sid
- Mysql的url地址的简写形式: jdbc:mysql:///sid
- 常用属性:useUnicode=true&characterEncoding=UTF-8
- DriverManager 详解
- Jdbc程序中的DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
- DriverManager.registerDriver(new Driver())
- DriverManager.getConnection(url, user, password),
- 注意:在实际开发中并不推荐采用registerDriver方法注册驱动。原因有二:
- 一、查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
- 二、程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。
- 推荐方式:Class.forName(“com.mysql.jdbc.Driver”);
- 采用此种方式不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要依赖具体的驱动,使程序的灵活性更高。
- 同样,在开发中也不建议采用具体的驱动类型指向getConnection方法返回的connection对象。
- DriverManager 注册驱动:
- DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- 以上注册方式有2大缺点:
- a、对具体的数据库驱动严重依赖。
- b、会导致驱动类注册2遍。
- 替代方案:
- Class.forName("com.mysql.jdbc.Driver");
- 获取数据库的连接:
- //方式一:
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12", "root", "sorry");
- //方式二:
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12?user=root&password=sorry&useUnicode=true&characterEncoding=utf8");
- //方式三:
- Properties props = new Properties();
- props.setProperty("user", "root");
- props.setProperty("password", "sorry");
- Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day12",props);
- Connection
- 所有与数据库交互的代码都基于链接。
- createStatement():创建向数据库发送sql的statement对象。
- 常用方法
- createStatement():创建向数据库发送sql的statement对象。
- prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
- prepareCall(sql):创建执行存储过程的callableStatement对象。
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :在链接上提交事务。
- rollback() :在此链接上回滚事务
- Statement
- 向数据库发送SQL语句。
- ResultSet executeQuery(String sql):参数sql只能是DQL语句。返回的是封装了查询结果的ResultSet对象
- int executeUpdate(String sql):参数sql是DML语句,就返回的是语句影响到的行数。也可以执行没有返回结果的DDL语句,返回值不代表影响到的行数。
- boolean execute(String sql):参数sql可以是任意的SQL语句。返回的结果不代表成功与否。如果执行的SQL语句有结果集,返回true。其他返回false。
- 常用方法
- executeQuery(String sql) :用于向数据发送查询语句。
- executeUpdate(String sql):用于向数据库发送insert、update或delete语句
- execute(String sql):用于向数据库发送任意sql语句
- addBatch(String sql) :把多条sql语句放到一个批处理中。
- executeBatch():向数据库发送一批sql语句执行。
- ResultSet
- 封装了查询结果。内部有一个游标,默认指向第一行的前面。next()方法:游标下移,并且返回是否有记录。
- 通过setXXX,如 set String, set Date。
- ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
- 获取任意类型的数据
- getObject(int index)
- getObject(string columnName)
- 获取指定类型的数据,(封装数据时方便)例如:
- getString(int index)
- getString(String columnName)
- 获取任意类型的数据
- PreparedStatement:是Statement的子接口(从此以后都用这个)
- 作用:
- 预编译SQL语句,执行效率高。
- 防注入
- 采用占位符?替换参数
- 常用方法
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面
- 作用:
四、改写原来的用户注册和登陆案例
五、SQL注入问题
- SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为。
- statement存在sql注入攻击问题,例如登陆用户名采用' or 1=1 or name=‘
- 对于防范 SQL 注入,可以采用PreparedStatement取代Statement。
- Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
- Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)。
- Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
- 练习:编写程序对User表进行增删改查操作。
- 练习:编写工具类简化CRUD操作(配置文件读取配置信息)。(异常暂不处理,连Oracle)
七、数据库分页
- MySQL分页的实现:
- Select * from table limit M,N &&&
- oracle分页 SELECT*FROM ( SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
- M:记录开始索引位置
- N:取多少条记录。
- 完成WEB页面的分页显示
- 先获得需分页显示的记录总数,然后在web页面中显示页码。
- 根据页码,从数据库中查询相应的记录显示在web页面中。
- 以上两项操作通常使用Page对象进行封装。
- Oracle分页语句:
- select * from (
- select rownum r_, row_.* from (
- select * from student order by id
- ) row_ where rownum <=5
- ) where r_>=1
- 1位置:起始索引位置。
- 5位置:结束索引位置。
- JavaWeb-JDBC
- JavaWeb----JDBC
- JavaWeb:JDBC
- JavaWeb JDBC驱动链接
- JavaWeb-15 (JDBC编程)
- JavaWeb之JDBC(数据库连接)
- JavaWeb开发基础:JDBC
- jdbc---javaweb-day1
- JavaWeb:JDBC之事务
- JavaWeb之JDBC
- JavaWeb:JDBC之事务
- JavaWeb-JDBC连接数据库
- JavaWeb-JDBC连接池、JDBC框架
- JavaWeb入门实战—JDBC
- JavaWeb入门:JDBC连接数据库
- javaweb通过jdbc连接数据库
- javaweb—JDBC连接数据库
- JavaWeb初学(tomcat,JDBC)
- 安装 sql server 2005 时 提示 “SQL server服务无法启动”解决方案
- 经典排序算法 – 插入排序Insertion sort
- Android消息推送机制
- 项目经理责任
- Windows程序进程中内核对象句柄表
- JavaWeb-JDBC
- 最好的10本适用于初学者阅读的javaScript和jQuery书籍
- 转SQL习题
- 每日一题(18) - 寻找发帖水王
- getchar()、getch()、getche()的区别
- RobHess的SIFT源码分析:综述
- fsck修复受损的文件系统
- android 四种常用的存储方式
- JavaWeb-JDBC处理大数据、批处理、事物