Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程。尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了。
这些参数本来可以是在调用的时候再给的。以前学习过将工具类和测试类分开写的好处,下面就介绍数据库的工具类,它可以避免代码的臃肿的缺点。学会自己写一个数据库工具类,方便以后直接用。关键还是学会其中的编写思路。
一、创建数据库工具类
创建工具类的内容:
1.私有化构造方法
(防止别人欠欠new本类实例,也就是说这段程序也不是单例模式,工具运行时一个实例都没有)
2.工具类里面有得到连接的方法
3.工具类里面有关闭资源的方法
4.工具类里面有注册驱动类
二、创建数据库工具类具体操作及注意事项
1.私有化构造方法
public class DBUtil { // 私有化构造方法 private DBUtil() { } }
2.工具类里面有得到连接的方法
//得到連接(Connection需导包) public static Connection getConn(){ //return null;(先这样顶一下,不然编译器会报错) try { Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/t_employee","root","root"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
注意:当有执行语句之后,return null;要放在执行语句的后面。这个错误我找了3分钟。
public static Connection getConn(){ try { Connection conn=DriverManager.getConnection(url,user,password);//注意:这里就不要加双引号了。 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
升级版代码:
public static Connection getConn(){ Connection conn=null; try { conn=DriverManager.getConnection(url,user,password); } catch (SQLException e) { //这里异常可以按照需求再设置一下,将问题反馈给用户 throw new RuntimeException("获取连接失败"); } return null; }
注意:
在getConnection中,三个参数(url,用户名、密码)都写死了,不是很使用。解决:可以在前面声明)。另外,考虑到在public static Connection getConn(){}这个静态的方发里,静态方法不可以访问实例对象成员,所以,在前面声明三个参数的时候,都要加上static修饰(static写在private的左边或者右边,都可以。编译器不会不报错)。
private static String url=""; private static String user=""; private static String password="";
Connection conn=DriverManager.getConnection(url,user,password);
3.工具类里面有关闭资源的方法
public static void close(ResultSet rs, Statement stm, Connection conn) { if (rs != null) { try { rs.close(); } catch (Exception e) { e.printStackTrace(); } } if (stm != null) { try { stm.close(); } catch (Exception e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
4.工具类里面有注册驱动类
一般来说,驱动类可以写在private DBUtil(){}这个构造方发里,但是,这个构造方法在创建时的初衷是为了不让别人new本类实例,驱动加载这里,就违背了这一点。
在写注册驱动类时,考虑把它写在单独的静态代码块里面。
好处:静态代码块只加载一次!!!恰好符合驱动类只需加载一次的特性。
static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
注意:"com.mysql.jdbc.Driver"又是写死的状态,不实用。解决办法——在前面声明。
private static String className="";
static{ try { Class.forName(className); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
注意:
在加载驱动类的时候,如果忘记加jar包,就会抛出如下的异常。(这种错误很常见!)
Could not initialize class.DBUtil
三、测试类就会变得很轻盈
import java.sql.Connection; import java.sql.Statement; public class TestDemo { public static void main(String[] args) { add(); } static void add() { Connection conn = null; Statement stm = null; try { conn = DBUtil.getConn(); stm = conn.createStatement(); String sql = "insert into t_employee(name,age,salary) values('阿三',23,90000)"; // 切记:阿三要用单引号!!! stm.executeQuery(sql); System.out.println("执行成功");// 加一句,打印到控制台,验证程序没挂 } catch (Exception e) { e.printStackTrace(); } finally { DBUtil.close(null, stm, conn); // 第一个参数rs会报错:rs cannot be resolved to a variable,这里用null顶一下。 } } }
注意:下面这条代码
stm.executeQuery(sql);
当上面的add(){}被设置为void(无返回值)即,static void add(){}时,用stm.executeQuery(sql);
当上面的add(){}被设置为有返回值时,比如static add(){}时,用stm.executeQueryUpdate(sql);