一、第一个类 DB :在该类中定义通用的数据库相关操作:加载驱动、获取链接、关闭资源
package com.sdgy.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 这个类实现通用的数据库操作:加载驱动、获取链接、关闭资源
*/
public class DB {
private static final String DRIVER ="com.mysql.jdbc.Driver";
// ?characterEncoding=utf-8 :解决中文问题,如果没有这个,插入汉字时会出现异常,中文会显示为?
private static final String URL = "jdbc:mysql://localhost:3306/db?characterEncoding=utf-8";
private static final String USER = "root";
private static final String PWD = "1234";
//1.加载驱动
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//2.获取链接对象(已简化编写)
public static Connection getConn() throws SQLException {
return DriverManager.getConnection(URL,USER,PWD);
}
//3.关闭所有的资源
public static void closeAll(ResultSet rs,PreparedStatement pst,Connection conn) {
try {
if(rs != null) {
rs.close();
}
if(pst != null) {
pst.close();
}
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
二、第二个类 BaseDao :在该类中定义通用的 增删改查的方法(增删改共用一个方法,查询用一个方法)
package com.sdgy.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.sdgy.db.DB;
/**
* 这是一个通用的增删改查的类
*/
public class BaseDao {
Connection conn;
PreparedStatement pstm;
ResultSet rs;
//1.通用的 增、删、改
public boolean zsg(String sql,Object...obs) {
try {
conn = DB.getConn(); //获取连接对象
pstm = conn.prepareStatement(sql); //调用连接对象conn的prepareStatement方法,获取管理sql语句的对象
if(obs != null) { //根据可变参数,判断sql字符串中的问号,并对其进行赋值
for (int i = 0; i < obs.length; i++) {
pstm.setObject(i+1, obs[i]); //对sql语句中的问号进行赋值处理
}
}
int jg = pstm.executeUpdate(); //真正的执行数据库的操作,返回影响的记录行数
return jg>0; // 如果记录行数大于0,则返回 true
} catch (SQLException e) {
e.printStackTrace();
}finally {
DB.closeAll(rs, pstm, conn); //关闭所有的资源
}
return false;
}
//2.通用的 查询
public ResultSet cx(String sql,Object...obs){
try {
conn = DB.getConn(); //获取连接对象
pstm = conn.prepareStatement(sql);
if(obs != null) {
for (int i = 0; i < obs.length; i++) {
pstm.setObject(i+1, obs[i]);
}
}
return pstm.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
//注意:此时不还能关闭所有的资源!因为 rs 并没有包含所有的数据,而是指向了数据库中的第一行数据的前面,是一个指针。
return rs;
}
}
三、对于以上通用类的使用:
以操作学生表为例,需要编写一个操作学生表的类,这个类只需要继承 上面的 BaseDao 类即可
一般情况,会编写一个实体类与数据库的表记录的列一一对应,方便用该实体类的对象 保存数据库的一个记录
1、实体类:Student
package com.sdgy.pojo;
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
2、操作学生表的类,继承通用的 BaseDao 类
package com.sdgy.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.sdgy.db.DB;
import com.sdgy.pojo.Student;
public class DoStudent extends BaseDao{
//插入一个学生记录 调用通用的增删改方法 zsg
public boolean addStudent(Student stu) {
String sql = "insert into student values(?,?,?)";
return zsg(sql, stu.getId(),stu.getName(),stu.getAge());
}
//删除一个学生记录 调用通用的增删改方法 zsg
public boolean deleteStudent(int id) {
String sql = "delete from student where id=?";
return zsg(sql, id);
}
//查询所有学生记录,将查询到的结果放入List集合中
public List<Student> listAllStudent(){
List<Student> list = new ArrayList<Student>();
String sql = "select * from student";
rs = cx(sql); //调用通用的查询方法
try {
while(rs.next()) {
Student s = new Student();
s.setId(rs.getInt("id"));
s.setName(rs.getString("name"));
s.setAge(rs.getInt("age"));
list.add(s);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DB.closeAll(rs, pstm, conn); //对于查询,需要在这里进行关闭资源
}
return list;
}
}
四、测试: 在MyTest 中进行测试
package com.sdgy.ui;
import java.util.List;
import com.sdgy.dao.DoStudent;
import com.sdgy.pojo.Student;
public class MyTest {
public static void main(String[] args) {
DoStudent ds = new DoStudent();
//测试往数据库中插入数据
// Student s = new Student();
// s.setId(109);
// s.setName("bbb");
// s.setAge(10);
// boolean ad =ds.addStudent(s);
// if(ad) {
// System.out.println("往数据表中插入数据成功!");
// }
//测试删除一个数据
// boolean bo = ds.deleteStudent(101);
// if(bo) {
// System.out.println("删除成功!");
// }
//测试查询:
List<Student> ls = ds.listAllStudent();
for (int i = 0; i < ls.size(); i++) {
System.out.println(ls.get(i));
}
}
}