jdbc002:优化jdbc传输

我们发现,jdbc传输的时候,万一有异常怎么办?上一篇我们没有解决这个问题,那么现在我们就要把这个问题给解决了。

package com.zhang.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test1 {

	public static void main(String[] args) throws Exception{
		Connection con=null;
		ResultSet rs=null;
		Statement st=null;
		//要把他们三个定义在外面,如果在里面,调用不了close
		try {
			Class.forName("com.mysql.jdbc.Driver");
			con=DriverManager.getConnection("jdbc:mysql://localhost:3306/kk","root","123456");
			st=con.createStatement();
			String sql="select * from userinfo";
			boolean b=st.execute(sql);
			//如果有结果集返回就是true,否则就是false,增删改都是false,查询是true,及时没查到数据,但是也有结果集返回
			rs=st.getResultSet();
			System.out.println("uid"+"\t"+"uname");
			while(rs.next()){
				System.out.println(rs.getObject(1)+"\t"+rs.getObject(2));
				//如果整句话出错了,抛出运行时异常,并且关闭通道,给其他的连接腾出空间
			}
		} catch (Exception e) {
			
			throw new RuntimeException(e);
		}finally{
			try {
				rs.close();
				//如果关闭接收路径时出错,就要捕获异常,保证其能被关掉
			} catch (Exception e2) {
				throw new RuntimeException(e2);
			}finally{
				try {
					st.close();
					//如果关闭车出错了,就要捕获异常,保证其能被关掉
				} catch (Exception e3) {
					throw new RuntimeException(e3);
				}finally{
					con.close();
					//在这不需要再捕获异常了,因为最后的finally一定会被执行
				}	
			}
		}
		System.out.println("over");
	}

}


由此我们可以看出java编程要有多严谨,一旦出错,就要给其他人腾出空间,不能老是占着,让其他人连接不上数据库。
如果出现了以下问题,想都不要想,是你的连接出错了,查看IP地址对着没,查看端口号对着没,查看账号密码对着没,查看单词拼对着没。
在这里插入图片描述
二,发现查都这么麻烦,还有增删改,不能每做一次操作,就要写一次代码,这样大大降低了工作效率。所以我们可以把它封装成方法,用的时候直接调用。
1,先定义一个jdbc,连接,搭桥,造车,需要用到它的时候直接调用。

package com.z.user;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Jdbc {
private static String driver="com.mysql.jdbc.Driver";//调jdbc
private static String url="jdbc:mysql://localhost:3306/ss";//连接MySQL
private static String user="root";//账号
private static String pwd="";//密码
private static Jdbc utils;//??????
//*******************************************
private Jdbc(){}//构造器私有化,单例模式,给外界唯一的
//一份实例化对象
//*******************************************
public static Jdbc getInstance(){
	//***getinstance动态实例化,用于单例模式
	if(utils==null){//如果Jdbc没有被实例化
	synchronized (Jdbc.class) {
	//此处用到双重上锁机制	
		if(utils==null){
			utils=new Jdbc();
		}
	}
	}
	return utils;
}
//************使用静态代码块,代表只加载一次,并且保证程序开始的时候,
//它先被执行
static{
	//加载驱动,重量级的资源只需要加载一次
	try {
		Class.forName(driver);
		//私有的driver往这里传,加载
	} catch (ClassNotFoundException e) {
		throw new ExceptionInInitializerError();
		//***如果没有被初始化,抛出初始化错误异常错误
	}
}
//***************************************************
//******连接
public static Connection getConnection() throws SQLException{
	
	
	return DriverManager.getConnection(url,user,pwd);
		//在这里传入MySQL地址,账号,密码	
	
}
//****************************************************
//连接完了后,关掉三个流,保证其他人也可以连接上
public static void close(ResultSet rs,Statement st,Connection con) throws SQLException{
	try {
		if(rs!=null) rs.close();
	} catch (Exception e) {
		throw new RuntimeException(e);
	}finally{
		try {
			if(st!=null) st.close();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}finally{
			if(con!=null) {
				con.close();
			}
		}
	}
}
}


2,设计增删改查,需要的时候直接调用

