JDBC简介(JAVA DATABASE CONNECTION)
使用Java语言操作关系型数据库的一套API
JDBC快速入门:
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Statement;
//JDBC快速入门
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1.注册驱动,加载类名,此处需要抛出异常Exception
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接,//之前是固定格式,后面加所要连接数据库的电脑ip和端口
String url="jdbc:mysql://127.0.0.1:3306/db1";
String root="root";
String password="admin";
Connection connection = DriverManager.getConnection(url, root, password);
//3.定义SQL
String sql="UPDATE account SET money=100 where id=1;";
//4. 获取执行sql的对象Statement
Statement statement = connection.createStatement();
//5. 执行sql,返回影响的行数
int index=statement.executeUpdate(sql);
//6. 处理结果
System.out.println(index);
//7. 释放资源
statement.close();
connection.close();
}
}
JDBCAPI详解
-
DriveManager(驱动管理类)
-作用:注册驱动;获取数据库连接
-
Connection(数据库连接对象)作用
获取执行SQL的对象:
a.普通执行SQL对象
Statement createStatement()
b.预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement preparement(sql)
c. 执行存储过程的对象
CallableStatement prepareCall(sql)
管理事务
a.Mysql事务管理:
开启事务:begin;/Start transaction
提交事务:commit
回滚事务:rollback
Mysql默认自动提交事务
b.JDBC 事务管理
开启事务:SetAutoCommit(bool),true自动提交
提交事务:commmit();
回滚事务:rollback();
- Statement
作用:执行SQL语句
a.int executeUpdate(sql):执行DML,DDL语句
返回值:DML饭返回影响的行数,DDL可能返回0
b. ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet结果集对象。 - ResultSet
ResultSet(结果集对象)
封装了DQL查询语句的结果
//创建容器
ArrayList<Account> accounts = new ArrayList<Account>();
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取链接
String url = "jdbc:mysql:///db1?useSSL=false";
String root = "root";
String password = "admin";
Connection connection = DriverManager.getConnection(url, root, password);
//写sql查询语句
String sql = "Select *FROM account";
//创建执行对象
Statement statement = connection.createStatement();
//执行sql语句
ResultSet resultSet = statement.executeQuery(sql);
//遍历数据
while (resultSet.next()) {
//创建对象,并将查出的数据封装到对象中
Account account=new Account();
account.setId(resultSet.getInt("id"));
account.setName( resultSet.getString("name"));
account.setMoney(resultSet.getDouble("money"));
accounts.add(account);
}
//遍历account对象集合
for (Account account:accounts) {
System.out.println("学生ID:"+account.getId()+"学生金钱:"+account.getMoney()+"学生姓名:"+account.getName());
}
//释放资源
resultSet.close();
statement.close();
connection.close();
- PreparedStatement
预编译SQL语句并执行:预防SQL注入问题
SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
/*
类名:PreparedStatementDemo
功能:解决SQL注入问题
实现过程:
1、获取PreparedStatement对象(sql中的参数值使用?代替)
通过COnnection对象获取PreparedStatement对象,并传入对应的sql语句
2、设置参数值:setInt(?索引,值)
3、执行sql
executeUpdate()/executeQuery():不需要传递参数值
*/
public class PreparedStatementDemo {
public static void main(String[] args) throws Exception{
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql:///db1?useSSL=false";
String root="root";
String admin="admin";
//获取连接
Connection connection = DriverManager.getConnection(url, root, admin);
// String name="聂宝根";
// String pass="123";
//定义SQL语句
String sql="select * from tb_login where user_account=? and user_password=?";
//创建执行对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//创建执行对象,参数1,?的位置编号;参数2:变量的值
preparedStatement.setString(1,"聂宝根");
preparedStatement.setString(2,"12");
//执行sql语句
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
{
System.out.println("登陆成功");
}
else
{
System.out.println("登陆失败");
}
resultSet.close();
preparedStatement.close();
connection.close();
}
PreparedStatement的原理:
- 好处:预编译SQL,性能更高;可以防止SQL注入
- PreparedStatement预编译功能开启:useServerPrepStmts=true
- 配置Mysql执行日志(重启MYsql服务后生效)
- PreparedStatement原理
在获取PreparedStatement对象时,将sql语句发送给mysql服务器
进行检查,编译
执行时就无需检查、编译,提高了速度
/*
类名:PreparedStatementDemo
功能:解决SQL注入问题
实现过程:
1、获取PreparedStatement对象(sql中的参数值使用?代替)
通过COnnection对象获取PreparedStatement对象,并传入对应的sql语句
2、设置参数值:setInt(?索引,值)
3、执行sql
executeUpdate()/executeQuery():不需要传递参数值
*/
public class PreparedStatementDemo {
public static void main(String[] args) throws Exception{
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql:///db1?useSSL=false&";
String root="root";
String admin="admin";
//获取连接
Connection connection = DriverManager.getConnection(url, root, admin);
// String name="聂宝根";
// String pass="123";
//定义SQL语句,开启预编译
String sql="select * from tb_login where user_account=? and user_password=?useServerPrepStmts=true";
//创建执行对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//创建执行对象,参数1,?的位置编号;参数2:变量的值
preparedStatement.setString(1,"聂宝根");
preparedStatement.setString(2,"12");
//执行sql语句
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
{
System.out.println("登陆成功");
}
else
{
System.out.println("登陆失败");
}
resultSet.close();
preparedStatement.close();
connection.close();
}
数据库连接池技术
基本概念:
数据库连接池的实现:
Druid使用步骤:
Druid的下载
阿里仓库下载:https://mvnrepository.com/artifact/com.alibaba/druid/1.1.12
- 导入jar包 druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接