博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC_03 实现对数据表的查询操作
阅读量:3966 次
发布时间:2019-05-24

本文共 11418 字,大约阅读时间需要 38 分钟。


本人是个新手,写下博客用于自我复习、自我总结。

如有错误之处,请各位大佬指出。
学习资料来源于:尚硅谷


每个人的数据库的名字以及表可能不相同,可以对以下中出现的数据进行相应的修改

通用操作:

package com.guigu.util;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/** * 操作数据库的工具类 * */public class JDBCUtils {
/** * 获取数据库的连接 * */ public static Connection getConnection() throws Exception {
// 1、读取配置文件中的基本信息 InputStream is = ClassLoader.getSystemClassLoader() .getResourceAsStream("jdbc.properties"); Properties pros = new Properties(); pros.load(is); String user = pros.getProperty("user"); String url = pros.getProperty("url"); String password = pros.getProperty("password"); // 2、加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 3、获取链接 Connection conn = DriverManager.getConnection(url, user, password); return conn; } // 关闭资源的操作 public static void closeResource(Connection conn, Statement ps) {
try {
if (ps != null) ps.close(); } catch (SQLException e) {
e.printStackTrace(); } try {
if (conn != null) conn.close(); } catch (SQLException e) {
e.printStackTrace(); } } // 关闭资源的操作 public static void closeResource(Connection conn, Statement ps, ResultSet rs) {
try {
if (ps != null) ps.close(); } catch (SQLException e) {
e.printStackTrace(); } try {
if (conn != null) conn.close(); } catch (SQLException e) {
e.printStackTrace(); } try {
if (rs != null) rs.close(); } catch (SQLException e) {
e.printStackTrace(); } }}

查询操作的类(一个数据表对应一个java类)

package com.guigu.bean;import java.sql.Date;/** * ORM编程思想(object relational mapping) 一个数据表对应一个java类 表中的一条记录对应java类的一个对象 * 表中的一个字段对应java类的一个属性 *  * java与SQL对应数据类型转换表: boolean <--> BIT byte <--> TINYINT short <--> SMALLINT int * <--> INTEGER long <--> BIGINT String <--> CHAR,VARCHAR,LONGVARCHAR byte array * <--> BINARY, VAR BINARY *  * java.sql.Date <--> DATE java.sql.Time <--> TIME java.sql.Timestamp <--> * TIMESTAMP *  * */public class Student {
private String stuname; private double stuscore; private int stunum; private Date stubirth; public Student() {
super(); } public Student(String stuname, double stuscore, int stunum, Date stubirth) {
super(); this.stuname = stuname; this.stuscore = stuscore; this.stunum = stunum; this.stubirth = stubirth; } public String getStuname() {
return stuname; } public void setStuname(String stuname) {
this.stuname = stuname; } public double getStuscore() {
return stuscore; } public void setStuscore(double stuscore) {
this.stuscore = stuscore; } public int getStunum() {
return stunum; } public void setStunum(int stunum) {
this.stunum = stunum; } public Date getStubirth() {
return stubirth; } public void setStubirth(Date stubirth) {
this.stubirth = stubirth; } @Override public String toString() {
return "Student [stuname=" + stuname + ", stuscore=" + stuscore + ", stunum=" + stunum + ", stubirth=" + stubirth + "]"; }}
package com.guigu.preparedstatement.crud;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;import org.junit.Test;/** * 针对student表的查询 * */public class StudentForQuery {
@Test public void testQuery1(){
Connection conn = null; PreparedStatement ps=null; ResultSet resultSet = null; try {
conn = JDBCUtils.getConnection(); String sql = "select stuname,stuscore,stunum,stubirth from student where stuid = ?"; ps = conn.prepareStatement(sql); ps.setObject(1, 6); // 执行并返回结果集 resultSet = ps.executeQuery(); // 处理结果集 if (resultSet.next()) {
// 判断结果集的下一条是否有数据,如果返回true,指针下移;否则指针不下移 // 获取当前数据的各个字段值 String stuname = resultSet.getString(1); double stuscore = resultSet.getDouble(2); int stunum = resultSet.getInt(3); Date stubirth = resultSet.getDate(4); // 方式一 //System.out.println("姓名:" + stuname + "分数:" + stuscore + "学号:" // + stunum + "生日:" + stubirth); // 方式二 //Object[] data = new Object[] { stuname, stuscore, stunum, stubirth }; // 方式三 :将数据封装成一个对象(推荐) Student student = new Student(stuname,stuscore,stunum,stubirth); System.out.println(student); } } catch (Exception e) {
e.printStackTrace(); } //关闭资源 JDBCUtils.closeResource(conn,ps,resultSet); }}

之后可以写一个针对student的通用查询操作

package com.guigu.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;import org.junit.Test;/** * 针对student表的查询 * */public class StudentForQuery {
// 针对于student表的通用的查询操作 public Student queryForStudent(String sql, Object... args) {
Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try {
conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) {
Student st = new Student(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) {
// 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(st, columnValue); } return st; } } catch (Exception e) {
e.printStackTrace(); } finally {
JDBCUtils.closeResource(conn, ps, rs); } return null; } @Test public void testQueryForStudent(){
String sql = "select stuname,stuscore,stunum,stubirth from student where stuid = ?"; Student st = queryForStudent(sql,6); System.out.println(st); }}

最后需要想办法实现的是对不同的表都可以做到的通用查询方式:

package com.guigu.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.ArrayList;import java.util.List;import org.junit.Test;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;//使用PreparedStatement实现对于不同表的通用的查询操作public class PreparedStatementQueryTest {
@Test public void testGetInstance() {
String sql = "select stuname,stuscore,stunum,stubirth from student where stuid = ?"; Student st = getInstance(Student.class, sql, 6); System.out.println(st); } // 针对于不同的表的通用的查询操作,返回表中的一条记录 public
T getInstance(Class
clazz, String sql, Object... args) {
Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try {
conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) {
T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) {
// 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(t, columnValue); } return t; } } catch (Exception e) {
e.printStackTrace(); } finally {
JDBCUtils.closeResource(conn, ps, rs); } return null; } @Test public void testGetForList() {
String sql = "select stuname,stuscore,stunum,stubirth from student where stuid < ?"; List
list = getForList(Student.class, sql, 3); int size = list.size(); for (int i = 0; i < size; i++) {
System.out.println(list.get(i)); } } // 针对于不同的表的通用的查询操作,返回表中的多条记录 public
List
getForList(Class
clazz, String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); // 创建集合对象 ArrayList
list = new ArrayList
(); while (rs.next()) { T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列:给t对象指定的属性赋值 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(t, columnValue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps, rs); } return null; }}

