JDK6笔记(5)----JDBC4(2)

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1555630 JDK6笔记(5)----JDBC4(2)1、理解Statements有三种类型的Statements:1)Statements接口它通常用于只需不带参数的SQL语句。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1555630

JDK6笔记(5)----JDBC4(2)


1、理解Statements
有三种类型的Statements:
1)Statements接口
它通常用于只需不带参数的SQL语句。
2)PreparedStatement
预准备语句是从Statement接口中继承的;PreparedStatement对象在你需要提前建立和编译SQL语句时非常有用。
PreparedStatement对象还接受IN参数,后面将详述它。
3)CallableStatement
CallableStatement是从预准备语句中继承的,并且接受IN和OUT参数。
CallableStatement的主要用途是用于执行数据库存储过程。
2、研究Statement接口
Statement对象通常用于执行普通SQL语句调用,前提是已建立一个连接并且Connection对象存在。
如:
Connection cConn=dsDataSource.getConnection("username","password");
Statement sStatement=cConn.createStatement();
//Execute the following SQL query
ResultSet rsResults=sStatement.executeQuery("SELECT * FROM PLAYBOYS");
while(rsResults.next()){
 //Perform operations
}
有以下的方法:
boolean execute(String sql);
boolean execute(String sql, int autoGenKeys);
boolean execute(String sql, int[] columnIndexes);
boolean execute(String sql, String[] columnNames);
int[] executeBatch(); //执行成批的数据库命令,返回更新计算的数组
ResultSet executeQuery(String sql);
int executeUpdate(String sql, int autoGeneratedKeys);
int executeUpdate(String sql, int[] columnIndexes);
int executeUpdate(String sql, String[] columnNames);
总的来说,只有在SQL语句是静态的时候才使用statements。如果含参数,你应该使用预准备语句接口,见下面。
3、PreparedStatement Interface
当你要多次执行SQL语句时,预准备语句是你极好的选择。它提高了程序的efficiency和performance。
PreparedStatement是Statement接口的子类,因此它继承了上面所列的各种方法。
当使用PreparedStatement对象的execute()方法时,你最好不要尝试传递参数到execute()、executeQuery()、executeUpdate()方法中。
1)设置IN参数
PreparedStatement对象向开发者提供了用于SQL语句的内嵌的IN参数。
无论在SQL语句的哪个地方,在PreparedStatement语句执行前,只要IN参数出现了,你都必须在你的应用程序中向IN参数填入一个值。填值使用适当的setter方法。如下:
(1)void setBoolean(int paramIndex, boolean x);
设置IN参数为一个布尔值;
(2)void setDate(int paramIndex, Date x);
设置IN参数为java.sql.Date值;
(3)void setDouble(int paramIndex, double x);
(4)void setFloat(int paramIndex, float x);
(5)void setInt(int paramIndex, int x);
(6)void setLong(int paramIndex, long x);
(7)void setString(int paramIndex, String x);
(8)void clearParameters();
清除通过setter方法设置的参数值的集。
预准备语句接口的典型用法如下:
一个名为CAR的表,定义如下:
CREATE TABLE CAR(
 ID INTEGER NOT NULL,
 MODEL VARCHAR(28),
 MODEL_YEAR VARCHAR(10)
 );
相一致的CAR类如下:
public class Car{
 Long id;
 String model;
 String year;
 //set 和 get 方法
 }
