JDBC学习
简介介绍
JDBC是一个在JAVA 里使用SQL语句来操作关系系数据库的API
通过定义 一套规范的接口来使得程序员可以方便的操作不同的关系型数据库
(是得JDBC只是接口 由各个公司来进行实际类的实现 这就是驱动)
快速入门
代码演示
// JDBC的快速入门
public class JDBCdemo {
public static void main(String[] args) throws Exception {
// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
/*
获取连接
URL
UserName
Password
*/
String URL = "jdbc:mysql://127.0.0.1:3306/db1";
String UserName = "";
String PassWord = "";
Connection conn = DriverManager.getConnection(URL, UserName, PassWord);
// 定义sql语句
String sql = "UPDATE account set money=20000 where id=1";
// 获取执行sql的对象
Statement stmt = conn.createStatement();
// 执行sql
int count = stmt.executeUpdate(sql);
// 处理结果
System.out.println(count);
// 释放资源
stmt.close();
conn.close();
}
}
Class.forname()是获取字节文件放射 想要了解可以看文章-放射知识学习
DriverManager 解析
先上一份官方文档
其中最重要的两个方法分别是
- getConnection() 获取连接
- registerDriver() 注册驱动
(在我们的快速入门代码里貌似是没有注册驱动
但是在我们反射加载Driver中Mysql有给我们书写静态代码)
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
帮助我们注册驱动
连接的参数返回的是一个连接
useSSL=false 是简化连接
Connection解析
首先依旧是官方关于Connection api的介绍
首先获取执行SQL的对象
Connection conn = DriverManager.getConnection(URL, UserName, PassWord);
// 获取执行sql的对象
Statement stmt = conn.createStatement();
对事务的处理, 与mysql的事务 处理非常的对齐
try {
// 启动事务
conn.setAutoCommit(false);
// 执行sql
int count1 = stmt.executeUpdate(sql1);
// 处理结果
System.out.println(count1);
// 执行sql
int count2 = stmt.executeUpdate(sql2);
// 处理结果
System.out.println(count2);
// 提交事务
conn.commit();
} catch (Exception e) {
// 我问题回滚事务
conn.rollback();
throw new RuntimeException(e);
}
对于一些可能出错的部分 我们关闭自动提交事务
添加 try/catch 模块来帮助更好的处理事务
Statement解析
针对不同的数据库操作定义了不同的方法
另外一种 执行DQL查询语句 返回的是resultSet
里面最重要的是两种方法 一个获取位置 一个在指定位置获取属性
PreparedStatement解析
PreparedStatement 基础
PrepareStatement 解决SQL注入的问题
(而SQL注入是 通过拼接字符串方式来逃避检查)
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String name = "zhangsan";
String pass_word = "123";
/*
获取建立连接
*/
String URL = "jdbc:mysql://127.0.0.1:3306/db1?useSSL=false";
String UserName = "root";
String PassWord = "qishimu621608";
Connection conn = DriverManager.getConnection(URL, UserName, PassWord);
// 获取state执行对象 这种情况无法防止sql注入导致的攻击
/*
Statement state = conn.createStatement();
String sql = "select * from tb_user where username='"+name+"' and password='"+pass_word+"'";
ResultSet count_log = state.executeQuery(sql);
if(count_log.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
*/
String sql = "select * from tb_user where username= ? and password= ? ";
PreparedStatement state = conn.prepareStatement(sql);
state.setString(1, name);
state.setString(2, pass_word);
ResultSet count_log = state.executeQuery();
if(count_log.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
// 释放资源
conn.close();
state.close();
count_log.close();
}
PreparedStatement 原理
预编译SQL,效率更高
防止SQL注入,将降敏感字符转义
数据库连接池
用来管理数据连接的
类似线程池,减少我们每次创建的时间 和 方便我们进行管理
标准接口:DataSource
public static void main(String[] args) throws Exception {
/*
获取当前目录所在的位置
System.out.println(System.getProperty("user.dir"));
*/
// 导入jar包
// 定义配置文件
// 加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("./druid.properties"));
// 获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对应的数据库连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}