java执行sql语句修改_猫哥带你去战斗——Java Web开发——Java篇[9]——使用SQL语句实现增删改查...

前一篇已经演示了如何连接数据库,因为连接数据库这个活,经常要干,所以不如直接成立一个类,专门处理数据库方面的事情,比较省心,话不多说,上例子,话都在注释里。

import java.sql.*;//导入数据库相关类库

/**

* MysqlHandler MySQL数据库管理类

* @author 猫哥

* @date 2016.12.31

*/

public class MysqlHandler{

//三个必备属性

private Connection conn = null;//Connection表示跟数据库的连接,这个很好理解。你每一次打电话都要通了之后才行,你每一次连接数据库都要连接了才行

private Statement stmt = null;//Java连接了数据库之后,要对数据库进行什么操作?需要告诉数据库哪些参数?这些信息都依赖于Statement

private ResultSet rs = null;//如果是从数据库查询数据,可以把返回的数据放在ResultSet里面

//首先第一步,需要跟数据库建立连接

public Connection buildConnection() {

String driver = "com.mysql.jdbc.Driver";//MySQL数据库的驱动程序名

String url = "jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf-8";//数据库连接字符串

String user = "root";//用户名

String password = "Pass1234";//密码

try{

Class.forName(driver);//加载驱动程序

conn=DriverManager.getConnection(url,user,password);//输入必备参数,获取连接

}

catch(Exception ex){

ex.printStackTrace();//可以输出比较详细的异常信息

}

return conn;

}

//第二步,“增删改查”中,增、删、改都是执行sql语句,无需返回ResultSet结果集,所以设置为一个方法

public int execute(String sql){

try {

if(stmt==null)//创建Statement

stmt=conn.createStatement();

int affectedCount = stmt.executeUpdate(sql);//此处真正执行stmt定义的操作

return affectedCount;//这个是收到影响的行数

} catch (Exception ex) {

ex.printStackTrace();

return -1;//返回-1,表示执行失败了,有异常

}

}

//第二步,如果是查询,需返回结果集

public ResultSet query(String sql){

try {

if(stmt==null)//创建Statement

stmt=conn.createStatement();

rs = stmt.executeQuery(sql);//执行pstmt中定义的查询

return rs;//将结果集返回

} catch (Exception ex) {

ex.printStackTrace();

return null;//如果有错误,返回null

}

}

//第四步,之前建立了和数据库的连接,要知道数据库的连接是有限的,用完了必须释放,不然咱一个程序占人家20个连接,太浪费了

public void sayGoodbye(){

//此处注意,不要用一个try{}把三个.close()都包含起来,如果第一个就异常了,后面即使不异常也关闭不了,对吧

if(rs!=null){//关闭结果集,这个不关闭也浪费

try {

rs.close();

} catch (Exception ex) {

ex.printStackTrace();

}

}

if(stmt!=null){//关闭Statement,不要浪费

try {

stmt.close();

} catch (Exception ex) {

ex.printStackTrace();

}

}

if(conn!=null){//关闭连接

try {

conn.close();

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

}

好了,现在来演示下如何使用这个类实现student_info表的增删改查

import java.sql.*;

public class TestMysql {//测试MysqlHandler类

public static void main(String[] args) {

try {//捕获异常

testOneTime();

} catch (SQLException e) {

e.printStackTrace();

}

}

//测试一次完整的增删改查操作

private static void testOneTime()throws SQLException{//可能会有异常,我们在更广阔的天地捕获之

MysqlHandler hand=new MysqlHandler();

Connection con=hand.buildConnection();//建立连接

ResultSet rs;//可以使用多次

//查

rs=hand.query("select * from student_info");

//展示结果

System.out.println("\n查询结果如下:");

while(rs.next()){

System.out.print(rs.getInt(1) + "|");

System.out.print(rs.getString(2) + "\t");

}

//增加2个

int addCount=hand.execute("insert into student_info (student_name) values('火星人'),('水星人')");

System.out.println("\n增加了"+addCount+"个");

//删除一个

int delCount=hand.execute("delete from student_info where student_name='张三'");

System.out.println("\n删除了"+delCount+"个");

//修改一个,把李四改造成火星人

int changeCount=hand.execute("update student_info set student_name='火星人李四' where student_name='李四'");

System.out.println("\n修改了"+changeCount+"个");

//查

rs=hand.query("select * from student_info");

System.out.println("\n查询结果如下:");

while(rs.next()){

System.out.print(rs.getInt(1) + "|");

System.out.print(rs.getString(2) + "\t");

}

hand.sayGoodbye();//千万别忘了关闭

}

}

测试结果:

查询结果如下:

1|张三 2|李四 3|王五

增加了2个

删除了1个

修改了1个

查询结果如下:

2|火星人李四 3|王五 4|火星人 5|水星人

再运行一次,结果:

查询结果如下:

2|火星人李四 3|王五 4|火星人 5|水星人

增加了2个

删除了0个

修改了0个

查询结果如下:

2|火星人李四 3|王五 4|火星人 5|水星人 6|火星人 7|水星人

结果是不错的,这样我们依赖原生态的SQL语言,实现了对student_info表的操作。而且正题语言是比较干净整洁的。但是很没有意思,接下来我们来做个测试。

首先我们测试执行100次查询操作需要多少时间,将测试类修改如下:

import java.sql.*;

public class TestMysql {//测试MysqlHandler类

public static void main(String[] args) {

try {//捕获异常

long start=System.currentTimeMillis();//产生一个当前的毫秒(自1970年1月1日0时起的毫秒数)

for(int i=0;i<100;i++){//***此处控制测试次数***

testOneTime();

}

long end=System.currentTimeMillis();

System.out.println("\n消耗时间:"+(end-start)+"毫秒");

} catch (SQLException e) {

e.printStackTrace();

}

}

//测试一次完整查询

private static void testOneTime()throws SQLException{//可能会有异常,我们在更广阔的天地捕获之

MysqlHandler hand=new MysqlHandler();

Connection con=hand.buildConnection();//建立连接

ResultSet rs;//可以使用多次

//查

rs=hand.query("select * from student_info");

hand.sayGoodbye();//千万别忘了关闭

}

}

好的,我们运行几次,发现消耗的时间是不固定的,但是大致有个波动范围,这个跟计算机、数据库状态相关,可以理解。

猫哥分别测了几组数据如下:执行一百次:889、856。

如果修改如下,同样执行100次,耗费时间48、48、46。

import java.sql.*;

public class TestMysql {//测试MysqlHandler类

public static MysqlHandler hand=new MysqlHandler();

public static Connection con=hand.buildConnection();//建立连接

public static ResultSet rs;//可以使用多次

public static void main(String[] args) {

try {//捕获异常

long start=System.currentTimeMillis();//产生一个当前的毫秒(自1970年1月1日0时起的毫秒数)

for(int i=0;i<1;i++){

testOneTime();

}

hand.sayGoodbye();//千万别忘了关闭

long end=System.currentTimeMillis();

System.out.println("\n消耗时间:"+(end-start)+"毫秒");

} catch (SQLException e) {

e.printStackTrace();

}

}

//测试一次完整查询

private static void testOneTime()throws SQLException{//可能会有异常,我们在更广阔的天地捕获之

//查

rs=hand.query("select * from student_info");

}

}

OK,快是快了,但是,可以这么用吗,static变量的真正含义是什么,且听下回分解。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值