DriverManager——Connection——Statement——ResultSet 不够完善的版本
1.连接,封装成类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
public class DBConnection {
String url="jdbc:mysql://localhost:3306/yinhang?charaterEncoding=UTF-8";
String user="root";
String password="";
//将Connection作为属性处理:Connection用做tcp建立,如果放在每个方法中,
//每次调用一个方法一次,就会使得每次访问都会进行一次tcp连接,效率低
private Connection conn=null;
//注册数据库的驱动
//加载驱动只需要加载一次——写作静态代码块
//每次新建一个MyDBConnecton类就只运行一次
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//构造函数
//创建连接和数据库连接对象
//每new一次连接一次,即每次新建一个connection时就有一次tcp连接
public DBConnection() {
try {//try/catch积极处理数据库连接不上的问题
//获取数据库连接
this.conn=DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功................");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//executeUpdate实现DML增删改查
//形参String sql,即sql语句
public int executeUpdate(String sql) {
//Statement是平台与数据库的桥梁——在cs之间传送命令,取回结果
//Statement 接口提供了执行语句和获取结果的基本方法
Statement stmt=null;
int m=0;
try {
stmt=conn.createStatement();
m=stmt.executeUpdate(sql);//executeUpdate(sql)的返回值是更新的条数
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(stmt!=null)
stmt.close();//释放资源
//Statement 对象将由 Java 垃圾收集程序自动关闭
//而作为一种好的编程风格,应在不需要 Statement对象时显式地关闭它们。
//这将立即释放 DBMS 资源,有助于避免潜在的内存问题。
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return m;
}
//executeQuery用于产生单个结果集的语句,例如 SELECT 语句。
//返回ResultSet
//不足:如果资源释放了,就不能返回ResultSet,
//因为ResultSet依赖Statement,如果Statement释放掉了,resultset就不能返回
public ResultSet executeQuery(String sql) {
Statement stmt=null;
ResultSet rs=null;//创建一个ResultSet对象,用来返回SQL查询结果
//ResultSet:由字节流转化成二维表。结果是一个二维表
try {//try catch 防止sql语句写错
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
/* 如果不注释掉,ResultSet就不能返回
* 但如果不释放,资源浪费。这时候可以参考executeQuery方法
try {
if(stmt!=null) stmt.close();
//tcp是双工通信,需要等待确认,如果不释放,就会占用tcp资源
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
}
return rs;
}
//可以做到资源释放
//但是这个arraylist要自己非常了解数据库信息
//针对性,没有普遍性
public ArrayList<Object[]> executeQuery2(String sql){
Statement stmt=null;
ResultSet rs=null;
ArrayList<Object[]> lists=new ArrayList<Object[]>();
try {
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
int cols=rs.getMetaData().getColumnCount();//获取查询结果的列数
//ResuleSet数据是一行一行的,next()读取
while(rs.next()) {
Object[] t=new Object[cols];//Object[]数组接收一行信息
for(int i=0;i<cols;i++)
t[i]=rs.getObject(i+1);
lists.add(t);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();//从下往上关闭
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return lists;
}
//orm:对象-关系映射(obj和sql语句的转换)
//接口回调——如果Student类实现了DBIO接口,并重写了里面的方法,
//当Student的实例化对象调用save函数时,student类实例进入save的形参
//即DBIO obj即Student stu
//在save调用DBIO的toSQL(),即是Student自己重写的toSQL()方法
//接口回调的好处——一个方法可以实现多个类
//实现插入
public boolean insert(DBIO obj) {
String sql=obj.toSQL();
return executeUpdate(sql)>0;//executeUpdate(String)是传址函数,插入,判>0
}
//实现查询
public ArrayList<Object> executeQuery3(String sql, DBIO obj) {
Statement stmt=null;
ResultSet rs=null;
ArrayList<Object> lists=new ArrayList<Object>();
try {
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
while(rs.next()) {
Object t=obj.toObject(rs);//orm
lists.add(t);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return lists;
}
}
2、DBIO接口
import java.sql.ResultSet;
public interface DBIO
{
String toSQL();//生成sql语句——各表类继承该接口,可以生成各自表的增删改查语句
Object toObject(ResultSet rs);//orm 将resultset转换成object
}
3、表封装成Student类
import java.sql.ResultSet;
import java.sql.SQLException;
public class Student implements DBIO
{
private String sno;
private String sname;
private String sex;
private String dept;
private String birth;
private Integer age;
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//重写Student表的插入sql语句
@Override
public String toSQL() {
StringBuffer sql=new StringBuffer(500);
sql.append("insert into student(sno,sname,sex,dept,birth,age)values('");
sql.append(this.sno).append("','").append(this.sname).append("','");
sql.append(this.sex).append("','").append(this.dept).append("','");
sql.append(this.birth).append("',").append(this.age);
sql.append(")");
return sql.toString();
}
@Override
public Object toObject(ResultSet rs) {
Student stu=null;
if(rs==null)
return null;
stu=new Student();
try {
stu.setSno(rs.getString("sno"));
stu.setSname(rs.getString("sname"));
stu.setSex(rs.getString("sex"));
stu.setDept(rs.getString("dept"));
stu.setBirth(rs.getString("birth"));
stu.setAge(rs.getInt("age"));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stu;
}
}
4、App_insert
public class AppStu {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu=new Student();
stu.setSno("s018");
stu.setSname("bbb");
stu.setSex("男");
stu.setDept("外语系");
stu.setBirth("2021-10-17");
stu.setAge(0);
System.out.println(stu.toSQL());
DBConnection dbcon=new DBConnection();//连接数据库
dbcon.insert(stu);//保存插入
}
}
5、App_query
public class AppQuery {
public static void main(String[] args) {
// TODO Auto-generated method stub
DBConnection dbcon=new DBConnection();
String sql="select * from student";
ArrayList<Object> lists=dbcon.executeQuery3(sql,new Student());
if(lists==null)
for(int i=0;i<lists.size();i++)
{
Student t=(Student)lists.get(i);
System.out.println("学号:"+t.getSno()+" 姓名:"+t.getSname()+" 性别:"+t.getSex());
}
}
}