JDBC基本操作(Statement,PreparedStatement,Connection,Transaction等)
来源:互联网 发布:美国反对美国 知乎 编辑:程序博客网 时间:2024/04/19 19:14
JDBC与数据库连接,查询
package jdbc;import java.sql.*;//数据库相关库public class TestJDBC { public static void main(String[] args) { final String DBDRIVER="org.mariadb.jdbc.Driver";//数据库连接驱动,对于每一种数据库都不一样 final String DBURL="jdbc:mariadb://localhost:3306/test";//数据库地址,3306是端口,test是数据库名 final String DBUSER="root";//数据库用户名 final String DBPASSWORD="root";//数据库密码 Connection conn=null;//数据库连接对象 Statement statement=null;//数据库SQL语言执行语句 ResultSet rs=null;//返回数据结果集合,包含着只想数据的指针 try { Class.forName(DBDRIVER);//反射机制初始化对象 conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);//设置数据库连接 statement=conn.createStatement();//statement创建 rs=statement.executeQuery("SELECT * from test1");//statement执行查询语句得到结果传递给rs,test1是表名,下同 while(rs.next()){//ResultSet指针初始指向在数据集第一行的前面,运用.next()方法依次向下查询 System.out.println(rs.getString("name"));//根据字段名获取数据,并以String类型存入内存 } } catch (ClassNotFoundException e) {//Driver对象创建时引入的错误抛出 e.printStackTrace(); }catch(SQLException e){//Connection对象创建时引入的错误抛出 e.printStackTrace(); }finally{//良好的变成习惯,在使用过数据库操作之后,将ResultSet,Statement,Connection对象都清空 try { if(rs!=null){ rs.close(); } if(statement!=null){ statement.close(); } if(conn!=null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }}
所有实验使用数据库如下:
JDBC插入数据
package jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class TestDML { public static void main(String[] args) { final String DBDRIVER="org.mariadb.jdbc.Driver"; final String DBURL="jdbc:mariadb://localhost:3306/test"; final String DBUSER="root"; final String DBPASSWORD="root"; Connection conn=null; Statement statement=null; ResultSet rs=null; try { Class.forName(DBDRIVER); conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); statement=conn.createStatement(); //和上一个唯一不同是这里使用的是插入操作 String sql="insert into test1 values (4,'James')";//手工写入完整SQL语句 statement.executeUpdate(sql);//statement执行SQL语句 } catch (ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try { if(rs!=null){ rs.close(); } if(statement!=null){ statement.close(); } if(conn!=null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }}
从传入参数获取数据的JDBC数据插入
package jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class TestDML2 { public static void main(String[] args) { if(args.length!=2){//程序输入参数判断 System.out.println("Parameter Error! Please input again!"); System.exit(-1); } int num=0; try{ num=Integer.parseInt(args[0]);//将第一个传入参数强制转换为Int类型存入num }catch(NumberFormatException e){//严谨编程,捕捉数据格式错误 e.printStackTrace(); System.out.println("Number Format Error"); System.exit(-1); } String name=args[1];//输入参数都是字符串,不需要再转换 final String DBDRIVER="org.mariadb.jdbc.Driver"; final String DBURL="jdbc:mariadb://localhost:3306/test"; final String DBUSER="root"; final String DBPASSWORD="root"; Connection conn=null; Statement statement=null; ResultSet rs=null; try { Class.forName(DBDRIVER); conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); statement=conn.createStatement(); //使用传入参数的方式,获取需要的插入的数据 //可以发现这种手工组合SQL语言的方式非常繁琐,容易出错 String sql="insert into test1 values ("+num+",'"+name+"')"; System.out.println(sql);//在调试的时候,可以将SQL语句输出进行检查,或者试验在数据库中执行 statement.executeUpdate(sql);//执行更新数据库 } catch (ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try { if(rs!=null){ rs.close(); } if(statement!=null){ statement.close(); } if(conn!=null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }}
JDBC预设语句PreparedStatement
package jdbc;import java.sql.*;public class TestPreparedStatement { public static void main(String[] args) { if(args.length!=2){ System.out.println("Paramenter Error, please input again!"); System.exit(-1); } int num=0; String name=null; try{ num=Integer.parseInt(args[0]); }catch(NumberFormatException e){ e.printStackTrace(); System.exit(-1); } name=args[1]; final String DBDRIVER="org.mariadb.jdbc.Driver"; final String DBURL="jdbc:mariadb://localhost:3306/test"; final String DBUSER="root"; final String DBPASSWORD="root"; Connection conn=null; PreparedStatement pStatement=null; try { Class.forName(DBDRIVER); conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); //上一个通过手工拼接SQL语句的操作非常的繁琐,有可以解决的方式 //使用PreparedStatement,预先设置好语句的格式,然后一次设置待定的参数 pStatement=conn.prepareStatement("insert into test1 values (?,?)");//?是两个待定的参数 pStatement.setInt(1, num);//将第一个?位置设置为num pStatement.setString(2, name);//将第二个?位置设置为name pStatement.executeUpdate();//执行操作 } catch (ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try { if(conn!=null){ pStatement.close(); conn.close(); } name=null; num=0; } catch (SQLException e) { e.printStackTrace(); } } }}
JDBC批量操作Batch
package jdbc;import java.sql.*;public class TestBatch { public static void main(String[] args) throws Exception{ //这个程序没有写像之前那么严谨的try/catch程序块,是为了更清晰地表现逻辑 Connection conn=null; PreparedStatement ps=null; Class.forName("org.mariadb.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mariadb://localhost:3306/test", "root", "root"); ps=conn.prepareStatement("insert into test1 values (?,?)"); //实际工程经常会有大量的数据增删改查,一条一条数据的操作自然不行 //需要批量的操作,JDBC中使用Batch ps.setInt(1, 3); ps.setString(2, "Iverson"); ps.addBatch();//将组装好的PreparedStatement存入Batch ps.setInt(1, 1); ps.setString(2, "McGrady"); ps.addBatch(); ps.setInt(1,3); ps.setString(2, "Wade"); ps.addBatch(); ps.executeBatch();//执行Batch,执行三条数据库插入 ps.close(); conn.close(); }}
JDBC事务
package jdbc;import java.sql.*;public class TestTransaction { public static void main(String[] args) { Connection conn=null; Statement statement=null; try { Class.forName("org.mariadb.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mariadb://localhost:3306/test", "root", "root"); //有些数据库操作时必须绑定起来进行的,例如账户转账,从一个账户中扣除,另一个账户中存入,两个操作必须同时成功,或者同时失败,否则会造成数据错误 //对于这种绑定在一起的数据库操作,称之为一个事务 //JDBC中,首先要设置连接不是自动提交的,默认状态是自动提交 conn.setAutoCommit(false);//可以把这句话注释掉,然后在下面其中一句插入语句中制造一点小错误,来试验效果 statement=conn.createStatement(); statement.addBatch("insert into test1 values (21,'Duncan')"); statement.addBatch("insert into test1 values (13,'Nash')"); statement.executeBatch();//执行Batch //注释与不注释实验看区别 conn.commit();//提交事务 conn.setAutoCommit(true);//事务执行完,将自动提交设置为true } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); try { if(conn!=null){ conn.rollback(); conn.setAutoCommit(true); } } catch (SQLException e1) { e1.printStackTrace(); } }finally{ try { if(statement!=null){ statement.close(); statement=null; } if(conn!=null){ conn.close(); conn=null; } } catch (SQLException e) { e.printStackTrace(); } } }}
JDBC处理可滚动的数据结果集
package jdbc;import java.sql.*;public class TestScroll { public static void main(String[] args) { Connection conn=null; Statement statement=null; ResultSet rs=null; try { Class.forName("org.mariadb.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mariadb://localhost:3306/test", "root", "root"); //http://www.cnblogs.com/bukudekong/archive/2011/06/22/2086528.html statement=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); //设置回滚模式,回滚模式,不仅可以使用.next()进行数据轮询,还可以使用以下功能,实现更灵活的数据结果操作 rs=statement.executeQuery("select * from test1"); rs.next(); System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); rs.last();//最后一行 System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); System.out.println(rs.isLast());//是否是最后一行 System.out.println(rs.isAfterLast());//是否在最后一行之后 System.out.println(rs.getRow());//当前行数 rs.previous();//前一行 System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); System.out.println(rs.isLast()); System.out.println(rs.getRow());//当前行数 rs.absolute(6);//绝对位置,第6行 System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); rs.first();//第一行 System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); System.out.println(rs.isFirst()); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try { if(rs!=null){ rs.close(); rs=null; } if(statement!=null){ statement.close(); statement=null; } if(conn!=null){ conn.close(); conn=null; } } catch (SQLException e) { e.printStackTrace(); } } }}
JDBC处理可更新的数据集
package jdbc;import java.sql.*;public class TestUpdatetable { public static void main(String[] args) { Connection conn=null; Statement statement=null; ResultSet rs=null; try { Class.forName("org.mariadb.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mariadb://localhost:3306/test", "root", "root"); //http://www.cnblogs.com/bukudekong/archive/2011/06/22/2086528.html statement=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); rs=statement.executeQuery("select * from test1"); //updatetable可以使java逻辑和数据库实时关联,不需要提交就可以实时更改数据 //但这需要数据库驱动支持CONCUR_UPDATABLE模式 //但貌似并不是所有数据库都支持,mariadb貌似不支持 //猜想应该是处于安全性的考虑,大的自由度也带来了较大的风险 rs.next(); rs.updateInt("id", 8); rs.updateRow();//更新行数据 }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try { if(rs!=null){ rs.close(); rs=null; } if(statement!=null){ statement.close(); statement=null; } if(conn!=null){ conn.close(); conn=null; } } catch (SQLException e) { e.printStackTrace(); } } }}
本文是参考尚学堂马士兵的JDBC教学视频编写得来,讲得很清楚,适合初学。
0 0
- JDBC基本操作(Statement,PreparedStatement,Connection,Transaction等)
- JDBC——Connection,Statement,PreparedStatement,CallableStatement
- JDBC——Connection,Statement,PreparedStatement,CallableStatement
- jdbc preparedStatement和statement,resultset等区分
- jdbc preparedStatement和statement,resultset等区分
- JDBC基础(二) 利用Statement/PreparedStatement 操作数据库
- java jdbc(二)各接口介绍--Connection,Statement,ResultSet,PreparedStatement,ResultSetMetaData,DatabaseMetaDa
- JDBC主要接口DirverManager、Connection、Statement、PreparedStatement、ResultSet的简介
- JDBC主要接口DirverManager、Connection、Statement、PreparedStatement、ResultSet的简介
- JAVA-21-JDBC讲解,Driver、Connection、Statement、PreparedStatement、CallableStatement、ResultSet
- JDBC statement与preparedStatement
- jdbc PreparedStatement Statement 比较
- JDBC PreparedStatement & Statement
- JDBC中操作数据库的三个对象:Statement;PreparedStatement;CallableStatement
- JDBC: Statement、PreparedStatement和CallableStatement
- JDBC之Statement与preparedStatement
- Jdbc中的Statement 和PreparedStatement
- JDBC中的Statement和PreparedStatement
- 天天爱跑步
- Codeforces 734E. Anton and Tree By Assassin 缩点+树的最大直径
- 计算机中的定点和浮点表示
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
- ural 1881
- JDBC基本操作(Statement,PreparedStatement,Connection,Transaction等)
- nginx源代码分析 - 启动(八) 避免epoll_wait惊群
- react-redux 之 connect 方法详解
- Swift3.0后Alamofire报错的解决方法
- 51nod算法马拉松20总结
- POI按照模板导出Excel数据
- 串口结构体halUARTCfg_t 、halUARTBufControl_t
- logstash date插件
- 产品结构设计指导总纲VI