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