PreparedStatement可以解决sql注入问题

(需要在数据库中建立User表,把有登录权限的人的信息写上,
再在java中写一个User类(像之前那样)
判断输入的用户名和密码能否匹配上,如果匹配上就允许登录,否则不允许)

package com.guigu.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.Scanner;import org.junit.Test;import com.guigu.bean.Student;import com.guigu.util.JDBCUtils;/** * PreparedStatement除了解决Statement的拼串、sql问题之外,PreparedStatement还有哪些好处? * 1、PreparedStatement操作Blob的数据,而Statement做不到 * 2、PreparedStatement可以实现更高效的批量操作 * */public class PreparedStatementTest {
@Test public void testLogin() {
Scanner scanner = new Scanner(System.in); System.out.println("请输入用户名:"); String user = scanner.nextLine(); System.out.println("请输入密码:"); String password = scanner.nextLine(); String sql = "SELECT user,password FROM user_table WHERE user = ? and password = ?"; User returnUser = getInstance(User.class, sql, user, password); if (returnUser != null) {
System.out.println("登陆成功"); } else {
System.out.println("用户名不存在或密码错误"); } } // 针对于不同的表的通用的查询操作,返回表中的一条记录 public
T getInstance(Class
clazz, String sql, Object... args) {
Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try {
conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = rsmd.getColumnCount(); if (rs.next()) {
T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) {
// 获取列值 Object columnValue = rs.getObject(i + 1); // 获取每个列的列名 String columnName = rsmd.getColumnName(i + 1); // 给st对象指定的columnName属性,赋值为columnValue,反射完成 Field field = Student.class.getDeclaredField(columnName); field.setAccessible(true); field.set(t, columnValue); } return t; } } catch (Exception e) {
e.printStackTrace(); } finally {
JDBCUtils.closeResource(conn, ps, rs); } return null; }}

转载地址:http://yayki.baihongyu.com/

你可能感兴趣的文章
Android Property实现介绍
查看>>
Android SystemProperties设置/取得系统属性的用法总结
查看>>
Android 休眠 FLAG_KEEP_SCREEN_ON
查看>>
Android添加onKeyLongPress事件
查看>>
Android使用Contact数据模型来批量插入联系人
查看>>
使用微信api将内容分享给好友,或者发送到朋友圈
查看>>
百度地图SDK坐标传入导航sdk 示例
查看>>
免费的sip账号
查看>>
android开发中输入法的弹出和隐藏
查看>>
Android 如何在自定义界面上启用输入法 (How to enable inputmethod for the custom UI)
查看>>
Android MediaCodec小结
查看>>
详解YUV数据格式
查看>>
YUV格式说明
查看>>
MediaCodec and Camera: colorspaces don't match
查看>>
How to use Android MediaCodec encode Camera data(YUV420sp)
查看>>
android adb 读写模式 挂载文件系统
查看>>
onTouchEvent方法的使用
查看>>
Android详细解释键盘和鼠标事件
查看>>
Android设置默认Launcher
查看>>
Android判断GPS是否开启和强制帮用户打开GPS
查看>>