JDBC
使用步骤: *
1. 引入jar文件.
2. 加载数据库驱动(JavaSE项目中可以省略,但不建议。 在JavaEEWeb项目中,jar包不可以省略.)
mysql6以下驱动:com.mysql.jdbc.Driver
mysql6和6以上驱动:com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
3. 通过驱动管理器,获取JDBC的连接对象
// 连接地址格式:
// 主协议:子协议://ip地址:端口号/数据库名称
// mysql: jdbc:mysql://localhost:3306/test
// oracle: jdbc:oracle:thin:@ip地址:1521/ORCL
Connection conn = DriverManager.getConnection("数据库连接地址","账号","密码");
3. 通过连接对象,创建SQL执行对象(SQL执行环境)
Statement state = conn.createStatement();
4. 通过SQL执行对象 执行 SQL 语句
state.execute(String sql语言);
5. 释放资源
// 资源释放规则--->与创建顺序相反,即先创建的后释放.
// 如果有ResultSet,还需要释放该资源
rs.close();
state.close();
conn.close();
JDBC中常用的类型与方法
1. DriverManager : 驱动管理器
常用方法:
获取数据库连接:
Connection conn = DriverManager.getConnection("数据库连接地址","账号","密码");
2. Connection : 数据库连接对象
常用方法:
创建SQL执行对象: Statement.createStatement();
3. Statement : SQL执行对象
常用方法:
执行SQL语句(查询语句返回true,其他语句返回false)
booleanexecute(String sql);
执行DML语句(INSERT UPDATE DELETE) 和 DDL语句(create alter drop)
(返回int值,表示语句对数据库表格的影响行数 !)
(通常我们认为 返回值>0 表示执行成功)
int executeUpdate(String sql);
执行DQL语句(select)
ResultSet executeQuery(String sql);
4. ResultSet : 结果及对象(指的是一个select语句的查询结果)
常用方法:
(1). 控制游标移动的常用方法:
boolean next() *****
作用:控制游标向下一行移动。
返回值:移动成功返回值为true,下一行不存在移动失败,返回false
boolean privious() 了解
作用:控制游标向上一行移动。
返回值:移动成功返回值为true,上一行不存在移动失败,返回false
boolean absolute(int 行号) 了解
作用:控制游标向指定行移动。
返回值:移动成功返回值为true,行不存在移动失败,返回false
boolean beforeFirst() 了解
作用:控制游标移动到第一行。
返回值:移动成功返回值为true,第一行不存在移动失败,返回false
(2). 获取游标指向行的字段值的常用方法:
// XXX为响应的数据类型(Int,String等等)
XXX getXXX(String 列名) ***
根据字段名,得到此字段的值
XXX getXXX(String 字段的索引) ***
根据字段的索引,得到此字段的值,索引从 1 开始
工厂方法设计模式(静态工厂方法模式)
工厂方法模式是一种创建对象的模式.
工厂方法模式基于"输入",应用在超类和多个子类之间的情况,这种模式将创建对象的责任转移到工厂类;
工厂设计模式的特点:
1. 面向接口编程,体现了面向对象的思想
2. 降低了耦合,将创建对象的工作转移到了工厂类
DAO
DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
为了建立一个健壮的Java应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则是用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。
DAO模式是标准的JavaEE设计模式之一,开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开,一个典型的DAO实现有下列几个组件:
1. 一个DAO工厂类;
2. 一个DAO接口;
3. 至少一个实现DAO接口的具体类;
4. 数据传递对象(有些时候叫做Bean对象)。
SQL注入问题*
进行用户登录时,本来应该查询数据库中的密码与用户输入的密码是否一致,若一致则登录成功,否则登录失败。
但是在进行用户登录时,输入不存在的账号 和 如下密码:
1' or '1'='1
结果显示登录成功.
因为用户输入的密码,与我们的查询语句拼接后,使得我们的查询语句产生了歧义:
原查询语句:
select * from xzk_user where username='账号' and password='密码'
拼接后:
select * from xzk_user where username='账号' and password='1' or '1'='1'
可以看出以上密码的判断为 永真式。
解决SQL注入问题*
我们可以将代码与参数分离,将参数作为SQL的特殊部分进行预处理。
PreparedStatement预编译的SQL执行环境
内部实现原理:
1. 将未拼接参数的SQL语句,作为SQL指令,先传递给数据库,进行编译。
2. 再将参数传递给数据库,此时传递的参数不会在作为指令执行,只会被当作文本存在.
操作流程与Statement基本一致:
1. 如何得到一个PreparedStatement对象
PreparedStatement state = conn.prepareStatement("预编译的SQL语句");
2. 预编译的SQL语句如何编写
需要填充参数的位置,使用?代替即可!例如:
select * from xzk_user where username=? and password=?
3. 参数如何填充
state.setXXX(int index,XXX value);
参数1: index : SQL语句中?的索引值 , 从 1 开始
参数2: value : 填充的参数值.
4. 如何执行填充完毕参数的SQL
boolean execute();
int executeUpdate();
ResultSet executeQuery();
PreparedStatement与Statement谁的性能高?
看是什么数据库
在mysql中,PreparedStatement原理是拼接SQL, 所以Statement性能高.
在Oracle中,PreparedStatement原理是对SQL指令进行预处理,再传递的参数不具备特殊含义,有更好的SQL缓存策略,PreparedStatement性能高.
事务
概述:将多条SQL语句,看作是一个整体,要么一起成功,要么一起失败.
事务在mysql中,是默认自动提交的.
操作方式1:命令行
开启事务: start transaction;
回 滚: rollback; // 此次事务中所有的sql操作,放弃.
提交 : commit; // 此次事务中所有的sql操作,作为一个整体,提交.
操作方式2:Java
JDBC事务通过连接对象开启,回滚,提交.只针对当前连接对象生效
开启事务: conn.setAutoCommit(false);
回滚事务: conn.rollack();
提交事务: conn.commit();