下面,创建一个执行查询的方法,返回匹配你的选择条件的cars集。
public Collection<Car> getAllCars(String year){
 Collection<Car> cars=new ArrayList<Car>();
 Connection con=null;
 PreparedStatement stmt=null;
 ResultSet rs=null;
 try{
  String url="jdbc:derby://localhost:9527/mydb;create=true";
  con=DriverManager.getConnection(url,"sa","password");
  String sql="SELECT ID,MODEL,MODEL_YEAR FROM CAR WHERE MODEL_YEAR=?";
  stmt=con.prepareStatement(sql);
  stmt.setString(1,year);
  rs=stmt.executeQuery();
把结果保存到对象集中。
while(rs.next()){
 System.out.println("result");
 Car car=new Car();
 long id=rs.getLong("ID");
 String model=rs.getString("MODEL");
 String modelyear=rs.getString("MODEL_YEAR");

 car.setID(id);
 car.setModel(model);
 car.setYear(modelyear);
 cars.add(car);
 }
}catch(SQLException e){}
在JDBC4.0中,你可以通过exception chain(例外链)来浏览:
while(ex!=null){
 System.out.println("SQLState:"+ex.getSQLState());
 System.out.println("Error Code:"+ex.getErrorCode());
 System.out.println("Message:"+ex.getMessage());
 Throwable t=ex.getCause();
 while(t!=null){
  System.out.println("Cause:"+t);
  t=t.getCause();
  }
 ex=ex.getNextException();
 }
最后是重要的一点,关闭ResultSet,Statement,Connection。
}finally{
 try{
  if(rs!=null) rs.close();
  if(stmt!=null) stmt.close();
  if(con!=null) con.close();
 }catch(SQLException e){}
 }
 return cars;
}
总结:上面的代码有很多冗余,在下一节我将讨论两种减少重复代码的方法:Annotation和Hibernate。
 

目录
相关文章
|
1月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
48 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
6月前
|
Java
JDK动态代理笔记整理
JDK动态代理笔记整理
|
Java 程序员
终于不慌内卷了,多亏阿里内部的并发图册+JDK源码速成笔记
并发编程 Java并发在近几年的面试里面可以说是面试热点,每个面试官面试的时候都会跟你扯一下并发,甚至是高并发。面试前你不仅得需要弄清楚的是什么是并发,还得搞清什么是高并发! 在这里很多小白朋友就会很疑惑:我工作又不用,为啥面试总是问?真就内卷卷我呗!(手动狗头)互联网内卷已经是现在的行业趋势,而且是不可逆的,这个大家也知道;但LZ要说的是,虽然简单地增删改查并不需要并发的知识,但是业务稍微复杂一点,你的技术水平稍微提升一点的话你就会知道,并发是我们Java程序员绕不开的一道坎。
50 0
Alibaba新产:“Java并发笔记”闪耀来袭,JDK源码奥义尽在其中
JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码
并发编程这四个字想必大家最近都在网上看到过有很多的帖子在讨论。我们都知道并发编程可选择的方式有多进程、多线程和多协程。在Java中,并发就是多线程模式。而多线程编程也一直是一个被广泛而深入讨论的领域。如果遇到复杂的多线程编程场景,大多数情况下我们就需要站在巨人的肩膀上利用并发编程框架——JDK Concurrent包来解决相关线程问题。
|
Java 开发者 容器
先到先学!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)
作为Java开发者,面试肯定被问过多线程。对于它,大多数好兄弟面试前都是看看八股文背背面试题以为就OK了;殊不知现在的面试官都是针对一个点往深了问,你要是不懂其中原理,面试就挂了。可能你知道什么是进程什么是线程,但面试官要是问你进程之间是如何通讯的?ConcurrentHashMap 和 HashTable有什么区别?为什么wait和notify方法要在同步块代码中调用?你答不上来就只能等通知了。。。
|
Java Linux
【笔记03】CentOS 安装 jdk
(1) 创建 softwarezgq 目录,用于存放软件安装包
142 0
【笔记03】CentOS 安装 jdk
|
SQL Java 数据库连接
JDK6笔记(5)----JDBC4
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1554793 JDK6...
997 0
|
SQL Java 数据库连接
JDK6笔记(5)----JDBC4(3)
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1556016 JDK6笔记(5)----JDBC4(3) 1、预准备语句的IN参数的pitfall当你用setter方法向IN参数传递值时要注意一些问题。
785 0
|
SQL Java 数据库连接
JDK6笔记(5)----JDBC4(4)
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/1556449 JDK6笔记(5)----JDBC4(4) 1、利用批处理更新要提高性能,JDBC API提供了一个批处理更新方式,它允许你一次进行多种更新。
776 0