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()); } } }