JDBC
概念:Java DateBase Connectivity JAVA数据库连接
JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
使用步骤:
1.导入驱动jar包
2.注册驱动
3.获取数据库连接对象Connection
4.定义sql
5.获取执行sql语句的对象Statement
6.执行sql,接受返回结果
7.处理结果
8.释放资源
代码实现
public class jdbcDemo1 {
public static void main(String[] args) throws Exception {
//导入驱动jar包
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//定义sql语句
String sql = "update account set balance = 500 where id = 1";
//获取执行sql的对象Statement
Statement statement = conn.createStatement();
//执行sql
int count = statement.executeUpdate(sql);
//处理结果
System.out.println(count);
statement.close();
conn.close();
}
}
详解各个对象
1.DriverManager:驱动管理对象
功能:
(1)注册驱动:Class.forName(“com.mysql.jdbc.Driver”);
通过查看源码发现在com.mysql.jdbc.Driver存在静态代码块
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤
(2)获取数据库连接:
方法:static Connection getConnection(String url, String user, String password)
参数:
url:指定连接的路径,语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
user:用户名
password:密码
2.Connection:数据库连接对象
功能:
(1)获取执行sql的对象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
(2)管理事务:
开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
3.Statement:执行sql的对象
(1)执行sql:
boolean execute(String sql):可以执行任意的sql
int executeUpdate(String sql):可以执行DML(insert、update、delete)语句,DDL(create, alter,drop)语句 这里返回值为影响的行数
ResultSet executeQuery(String sql):执行DQL(select)语句
4.ResultSet:结果集对象
next():游标向下移动一行
getXxx():获取数据
Xxx:代表数据类型 如:int getInt()
参数:int:代表列的编号,从1开始。 如:getString(1)
String:代表列的名称。 如:getDouble(“balance”)
使用步骤:
1.游标向下移动一行
2.判断是否有数据
3.获取数据
5.PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。
(1)注入用户随便,输入密码:a’ or ‘a’ = 'a
(2)sql:select *from user where username = ‘fasdfdas’ and password = ‘a’ or ‘a’ = ‘a’
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的SQL:参数使用?作为占位符
练习
查询emp表的数据将其封装为对象。然后装载集合,返回。
package cn.itcast.jdbc;
import cn.itcast.domain.Emp;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回
*/
public class jdbcDemo8 {
public static void main(String[] args) {
List<Emp> list = new jdbcDemo8().findAll();
System.out.println(list);
}
/**
*查询所有emp对象
* @return
*/
public List<Emp> findAll(){
Connection conn = null;
Statement stmt = null;
ResultSet resultSet = null;
List<Emp> list = null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
//定义sql
String sql = "select * from emp";
//获取执行sql的对象
stmt = conn.createStatement();
//执行sql
resultSet = stmt.executeQuery(sql);
//遍历结果集
Emp emp = null;
list = new ArrayList<>();
while (resultSet.next()){
//获取数据
int id = resultSet.getInt("id");
String ename = resultSet.getString("ename");
int job_id = resultSet.getInt("job_id");
int mgr = resultSet.getInt("mgr");
Date joindate = resultSet.getDate("joindate");
double salary = resultSet.getDouble("salary");
double bonus = resultSet.getDouble("bonus");
int dept_id = resultSet.getInt("dept_id");
//创建emp对象
emp = new Emp();
emp.setId(id);
emp.setBounds(bonus);
emp.setDept_id(dept_id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setMgr(mgr);
emp.setJoindate(joindate);
emp.setSalary(salary);
//装载集合
list.add(emp);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
finally {
if (resultSet != null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
}
抽取jdbc工具类:JDBCUtils
目的:简化书写
JDBC管理事务:
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个步骤要么同时成功,要么同时失败。
2.操作:
(1)开启事务:在执行sql之前开启事务
(2)提交事务:当所有sql都执行完提交事务
(3)回滚事务:在catch中回滚事务
3.使用Connection对象来管理事务