首先说下我就一个菜鸡,只是记录下自己的学习过程,大佬们无视我就好。。。
---------------------------------------------------------------------------------------------------------
今天学习了JDBC,下午就做了一个经典的增删改查的案例,教务管理系统
自己也试着封装了一下,面向对象思想嘛
原来一直用的eclipse,直到今天接触到idea才知道啥叫真正的好用,但对于idea还是比较陌生,还得摸索一段时间。
这边就只记录我在进行数据库连接时产生的一些问题,其他的都太简单了,没有记录必要。
关于JDBC我单独写了一个类,先贴上我最开始写的一个版本
package org.lanqiao.jwgl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Jdbc { static String url = "jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8"; static String user = "root"; static String pwd = "123456"; //连接数据库,并返回连接对象 public static void connetcDatabase() throws Exception { //导入驱动类 Class.forName("com.mysql.jdbc.Driver"); //创建连接对象 Connection conn = DriverManager.getConnection(url,user,pwd); //返回连接对象 return conn; } //数据库查询操作 public static ResultSet executeQueryDatabase(String sql) throws Exception { //调用连接数据库方法连接数据库 Connection conn = connetcDatabase(); //创建命令行 Statement stt = conn.createStatement(); //执行sql语句 ResultSet result = stt.executeQuery(sql); //关闭数据库连接 conn.close(); stt.close(); //返回操作结果 return result; } //数据库增删改操作 public static int executeUpdateDatabase(String sql) throws Exception { //调用连接数据库方法连接数据库 Connection conn = connetcDatabase(); //创建命令行 Statement stt = conn.createStatement(); //执行sql语句 int line = stt.executeUpdate(sql); //关闭数据库连接 conn.close(); stt.close(); //返回影响行数 return line; } }
这样写的话,增删改没啥问题,都能正常操作,但唯独查询的时候报异常了
Operation not allowed after ResultSet closed
后来百度查询了一番,发现是因为在result进行遍历操作之前就把数据库连接给关闭了
就下面这段代码
//数据库查询操作 public static ResultSet executeQueryDatabase(String sql) throws Exception { //调用连接数据库方法连接数据库 Connection conn = connetcDatabase(); //创建命令行 Statement stt = conn.createStatement(); //执行sql语句 ResultSet result = stt.executeQuery(sql); //就是下面这段的锅,导致在返回操作结果进行遍历之前关闭了数据库连接 conn.close(); stt.close(); //返回操作结果 return result; }
后来左思右想,我干脆把Connection和Statement对象都创建成全局的,然后单独写个关闭数据库的方法
//关闭数据库连接 public static void closeDatabase() throws Exception { //关闭数据库连接 conn.close(); stt.close(); }
然后每次增删改查操作后都调用这个方法关闭数据库连接,这样就解决了
然后其它的问题倒是没出现,最后贴上没有任何问题的代码
package org.lanqiao.jwgl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Jdbc { static String url = "jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8"; static String user = "root"; static String pwd = "123456"; //定义成全局变量方便关闭 static Connection conn; static Statement stt; //连接数据库 public static void connetcDatabase() throws Exception { //导入驱动类 Class.forName("com.mysql.jdbc.Driver"); //创建连接对象 conn = DriverManager.getConnection(url,user,pwd); } //数据库查询操作 public static ResultSet executeQueryDatabase(String sql) throws Exception { //调用连接数据库方法连接数据库 connetcDatabase(); //创建命令行 stt = conn.createStatement(); //执行sql语句 ResultSet result = stt.executeQuery(sql); //返回操作结果 return result; } //数据库增删改操作 public static int executeUpdateDatabase(String sql) throws Exception { //调用连接数据库方法连接数据库 connetcDatabase(); //创建命令行 stt = conn.createStatement(); //执行sql语句 int line = stt.executeUpdate(sql); //返回影响行数 return line; } //关闭数据库连接 public static void closeDatabase() throws Exception { //关闭数据库连接 conn.close(); stt.close(); } }
最后提一下,idea导出jar包是真蛋疼,开始导出一个,运行报错误,jar包损坏
再查了许久的资料后,发现选择jar后不要选择那个Empty,而是选另外一个,但是也得和mysql架包放在一起才能运行
第一次用idea不太熟练,希望有大佬知道如何正确导出jar包,还望指出,万分感谢!!!