1. JDBC的基本概念
* Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
* JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
* 简而言之 : 官方定义接口 各大数据库厂商重写接口 并提供 jar 包供我们编程使用
2. 快速入门代码
* Connection connection = null; // 创建连接数据库对象
* Statement statement = null; // 创建操作Sql对象
* // ResultSet rs = null; // 创建结果集对象
* // list<Emp> list = new ArrayLIst<Emp>; // 创建集合
*
* Class.forName("com.mysql.jdbc.Driver"); // 注册驱动
* String sql_1 = "delate from account where id = 3 ";
* String sql_2 = "insert account into (id, name, balabce) value (1, 'wang ', 1000)";
* String sql_3 = "update account set balance = 10000 where id = 1"; // DDL
*
* // String sql_4 = "select * from account"; //DML
*
* connection = DriverManager.getConnection(); // 为数据库连接对象赋值
* statement = connection.createStatement(); // 为操作Sql对象赋值
* int count = statement.excuteUpdate(sql_1);
* // 获取操作结果执行excuteUpdate 方法的语句的返回值是 表中多少行数据发生了修改
* System.out.println(count);
* /*
*
* (注:/* */中的部分为DML查询语句的使用)
*
* // 外面自定义类 用来存储表的列中的数据 并放入集合
* re = statement.excuteQuery()
* while(re.next){
* emp = new Emp;
* Int id = re.getInt(id);
* String name = re.getString(name);
* Double balance = re.getDouble(balance);
* emp.setId(id);
* emp.setName(name);
* emp.setBalance(balance);
* list.add(emp);
* }
* //遍历输出
* Iterator it = list.iterator;
* whlie(it.hasNext){
* System.out.println(it.next);
* }
* // 释放资源
* collection.close();
* statement.close();
* re.close();
* */
3. 详解各个接口和类
* DriverManager 驱动管理对象
1. 注册驱动 : 告诉程序应该使用哪个数据库驱动jar
* 代码:
**class.from("com.mysql.jdbc.Driver");**
传入的参数是一个.class文件
在这个类中 有一个静态代码块 (注册驱动的底层方法)
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
注:mysql5之后的驱动jar包可以省略注册驱动的步骤
在jar包内有一个文件中 写了 "com.mysql.jdbc.Driver";
2. 获取数据库连接
* 方法: static Connection getConnection((String url, String user, String password)
* 三个参数:
* url :指定连接的路径
* 语法:jdbc:mysql://ip地址(域名 本计算机是127.0.0.1):端口号(本机是3306)/数据库名称;
* **jdbc:mysql://localhost:3306/db3;**
* 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
* user:用户名
* password: 密码
Connection:数据库连接对象
功能:
1. 获取执行sql 的对象
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
2. 管理事务:
* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()
3. Statement:执行sql的对象
执行sql
1. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
2. ResultSet executeQuery(String sql) :执行DQL(select)语句
* 返回值: ResultSet 结果集对象
4. ResultSet:结果集对象,封装查询结果
* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
* getXxx(参数):获取数据
* Xxx:代表数据类型 如: int getInt() , String getString()
* 参数:
1. int:代表列的编号,从1开始 如: getString(1)
2. String:代表列名称。 如: getDouble("balance")
【 使用举例 】
* while(re.next){
* emp = new Emp;
* Int id = re.getInt(id);
* String name = re.getString(name);
* Double balance = re.getDouble(balance);
* emp.setId(id);
* emp.setName(name);
* emp.setBalance(balance);
* list.add(emp);
* }
5. PreparedStatement:执行sql的对象
1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1. 输入用户随便,输入密码:a' or 'a' = 'a
2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
2. 解决sql注入问题:使用PreparedStatement对象来解决
3. 预编译的SQL:参数使用?作为占位符
4. 步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
6. 给?赋值:
* 方法: setXxx(参数1,参数2)
* 参数1:?的位置编号 从1 开始
* 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
**1. 可以防止SQL注入**
2. 效率更高
抽取JDBC工具类: JDBCUtils;
* 目的: 懒 (减少冗余)
* 用到的类:
* Connection 方法
* Classloder 方法: getResource() 返回当前加载类所在路径的工程文件 传入参数为文件名
* URL 方法:getpath()返回资源文件的地址
* Properties 方法: lode() 获取键值对集合
getPropery() 根据键获取值
* Class 方法: getClassLoder
* DriverManager 方法:getConnection
* 实现
1. 注册驱动
2. 获取连接对象
3. 释放资源
* 书写 JDBC 工具类的步骤
* 1. 创建静态变量 driver user password url
* 2. 创建静态代码块(意义:)
* * 静态代码块的内容
* a. 要完成的事情是 把资源文件中的四个键值对属性 为本类中的静态变量赋值 以达到代码的高可用性
* b. 步骤
* (1). 创建 properties 资源对象
* (2). 拿到本类的类加载文件 ClassLoder cl = 类名.class.getClassLoder
* (3). 获取 资源文件中的资源 URL resource = cl.getResource("资源文件名");
* (4). 获取 工程资源文件对象的地址 resource.getPath();
* (5). 将工程资源文件的地址传入 properties.lode() 获取到资源文件中的键值对
* (6). 通过键值对给静态变量赋值 用到properties的getProperty方法
* (7). 注册驱动 Class.forName(driver);
* 3. 构建静态方法获取连接
* 4. 构建静态方法关闭资源
JDBC控制事务
1. 事务: 一个包含多个步骤的业务操作,如果这个业务操作被事务管理,那么如果有一步失败,整个事务也失败;
1. 开启
2. 提交
3. 回滚
2. 使用connection对象来管理事务
1. 开启:setAutoCommite()
2. 提交:commit()
3. 回滚:rollback()