简介
Java DataBase Connectivity Java数据库连接
我们学习的技术是JDBC 不是 MYSQLJDBC 也不是 ORACLE JDBC
JDBC是一套标准,是Java与各大数据库厂商共同定制的一套接口. 这套接口由各大数据库厂商进行了实现.
发展历史
自从Java语言于1995年5月正式公布以来,Java风靡全球。
出现大量的用java语言编写的程序,其中也包括数据库应用程序。由于没有一个Java语言的数据库操作API,编程人员不得不在Java程序中加入C语言的ODBC函数调用。这就使很多Java的优秀特性无法充分发挥,比如平台无关性、面向对象特性等。
随着越来越多的编程人员对Java语言的日益喜爱,越来越多的公司在Java程序开发上投入的精力日益增加,对java语言接口的访问数据库的API的要求越来越强烈。也由于ODBC的有其不足之处,比如它并不容易使用,没有面向对象的特性等等,SUN公司决定开发一Java语言为接口的数据库应用程序开发接口。
在JDK1.x版本中,JDBC只是一个可选部件,到了JDK1.1公布时,SQL类包(也就是JDBCAPI)就成为Java语言的标准部件。
使用步骤: *
1. 引入jar文件.
2. 加载数据库驱动 (JavaSE项目中可以省略 , JavaWeb项目必须编写此步骤)
Class.forName("com.mysql.jdbc.Driver");
3. 通过驱动管理器, 获取JDBC连接对象.
Connection conn = DriverManager.getConnection("数据库连接地址","帐号","密码");
// 数据库连接地址格式: 主协议:子协议://ip地址:端口号/数据库名称
// mysql的连接地址: jdbc:mysql://localhost:3306/java35
// oracle的连接地址: jdbc:oracle:thin:@localhost:1521:ORCL
4. 通过连接对象, 创建SQL执行对象 (SQL执行环境)
Statement state = conn.createStatement();
5. 通过SQL执行对象 ,执行SQL语句.
state.execute(String sql语句);
6. 释放资源
state.close();
conn.close();
JDBC中常用的类型与方法
1. DriverManager : 驱动管理器
常用方法:
- 获取数据库连接:
static Connection getConnection(String 数据库地址,String 账号 ,String 密码)
2. Connection : 数据库连接对象
常用方法:
- 创建SQL执行对象: Statement createStatement();
3. Statement : SQL执行对象
常用方法:
- 执行SQL语句(查询语句返回true, 其它语句返回false)
boolean execute(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
- boolean afterLast() 了解
作用: 控制游标移动到最后一行
返回值: 移动成功返回true, 没有最后一行数据返回false
2. 获取游标指向行的字段值的常用方法:
- XXX getXXX(String 列名) ***
根据字段名, 得到此字段的值
- XXX getXXX(int 字段的索引) *
根据字段的索引, 得到字段的值 , 索引从1开始
工厂方法设计模式
工厂方法模式一种创建对象的模式.
工厂方法模式基于”输入”,应用在超类和多个子类之间的情况,这种模式将创建对象的责任转移到工厂类;
工厂设计模式的优点:
1. 面向接口编程,体现了面向对象的思想
2. 降低了耦合, 将创建对象的工作转移到了工厂类
代码案例:
1. 水果接口
public interface Fruit {
void eat();
}
2. 苹果 (水果的一种)
public class Apple implements Fruit{
@Override
public void eat() {
System.out.println("苹果吃起来甜甜的脆脆的.");
}
}
3. 香蕉 (水果的一种)
public class Banana implements Fruit{
@Override
public void eat() {
System.out.println("香蕉吃起来软软的甜甜的");
}
}
4. 静态工厂类
public class FruitFactory {
public static Fruit get(){
//return new Apple();
return new Banana();
}
}
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=’hahahaheiheihei’ and password=’1’ or ‘1’=’1’
解决sql注入问题 *
我们可以将SQL语句与参数分离,将参数作为SQL的特殊部分进行预处理.
PreparedStatement 预编译的SQL执行环境
内部实现原理:
1. 将未拼接参数的SQL语句, 作为SQL指令, 先传递给数据库 进行编译.
2. 再将参数传递给数据库, 此时传递的参数不会再作为指令执行, 只会被当作文本存在.
操作流程与Statement基本一致:
1. 如何得到一个PreparedStatement 对象
PreparedStatement state = conn.prepareStatement(“预编译的SQL语句”);
2. 预编译的SQL语句如何编写
需要填充参数的位置, 使用?代替即可! 例如:
select id from xzk_user where username=? and password=?
3. 参数如何填充
state.setXXX(int index,XXX value);
setXXX中XXX指的是数据类型,
参数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高.