JDBC_JAVA数据库连接

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

	}

}

上一篇:JavaScript正则表达式cookie.replace(/^\s+|\s+$/g, '');什么意思?


下一篇:tiptap 编辑器显示源码