package com.z.user;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.z.user.User;

public class Dao {

	//***********************************************增
	public void insert(User info) throws SQLException{
		System.out.println(info.getPname());
		System.out.println(info);
		//打开链接
		Connection con=Jdbc.getConnection();
		Statement st=con.createStatement();
		//**传,getname就是前面user的getname
		String sql="insert into person values(null,'"+info.getPname()+"')";
		st.execute(sql);
		System.out.println(sql);
		//关闭链接s
		Jdbc.close(null, st, con);
		//此处没有用到接收查询到的数据,所以rs不用关,直接写成null
		System.out.println("增加用户成功");
		
	}
	//*****************************************************删
	//************根据传入的编号删除
	public void delete(int pid) throws SQLException{
		Connection con=Jdbc.getConnection();
		Statement st=con.createStatement();
		String sql="delete from person where pid="+pid+"";
		st.execute(sql);
		Jdbc.close(null, st, con);
		System.out.println("删除用户成功");
	}
	//*********************************************************改
	//***这里接收两个参数,一个修改前的,一个修改后的
	public void update(User info,User info1) throws SQLException{
		Connection con=Jdbc.getConnection();
		Statement st=con.createStatement();
		String sql="update person set pname='"+info1.getPname()+"' where pid="+info.getPid()+"";
		st.execute(sql);
		Jdbc.close(null, st, con);
		System.out.println("修改用户成功");
	}
	//************************************************************查一个
	//*********根据id查询
	public User getinfo(int pid) throws SQLException{
		Connection con=Jdbc.getConnection();
		Statement st=con.createStatement();
		st.execute("select * from person where pid="+pid+"");
		ResultSet rs=st.getResultSet();
		//*****接收
		User info=new User();
		if(rs.next()){
			int id=(int) rs.getObject(1);
			info.setPid(id);
			String name=(String) rs.getObject(2);
			info.setPname(name);
		}
		Jdbc.close(rs, st, con);
		return info;
	}
	//**********************************************************查全部
	public List<User> getAll() throws SQLException{
		Connection con=Jdbc.getConnection();
		Statement st=con.createStatement();
		st.execute("select * from person");
		ResultSet rs=st.getResultSet();
		List<User> list=new ArrayList<User>();
		while(rs.next()){
			User info=new User();
			int id=(int) rs.getObject(1);
			info.setPid(id);
			String name=(String) rs.getObject(2);
			info.setPname(name);
			list.add(info);
		}
		System.out.println(list);
		Jdbc.close(rs, st, con);
		con=null;
		return list;
	}

}

3,定义一个设置和获取信息的类

package com.z.user;
public class User {
//*******************
	//**设置和获取编号
private int pid;
private String pname;
public int getPid() {
	return pid;
}
public void setPid(int pid) {
	this.pid = pid;
}
public String getPname() {
	return pname;
}
public void setPname(String pname) {
	this.pname = pname;
}
@Override
public String toString() {
	return "User [pid=" + pid + ", pname=" + pname + "]";
}


//public int getPid(){
//	return pid;
//}
//public void setPid(
//		int pid){
//	this.pid=pid;
//}
********************
******设置和获取姓名
//
//public String getPname(){
//	return pname;
//}
//public void setPname(String name){
//	this.pname=pname;
//}
**********************
******重写tostring
//@Override
//public String toString() {
//	return "User [pid=" + pid + ", pname=" + pname + "]";
//}
}

4,测试类

package com.z.user;

import java.sql.SQLException;
import java.util.List;

import com.z.user.User;

public class Test {
	public static void main(String[] args) throws SQLException {
		Dao dao=new Dao();
		User info=new User();
		//***********************************增加
		//info.setPname("王五");
		//System.out.println(info);
		//dao.insert(info);
		//***********************************删除
		//dao.delete(18);
		//***********************************修改
//		info.setPname("张家辉");
//		info.setPid(3);
//		dao.update(dao.getinfo(3),info);
//		************************************查一个
//		System.out.println(dao.getinfo(3));
		//************************************查全部
		List<User> list=dao.getAll();
		for (User userinfo : list) {
			System.out.println(userinfo);
	}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值