Java学习-13-韩顺平老师
Java-JDBC快速入门01
目录:
01-JDBC概述
02-ResultSet
03-Statement && PreparedStatement
04-封装JDBCUtils
05-事务
06-批处理
JDBC概述
基本介绍:
1.JDBC为访问不同数据库的提供了统一的接口,为使用者屏蔽了细节问题。
2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
3.JDBC是Java提供一套用于数据库操作的API,Java程序员只需要面向这套接口即可,不同的数据厂商,需针对这套接口,提供不同的实现。
JDBC API:
JDBC API是一系列的接口,它同意和规范了应用程序与数据库连接、执行SQL语句,并返回结果等各类操作,相关类和接口都在java.sql和javax.sql。
JDBC的编写步骤: 注:先将驱动包放在了libs目录下,并且导入到了项目中。
1.注册驱动:加载Driver类
2.获取连接:得到Connection
3.执行增删改查:发送sql给mysql执行
4.释放资源:关闭连接
获取数据库连接的4种方式: 其中推荐使用第四种
public class JdbcConn {
public static void main(String[] args) throws Exception {
connect0102();
connect03();
connect04();
}
// 演示第一种和第二种,就是获取driver方法不同
public static void connect0102() throws Exception{
// 1.获取驱动的第一种方法,静态方法
Driver driver1 = new Driver();
// 2.获取驱动第二种方法,动态加载
Class<?> cls = Class.forName("com.mysql.jdbc.Driver");
// 创建驱动
Driver driver = (Driver)cls.newInstance();
// 加载登录信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
// url="jdbc:mysql://localhost:3306/zcc_test"
// 创建连接,获得一个Connection 对象
Connection connect = driver.connect("jdbc:mysql://localhost:3306/zcc_test", properties);
System.out.println("成功");
// 释放资源
connect.close();
}
public static void connect03() throws Exception{
// 3. 使用DriverManage 替换 Driver 来获取连接
Class<?> cls = Class.forName("com.mysql.jdbc.Driver");
Driver driver =(Driver) cls.newInstance();
String user = "root";
String password = "196174";
String url = "jdbc:mysql://localhost:3306/zcc_test";
DriverManager.registerDriver(driver);
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("成功");
connection.close();
}
public static void connect04() throws Exception{
// 4. 如果使用 DriverManage 可以直接省略实例化这一过程
String user = "root";
String password = "196174";
String url = "jdbc:mysql://localhost:3306/zcc_test";
DriverManager.getConnection(url,user,password);
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println("成功");
connection.close();
}
}
ResultSet(结果集)
基本介绍:
1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
2.ResultSet对象保持一个光标执行其当前的行。最初,光标于第一行之前。
3.next方法可以使光标下移,并且当ResultSet没有下一行的时候返回false,通常使用while循环来遍历输出。
public class ResultSet_ {
public static void main(String[] args) throws Exception{
// 加载 Driver
Class.forName("com.mysql.jdbc.Driver");
// 拿到登入数据库对应信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
System.out.println(url);
// 创建连接
Connection connection = DriverManager.getConnection(url, user, password);
// 定义sql语句
String sql = "select * from student";
// 这里使用 preparedStatement 来执行sql语句,这里需要填入sql
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
// 循环取出 resultSet
while (resultSet.next()){
String name = resultSet.getString("name");
String english = resultSet.getString("english");
String math = resultSet.getString("math");
String chinese = resultSet.getString("chinese");
System.out.println(name + "\t" + english + "\t" + chinese + "\t" + math);
}
// 释放相关资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
Statement && PreparedStatement
Statement:
1.Statement对象 用于执行静态SQL语句并返回其生成的结果的对象
2.在连接建立后,需要对数据库进行访问,执行 命名或是SQL 语句,可以通过
Statement
PreparedStatement
CallableStatement
3.Statement对象执行SQL 语句,存在SQL注入风险SQL Injection
4.SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输
入数据中注入非法的 SQL 语句段或命令,恶意攻击数据库。sql injection.sql
5.要防范 SQL 注入,只要用 PreparedStatement(从Statement扩展而来)取
代 Statement 就可以了
注:由于这个不太使用,就不演示代码了
PreparedStatement:
1.PreparedStatement 执行的 SQL 语句中的参数用问号(?)来表示,调用PreparedStatement对象的setxxx(0方法来设置这些参数.setxxx()方法有两个参数,第一个参数是要设置的SQL句中的参数的索引(从1开始),第二个是设置的 SQL 语句中的参数的值。
2.调用 executeQuery(),返回 Resultset 对象
3.调用 execute Update():执行更新,包括增、删、修改
public class ResultSet_ {
public static void main(String[] args) throws Exception{
// 加载 Driver
Class.forName("com.mysql.jdbc.Driver");
// 拿到登入数据库对应信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
System.out.println(url);
// 创建连接
Connection connection = DriverManager.getConnection(url, user, password);
// 定义sql语句,使用?作为占位符
String sql = "insert into student values(?,?,?,?,?)";
// 这里使用 preparedStatement 来执行sql语句,这里需要填入sql
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,9);
preparedStatement.setString(2,"tom");
preparedStatement.setInt(3,88);
preparedStatement.setInt(4,99);
preparedStatement.setInt(5,90);
preparedStatement.executeUpdate();
System.out.println("更新成功");
preparedStatement.close();
connection.close();
}
}
封装JDBCUtils
因为每次连接和关闭连接都是一些重复的操作,所以可以封装一个工具类来完成这些工作.
package com.zcc.Utils_;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* @author 安逸i
* @version 1.0
*/
public class JDBCUtils {
public static String user;
public static String password;
public static String url;
public static Driver driver;
// 在静态代码块种初始化变量
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
user = properties.getProperty("user");
password = properties.getProperty("password");
url = properties.getProperty("url");
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnect(){
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = (Connection) DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public static void close(ResultSet resultSet, Statement statement, Connection connection){
try {
if(resultSet != null){
resultSet.close();
}
if(statement !=null){
statement.close();
}
if(connection != null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
事务
基本介绍:
1.JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每
次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
2.JDBC程序中为了让多个 SQL 语句作为一个整体执行,需要使用事务。
3.调用 Connection 的 setAutoCommit(false)可以取消自动提交事务
4.在所有的 SQL 语包都成功执行后,调用 commitO:方法提交事务
5.在其中某个操作失败或出现异常时,调用 rollback0;方法回滚事务
public class Transaction_ {
public static void main(String[] args) {
Connection connect =null;
try {
connect = JDBCUtils.getConnect();
// 表示事务开始
connect.setAutoCommit(false);
// 马云给马化腾转账100
String sql = "update table account set money-100 where `name` = ?";
PreparedStatement preparedStatement = connect.prepareStatement(sql);
preparedStatement.setString(1,"马云");
// 但是中间有一个错误,如不适用事务,将会导致 马云钱少了100,但是马化腾没有收到100
int num = 10/0;
String sql1 = "update table account set money+100 where `name` = ?"
preparedStatement = connect.prepareStatement(sql1);
preparedStatement.setString(1,"马化腾");
// 如果没有问题,就会在这里提交
connect.commit();
} catch (SQLException e) {
try {
// 出现错误回滚到开始事务的地方
// 这样就可以让马云的钱不减少
connect.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
}
}
}
批处理
基本介绍:
1.当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情況下比单独提交处理更有效率。
2.JDBC的批量处理语句包括下面方法:
addBatch():添加需要批量处理的SQL语句或参数;
executeBatch():执行批量处理语句;
clearBatch():清空批处理包的语句;
3.JDBC连接MySQL时,如果要使用批处理功能,请再url中加参数?rewriteBatchedStatements=true
4.批处理往往和PreparedStatement一起搭配使用,可以既减少编译次数,又减少运行次数,效率大大提高.
public class Batch_ {
public static void main(String[] args) throws SQLException {
Connection connect = JDBCUtils.getConnect();
PreparedStatement preparedStatement = null;
for (int i = 0; i < 5000; i++) {
String sql = "insert into students values(?,?)";
preparedStatement = connect.prepareStatement(sql);
preparedStatement.setInt(1,i);
preparedStatement.setString(2,"jack" + i);
// 添加需要批量处理的sql语句
preparedStatement.addBatch();
// 当达到1000条操作时,就把sql语句一次性发给mysql来执行
// 减少了网络传输的时间,大大的提高了效率
if((i+1) %1000 == 0){
// 发给mysql执行
preparedStatement.executeBatch();
// mysql 执行完之后,要把原来的清楚,再装下一批需要处理的sql
preparedStatement.clearBatch();
}
}
// 释放资源
JDBCUtils.close(null,preparedStatement,connect);
}
}
JDBC基本入门第一小结,欢迎大家交流学习!