概念
Java DataBase Connectivity Java 数据库连接, Java语言操作数据库。
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
用途
简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果
对象
- DriverManager:驱动管理对象
- 注册驱动:告诉程序该使用哪一个数据库驱动jar
- 获取数据库连接:
- Connection:数据库连接对象
- 获取执行sql 的对象//不安全 效率不高
- 管理事务:
开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
提交事务:commit()
回滚事务:rollback()
- Statement:执行sql的对象
- 执行sql
- ResultSet:结果集对象,封装查询结果
- PreparedStatement:执行sql的对象
- SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题输入用户随便,输入密码:a’ or ‘a’ = 'a
- sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’
- 解决sql注入问题:使用PreparedStatement对象来解决
- 预编译的SQL:参数使用?作为占位符
怎么使用jdbc
典故:“贾琏欲执事”----》加载、连接、语句、执行、关闭
贾 -->jar包(导入jar)
琏 -->连接对象
欲 -->sql 语句
执 -->curd(增删改查)
事 -->关闭连接 释放资源
使用jdbc进行curd
1.添加jar
2.使用(注意:jdbc中操作用到的对象 都是在import java.sql.Connection;)
public class Test {
//获取连接对象
static Connection connection;
static {
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
try {
//获取连接对象
//连接数据库 账号 密码
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/myschool", "root", "root");
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//add_grade("SSM");
//delete_gradeid(10);
//update_gradename("SSH1");
List<Grade> gradeList = selectAllGrade();
System.out.println("班级编号\t\t班级名称");
for (Grade grade:gradeList){
System.out.println(grade.getGradeid()+"\t\t\t"+grade.getGradename());
}
}
/**
* 添加数据
*
* @param gradename 添加的名字
* @return 返回添加几条数据
*/
public static int add_grade(String gradename) {
int num = 0;
PreparedStatement ps = null;
String sql = "INSERT INTO `grade`(`gradeName`) VALUES (?)";
try {
ps = connection.prepareStatement(sql);
ps.setObject(1, gradename);
num = ps.executeUpdate();
if (num > 0) {
System.out.println("添加成功。");
} else {
System.out.println("添加失败。");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return num;
}
/**
* 删除数据
*
* @param gradeid 删除数据的ID
* @return 删除的行数
*/
public static int delete_gradeid(int gradeid) {
int num = 0;
PreparedStatement ps = null;
String sql = "delete from `grade` where `gradeid`=?";
try {
ps = connection.prepareStatement(sql);
ps.setObject(1, gradeid);
num = ps.executeUpdate();
if (num > 0) {
System.out.println("删除成功。");
} else {
System.out.println("删除失败。");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return num;
}
/**
* 修改数据
*
* @param gradename 修改为
* @return 返回修改了几条数据
*/
public static int update_gradename(String gradename) {
int num = 0;
PreparedStatement ps = null;
String sql = "update `grade` set `gradename`=? where gradename='SSH'";
try {
ps = connection.prepareStatement(sql);
ps.setObject(1, gradename);
num = ps.executeUpdate();
if (num > 0) {
System.out.println("修改成功。");
} else {
System.out.println("修改失败。");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return num;
}
/**
* 查询数据
* @return 集合
*/
public static List<Grade> selectAllGrade(){
List<Grade> grades = new ArrayList<>();
String sql = "select * from `grade`";
PreparedStatement ps = null;
ResultSet rSet = null; //用来接收查询数据的结果集
try {
ps = connection.prepareStatement(sql);
rSet = ps.executeQuery();
while (rSet.next()){
Grade grade = new Grade();
grade.setGradeid(rSet.getInt(1));
grade.setGradename(rSet.getString("gradename"));
grades.add(grade);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return grades;
}
}
注意:在使用查询操作是需要创建相关的实体类 如Grade实体类:
public class Grade {
private int gradeid;
private String gradename;
public int getGradeid() {
return gradeid;
}
public void setGradeid(int gradeid) {
this.gradeid = gradeid;
}
public String getGradename() {
return gradename;
}
public void setGradename(String gradename) {
this.gradename = gradename;
}
@Override
public String toString() {
return "Grade{" +
"gradeid=" + gradeid +
", gradename='" + gradename + '\'' +
'}';
}
}
创建JDBC工具类
- 目的:简化书写
- 分析:
- 注册驱动也抽取
- 抽取一个方法获取连接对象
需求:不想传递参数(麻烦),还得保证工具类的通用性。
解决:配置文件 jdbc.properties
driver=
url=
user=
password=
例如:
jdbc_driver = com.mysql.jdbc.Driver
jdbc_url = jdbc:mysql://127.0.0.1:3306/myschool
jdbc_username = root
jdbc_password = root
- 抽取一个方法释放资源
代码实现:
public class JDBCUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
static {
//1. 创建Properties集合类。
Properties properties = new Properties();
//获取src路径下的文件的方式--->ClassLoader 类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL rul = classLoader.getResource("jdbc.properties");
//得到文件地址
String path = rul.getPath();
//打印jdbc.properties的路径
// System.out.println(path);
try {
//2. 加载文件
properties.load(new FileReader(path));
} catch (IOException e) {
e.printStackTrace();
}
//3. 获取数据,赋值
driver = properties.getProperty("jdbc_driver");
url = properties.getProperty("jdbc_url");
username = properties.getProperty("jdbc_username");
password = properties.getProperty("jdbc_password");
// 4.注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
*
* @return 连接对象
*/
public static Connection getConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 关闭资源
*
* @param rs 集合集
* @param ps 执行sql的对象
* @param conn 数据库连接对象
*/
public static void close(ResultSet rs, PreparedStatement ps, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}