Statement实现数据查询操作
在整个数据库的开发过程之中数据的查询操作是最复杂的,因为查询会牵扯到各种复杂查询的管理,例如:多表查询、子查询、统计查询、集合操作等等,但是从现代的开发来讲,对于数据的查询如果非必须的情况下建议以简单查询为主,在Statement接口里面所定义的数据查询方法如下:
ResultSet executeQuery(String sql) throws SQLException
这个查询方法会直接返回有一个ResultSet接口的对象实例,这样就可以得到如下的完整的数据库操作的接口关联。

在执行的过程之中由Statement接口的对象实例向数据库发出一条查询指令,随后这个数据库的查询返回的结果会自动通过ResultSet接口对象实例进行包装,这些数据就被加载到内存之中了。如果此时数据查询返回的结果过多的话,那么就会造成JVM的内存占用率过高,从而导致程序有可能出现内存溢出的问题。

如果要想通过ResultSet 获取数据直接使用getXxx()方法即可, 其中“Xxx”对应的是不同的数据类型,例如: getLong()、getString()、getDate()等。
范例:实现数据查询
import java.sql.*;
public class JDBCDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
Statement statement = connection.createStatement(); //创建数据库的操作对象
//sql插入字段代码,在以后填写sql语句时如果需要换行,最佳的做法是在前后多加一个空格
String sql = "SELECT uid,name,age,birthday,salary,note FROM user";
ResultSet resultSet = statement.executeQuery(sql); //执行sql并返回更新的数据行数
while(resultSet.next()){ //判断是否还有数据
//根据字段获取数据
long uid = resultSet.getLong("uid");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
Date birther = resultSet.getDate("birthday");
double salary = resultSet.getDouble("salary");
String note = resultSet.getString("note");
System.out.printf("【查询结果】编号:%s、姓名:%s、年龄:%s、生日:%s、工资:%f、介绍:%s\n",
uid,name,age,birther,salary,note);
}
//如果现在直接关闭了数据库的连接,整个数据库所有的Statement对象也就自动关闭了
connection.close(); //及时关闭
}
}
【查询结果】编号:1、姓名:李兴华、年龄:18、生日:2008-08-13、工资:8000.000000、介绍: www. yootk. com
【查询结果】编号:2、姓名: 沐言优折、年龄:18、生日:2009-09-15、工资:9000.000000、介绍: ww.yootk.com
【查询结果】编号:3、姓名:VIP学院、年龄:18、生日:2009-09-15、工资:78000.000000、介绍:yootk.ke.qq.com
【查询结果】编号:4、姓名:李四、年龄:17、生日:1888-08-01、工资:100.000000、介绍:www.baidu.com
在以后开发的过程里面对于数据查询的SQL语句来讲绝对不允许使用“SELECT*”因为这样会导致查询结果的不明确,如果此时查询的是具体的字段信息,最大的优势在于:可以直接通过编号的形式来获取数据。
范例:通过编号获取数据
import java.sql.*;
public class JDBCDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
Statement statement = connection.createStatement(); //创建数据库的操作对象
//sql插入字段代码,在以后填写sql语句时如果需要换行,最佳的做法是在前后多加一个空格
String sql = "SELECT uid,name,age,birthday,salary,note FROM user";
ResultSet resultSet = statement.executeQuery(sql); //执行sql并返回更新的数据行数
while(resultSet.next()){ //判断是否还有数据
//根据字段获取数据
long uid = resultSet.getLong(1);
String name = resultSet.getString(2);
int age = resultSet.getInt(3);
Date birther = resultSet.getDate(4);
double salary = resultSet.getDouble(5);
String note = resultSet.getString(6);
System.out.printf("【查询结果】编号:%s、姓名:%s、年龄:%s、生日:%s、工资:%f、介绍:%s\n",
uid,name,age,birther,salary,note);
}
//如果现在直接关闭了数据库的连接,整个数据库所有的Statement对象也就自动关闭了
connection.close(); //及时关闭
}
}
此时由于查询语句上已经明确的给出了查询列的定义,这样就可以通过索引号方便的实现结果集中列数据的获取了。虽然通过具体的getXxx()的形式可以获得相应的列数据信息,但是在ResultSet接口里面针对于结果列的获取还有另外一个简单方法:
Object getObject(int columnIndex) throws SQLException
把所有的内容都以Object的形式进行接收,Object作为返回数据类型的统一标准了。
范例:通过getObject()实现操作的接收
import java.sql.*;
public class JDBCDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
Statement statement = connection.createStatement(); //创建数据库的操作对象
//sql插入字段代码,在以后填写sql语句时如果需要换行,最佳的做法是在前后多加一个空格
String sql = "SELECT uid,name,age,birthday,salary,note FROM user";
ResultSet resultSet = statement.executeQuery(sql); //执行sql并返回更新的数据行数
while(resultSet.next()){ //判断是否还有数据
//根据字段获取数据
Object uid = resultSet.getObject(1);
Object name = resultSet.getObject(2);
Object age = resultSet.getObject(3);
Object birther = resultSet.getObject(4);
Object salary = resultSet.getObject(5);
Object note = resultSet.getObject(6);
System.out.printf("【查询结果】编号:%s、姓名:%s、年龄:%s、生日:%s、工资:%f、介绍:%s\n",
uid,name,age,birther,salary,note);
}
//如果现在直接关闭了数据库的连接,整个数据库所有的Statement对象也就自动关闭了
connection.close(); //及时关闭
}
}
在Java中有一项特别重要的技术就属于反射机制,而对于反射机制来讲,所有的参数的内容都会通过Object类型来描述,结合反射机制再使用如上的getObject()方法就特别有用处。
提示:现在所使用的JDBC操作形式属于JDBC1.0的时候所具备的流程,但是相比较原始的JDBC版本来讲,现在的JDBC开发要方便许多,因为有如下两个问题解决了:
- 在JDBC早期版本里面,所有的列数据必须按照顺序的方式获取,如果顺序错乱,则无法获取;。
- 所有的数据只能够获取一次,如果重复获取也会出错。
通过以上的程序已经实现了完整的数据的CRUD处理,那么下面尝试创建两个Statement对象一个实现数据的增加,另外一个实现获取增长后ID的内容( 数据库查询)。
范例:观察两个Statement接口对象的操作
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class StatementAdd {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
Class.forName(DRIVER);//反射获取驱动程序
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库连接
Statement statementInsert= connection.createStatement(); //创建数据库的操作对象
Statement statementSelect = connection.createStatement(); //创建数据库的操作对象
String insertSql = " INSERT INTO user(name,age,birthday,salary,note) VALUES " +
" ('王五',78,'1947-08-01',800,'www.baidu.com') ";
String selectSql = "SELECT LAST_INSERT_ID()"; //最后一次增长ID的查询
int count = statementInsert.executeUpdate(insertSql); //实现数据的插入
statementInsert.close(); //关闭资源
if(count > 0){
ResultSet result= statementSelect.executeQuery(selectSql); //对需要查询的数据进行保存
if(result.next()){ //判断是否有数据
System.out.println("插入的数据ID为:"+result.getObject(1)); //对查询到的数据进行输出
}
}else{
System.out.println("插入失败");
}
statementSelect.close(); //关闭资源
connection.close(); //关闭连接
}
}
插入的数据ID为:11
每一个Statement对象都表示一个完全独立的SQL语句的执行命令,如果现在不想有多个Statement,也可以通过重复的关闭和创建的机制来实现。|
只要用户会写sql语句就可以实现数据库的CRUD处理。
本文详细讲解了如何在Java中使用Statement接口进行数据查询,包括多列查询、简单获取、getObject()方法,并展示了通过索引和反射机制的应用。还涵盖了如何创建多个Statement实例处理增删改查操作。
2444

被折叠的 条评论
为什么被折叠?



