本专栏将从基础开始,逐步解释数据库的基本概念和使用情况。我希望每个人都能从中获益,请给予更多的支持。 专栏地址: 数据库必知必会 软件地址:软件地址: 若文章知识点有错误,请指正!大家一起学习,一起进步。
文章目录
- 1 数据库操作的优化实例
-
- 1.1 原始版本
- 1.2 使用JDBCUtil封装代码
- 1.3 统一的查询和修改配置文件的方式
- 1.4 各种返回结果采用泛型处理
- 1.5 连接池
1 数据库操作的优化实例
1.1 原始版本
添加依赖
<dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> </dependencies>
创建数据库和表:
create database learnDesignPattern; use learnDesignPattern; create table t_student( id int(32) primary key auto_increment, name varchar(50), age varchar(50) ); alter table t_student change column age age int(32);
创建学生类Student.java:
public class Student {
private int age; private String name; private int id;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public Student(int age, String name, int id) {
this.age = age;
this.name = name;
this.id = id;
}
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 getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
创建对学术的增删查改StudentDao.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class StudentDao {
//添加学生信息
public void add(Student stu){
String sql = "insert into t_student(name,age) values(?,?)";
Connection conn = null;
Statement st = null;
try{
//1.初始化驱动类,在初始化的时候通过静态代码块中的java.sql.DriverManager.registerDriver(new Driver())注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/learnDesignPattern?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT","root","root");
//3.创建语句对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,stu.getName());
ps.setObject(2,stu.getAge());
//4.执行sql
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放资源
try{
if (st != null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
//删除学生信息
public void delete(int id){
String sql = "delete from t_student where id=?";
Connection conn = null;
Statement st = null;
try{
//1.初始化驱动类,在初始化的时候通过静态代码块中的java.sql.DriverManager.registerDriver(new Driver())注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/learnDesignPattern?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT","root","root");
//3.创建语句对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,id);
//4.执行sql
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放资源
try{
if (st != null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
//修改学生信息
public void update(Student stu){
String sql = "update t_student set name =?,age=? where id=?";
Connection conn = null;
Statement st = null;
try{
//1.初始化驱动类,在初始化的时候通过静态代码块中的java.sql.DriverManager.registerDriver(new Driver())注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/learnDesignPattern?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT","root","root");
//3.创建语句对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1,stu.getName());
ps.setObject(2,stu.getAge());
ps.setObject(3,stu.getId());
//4.执行sql
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放资源
try{
if (st != null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
1.2 使用JDBCUtil封装代码
可以看到上面代码功能没有问题,但是重复代码太多,因此可以进行抽取,把重复代码放到一个工具类JDBCUtil里。
- JDBCUtil.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCUtil {
private JDBCUtil(){
}
static {
try{
//1.初始化驱动类,在初始化的时候通过静态代码块中的java.sql.DriverManager.registerDriver(new Driver())注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
}catch (Exception e){
e.printStackTrace();
}
}
public static Connection getConnection(){
try{
//2.获取数据库连接
return DriverManager.getConnection("jdbc:mysql://localhost:3306/learnDesignPattern?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT","root","root");
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void close(ResultSet rs, Statement st, Connection conn){
//释放资源
try{
if(rs != null){
rs.close();
}
if (st != null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
- StudentDao.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class StudentDao {
//添加学生信息
public void add(Student stu){
String sql = "insert into t_student(name,age) values(?,?)";
Connection conn = null;
Statement st = null;
PreparedStatement ps = null;
try{
conn = JDBCUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.setObject(1,stu.getName());
ps.setObject(2,stu.getAge());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(null,ps,conn);
}
}
//删除学生信息
public void delete(int id){
String sql = "delete from t_student where id=?";
Connection conn = null;
Statement st = null;
PreparedStatement ps = null;
try{
conn = JDBCUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.setObject(1,id);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(null,ps,conn);
}
}
//修改学生信息
public void update(Student stu){
String sql = "update t_student set name =?,age=? where id=?";
Connection conn = null;
Statement st = null;
PreparedStatement ps = null;
try{
conn = JDBCUtil.getConnection();
ps = conn.prepareStatement(sql);
ps.setObject(1,stu.getName());
ps.setObject(2,stu.getAge());
ps.setObject(1,stu.getId());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(null,ps,conn);
}
}
}
1.3 使用配置文件,以及查询和修改统一方式
3.2的方法任然有部分冗余,可以把查询和修改的方法进行统一。
- JDBCUtil.java
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
private static Properties p = null;
private JDBCUtil(){
}
static {
try{
//1.初始化驱动类,在初始化的时候通过静态代码块中的java.sql.DriverManager.registerDriver(new Driver())注册驱动
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = loader.getResourceAsStream("db.properties");
p = new Properties();
p.load(inputStream);
Class.forName(p.getProperty("driverClassName"));
}catch (Exception e){
e.printStackTrace();
}
}
public static Connection getConnection(){
try{
//2.获取数据库连接
return DriverManager.getConnection(p.getProperty("url"),p.getProperty("username"),p.getProperty("password"));
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void close(ResultSet rs, Statement st, Connection conn){
//释放资源
try{
if(rs != null){
rs.close();
}
if (st != null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
- JDBCTemplate.java
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class JDBCTemplate { public static void update