版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caoshiminYQS/article/details/86546160
配置文件:
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306
database=/day20
user=root
password=root
User实体类:
package yanqiushi;
public class User {
private String uname;
private int id;
private int age;
private String loc;
public User() {
}
public User(String uname, int id, int age, String loc) {
this.uname = uname;
this.id = id;
this.age = age;
this.loc = loc;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", id=" + id +
", age=" + age +
", loc='" + loc + '\'' +
'}';
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
JdbcUtil
package com.yanqiushi;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JdbcUtil {
private static String FILE_NAME = "src/jdbc.properties";
private static String url;
private static String database;
private static String user;
private static String password;
static{
try {
Properties properties = new Properties();
properties.load(new FileReader(FILE_NAME));
String driverName = properties.getProperty("driverName");
url = properties.getProperty("url");
database = properties.getProperty("database");
user = properties.getProperty("user");
password = properties.getProperty("password");
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
System.out.println(e.getMessage() + "\n\t\t" + "请将配置文件jdbc.properties放置到src目录下");
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
Connection connection = DriverManager.getConnection(url+database,user,password);
return connection;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void execute(ExecuteInter executeInter){
try {
Connection connection = getConnection();
executeInter.execute(connection).close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void showRS(ResultSet resultSet){
try {
while (resultSet.next()){
System.out.print(resultSet.getString(1) + "\t");
System.out.print(resultSet.getString(2) + "\t");
System.out.print(resultSet.getString(3) + "\t");
System.out.print(resultSet.getString(4) + "\t");
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet resultSet,Statement statement,Connection connection){
if (resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
public static void close(Connection connection){
close(null,connection);
}
public static void close(){
close(null);
}
}
测试1(六步):
package com.yanqiushi;
import com.mysql.jdbc.Driver;
import java.sql.*;
public class Main1 {
/*
JDBC, 全称:
Java Database Connection
Java对数据库的连接规范
mysql-connector-java-5.1.18-bin.jar
这个jar包,我们叫它驱动
JDBC是规范,那么不同的数据库厂商可以对该规范有不同的实现
所以使用不同的数据库的时候,只需要更换不同的jar包(也就是驱动)即可
*/
public static void main(String[] args) throws SQLException {
// 1.注册驱动
DriverManager.registerDriver(new Driver());
// 2.获得连接
Connection connection = DriverManager.getConnection(
// jdbc:mysql://localhost:端口号/数据库名称
"jdbc:mysql://localhost:3306/day20",
"root",
"123"
);
System.out.println(connection.getClass().getName());
// 3.找个对象给我们干活:statement(这个接口,用来声明要执行的sql语句)
String sql = "select * from hw_user";
Statement statement = connection.createStatement();
// 4.让这个对象去执行sql语句:执行查询语句时,得到的返回值类型为ResultSet(也就是我们常说的结果集)
ResultSet resultSet = statement.executeQuery(sql);
// 5.从ResultSet中取出数据
while (resultSet.next()){
System.out.print(resultSet.getInt("uid")+"\t");
System.out.print(resultSet.getString("uname")+"\t");
System.out.print(resultSet.getInt(3)+"\t");
System.out.print(resultSet.getString(4)+"\t");
System.out.println();
}
// 6.关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
测试2(注册驱动):
public class Main2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 将Driver类加载进内存
// 也就会执行该类的静态代码块
// 也就实现了注册驱动
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day20" + "?user=root&password=123");
Statement statement = connection.createStatement();
int i = statement.executeUpdate("INSERT INTO hw_user VALUES (NULL ,'张一山',40,'北京')");
// 受影响的行数
System.out.println(i);
statement.close();
connection.close();
}
}
测试3:
package com.yanqiushi;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class Main3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/day20";
Properties info = new Properties();
info.load(new FileReader("src/com/wsh/study/db.properties"));
Connection connection = DriverManager.getConnection(url, info);
Statement statement = connection.createStatement();
String update = "update hw_user set uname='马云' where uname='马化腾'";
boolean execute = statement.execute(update);
statement.close();
connection.close();
new Thread(new Runnable() {
@Override
public void run() {
}
});
}
}
测试4(接口回调):
import java.sql.Statement;
public class Main4 {
public static void main(String[] args) {
// 调用JdbcUtil类时,该类会加载进内存
// 也就会执行静态代码块,获得配置文件中的数据
// 执行静态方法execute
// 传入的是ExecuteInter接口的一个匿名实现类对象
// 这里和我们学习线程时很类似
// 传进去的对象,我们先叫它e
// 在execute方法中(可以点进去看)
// 第一步:根据配置文件中的数据建立连接
// 第二步:调用e的execute方法,将连接传入
// 这里就会回来执行这个匿名实现类的execute方法
// 在这个方法中我们获得state,执行sql语句
// 并且,将state作为返回值返回
// 第三步:将e.execute()得到的返回值关闭
// 第四步:关闭连接
// 这种写法叫:接口回调
JdbcUtil.execute(new ExecuteInter() {
@Override
public Statement execute(Connection connection) throws SQLException{
Statement statement = connection.createStatement();
String sql = "select * from hw_user";
ResultSet resultSet = statement.executeQuery(sql);
// 接下来就是遍历resultSet
JdbcUtil.showRS(resultSet);
return statement;
}
});
}
}
测试5(防止sql注入):
package com.yanqiushi;
import java.sql.*;
public class Main5 {
/**
* 1.PrepareStatement可以使用动态参数
* Statement只能执行静态的sql语句
*
* 2.防止sql注入
* 什么是sql注入?
* select * from user where username = ? and password = ?
* @param args
*/
public static void main(String[] args) {
JdbcUtil.execute(new ExecuteInter() {
@Override
public Statement execute(Connection connection) {
try {
PreparedStatement preparedStatement =
connection.prepareStatement("SELECT * FROM hw_user WHERE loc=? AND age >?;");
preparedStatement.setString(1,"北京");
preparedStatement.setInt(2,20);
ResultSet resultSet = preparedStatement.executeQuery();
JdbcUtil.showRS(resultSet);
return preparedStatement;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
});
String user = "zhangsan";
String password = "123";
String sql = "select * from user where username = " + user
+ "and password = " + password;
}
}
测试6(批处理):
接口:
package com.yanqiushi;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public interface ExecuteInter {
Statement execute(Connection connection) throws SQLException;
}
package com.yanqiushi;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main6 {
public static void main(String[] args) {
// {}就是匿名内部类实现ExecuteInter接口时
// 复写的那个方法execute的方法体
// connection就是execute方法的参数
JdbcUtil.execute(connection -> {
try {
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO hw_user VALUES (NULL ,'张三',30,'上海')");
// 将30岁的张三插入到批处理中
preparedStatement.addBatch();
// 添加批处理任务
preparedStatement.addBatch("INSERT INTO hw_user VALUES (NULL ,'李四',10,'武汉')");
preparedStatement.addBatch("INSERT INTO hw_user VALUES (NULL ,'张三',11,'武汉')");
// 开始执行批处理任务
preparedStatement.executeBatch();
return preparedStatement;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
});
}
}
测试7(事务):
package com.yanqiushi;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main7 {
private static PreparedStatement preparedStatement;
public static void main(String[] args) {
/**
* 事物的四个特性
* 原子性
* 一致性
* 隔离性
* 持久性
*
* 统称为ACID
*/
JdbcUtil.execute(connection -> {
// 设置为false,表示手动提交
// 也就是开启了事务
// 默认是自动提交的
try {
connection.setAutoCommit(false);
preparedStatement = connection.prepareStatement(
"DELETE FROM hw_user WHERE uname=?"
);
preparedStatement.setString(1,"张三");
preparedStatement.execute();
// Class.forName("");
preparedStatement.setString(1,"李四");
preparedStatement.execute();
// 提交事务
connection.commit();
// return preparedStatement;
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
// 回滚,取消操作
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
return preparedStatement;
});
}
}
测试8(对某个已知类的扩展):
重写QuerrRunner:
package com.yanqiushi;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import java.sql.Connection;
import java.sql.SQLException;
public class QueryRunnerSon extends QueryRunner {
@Override
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
T query = super.query(conn, sql, rsh, params);
conn.close();
return query;
}
}
package com.yanqiushi;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main8 {
public static void main(String[] args) throws SQLException {
//dbUtil是apache公司给我们提供的一个工具类
// 强行翻译(询问执行者)
QueryRunner queryRunner = new QueryRunnerSon();
String sql = "select * from hw_user";
List<User> query = queryRunner.query(
JdbcUtil.getConnection(),
sql,
new ResultSetHandler<List<User>>() {
@Override
public List<User> handle(ResultSet resultSet) throws SQLException {
// TODO 把rusultset中的数据
// 封装到一个对象中
List<User> users = new ArrayList<>();
while (resultSet.next()){
User user = new User(
resultSet.getString(2),
resultSet.getInt(1),
resultSet.getInt(3),
resultSet.getString(4));
users.add(user);
}
return users;
}
});
// 对已知的某个类进行扩展
// Iterator<User> iterator = query.iterator();
for (User user : query) {
if (user.getId() == 1) {
System.out.println(user.toString());
}
}
}
}