JDBC 5—— 查的操作

Java与SQL对应数据类型转换表

Java类型 SQL类型
boolean BIT
byte TINYINT
short SMALLINT
int INTEGER
long BIGINT
String CHAR,VARCHAR,LONGVARCHAR
byte array BIGARY,VAR BINARY
java.sql.Date DATE
java.sql.Time TIME
java.sql.Timestamp TIMESTAMP

 重载关闭资源的操作

    /*
     * 关闭资源的操作
     */
    public static void closeResource(Connection conn, PreparedStatement 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();
        }
    }

先从特殊的一个表的一个查询开始,然后在将一个表的查询扩展到一个通用的语句,以下是针对于Customers表的查询操作,其中便包含了这两项。

package com.JDBCStudy3.PreparedStatement.crud;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;

import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.ResultSetMetaData;

import JDBC_util.JDBCutils;

/*
 * 针对于Customers表的查询操作
 * */
public class CustomerForQuery {
    public void testQueryForCustmers() {
        String sql = "select id,name,birth,email from customers where id = ?";
        Customer customer = queryForCustomers(sql,13);
        System.out.println(customer);
        
        sql = "select name,email from customers where name = ?";
        customer = queryForCustomers(sql,"周杰伦");
        System.out.println(customer);
    }
    
    
    /*
     * 针对customers表的通用的查询操作
     */
    public Customer queryForCustomers(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 = (ResultSet) ps.executeQuery();
            // 获取结果集的元数据ResultSetMetaData String name = "TOM";
            ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
            // 通过ResultSetMetaData获取结果集中的列数
            int columnCount = rsmd.getColumnCount();
            if (rs.next()) {
                Customer cust = new Customer();
                // 处理结果集一行数据中的每一个列
                for (int i = 0; i < columnCount; i++) {
                    // 获取列值
                    Object columnValue = rs.getObject(i + 1);

                    // 获取每个列的列名
                    String columnName = rsmd.getColumnName(i + 1);

                    // 给cust对象指定的某个属性,赋值为columnValue,通过反射
                    java.lang.reflect.Field field = Customer.class.getDeclaredField(columnName);
                    field.setAccessible(true);
                    field.set(cust, columnValue);
                }
                return cust;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCutils.closeResource(conn, ps, rs);
        }
        return null;
    }

    
    public void testQuery1() {
        Connection conn = null;
        PreparedStatement ps = null;
        // 执行,并返回结果集
        ResultSet resultSet = null;
        try {
            conn = JDBCutils.getConnection();
            String sql = "select id,name,email,birth from customers where id = ?";
            ps = conn.prepareStatement(sql);

            resultSet = (ResultSet) ps.executeQuery();
            // 处理结果集
            if (resultSet.next()) {
                // 判断结果集的下一条是否有数据,如果有数据返回true,并指针下移,如果返回false,指针不下移,结束
                // 获取当前这条数据的各个字段值
                int id = resultSet.getInt(1);
                String name = resultSet.getString(2);
                String email = resultSet.getString(3);
                Date birth = resultSet.getDate(4);

                // 方式一:
                System.out.println("id = " + id + ",name = " + name + ",email = " + email + " birth = " + birth);
                // 方式二:
                Object[] data = new Object[] { id, name, email, birth };
                // 方式三:将数据封装成一个对象(推荐)
                Customer customer = new Customer(id, name, email, birth);
                System.out.println(customer);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源操作
            JDBCutils.closeResource(conn, ps, resultSet);
        }
    }
}

 customer类

package com.JDBCStudy3.PreparedStatement.crud;

import java.sql.Date;

/*
 * ORM编程思想(object relational mapping)
 * 一个数据表对应一个java类
 * 表中的一个记录对应Java类的一个对象
 * 表中的一个字段对应Java类的一个属性
 * */
public class Customer {
    private int id;
    private String name;
    private String email;
    private Date birth;

    public Customer(int id, String name, String email, Date birth) {
        super();
        this.id = id;
        this.name = name;
        this.email = email;
        this.birth = birth;
    }

    public Customer() {
        super();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Customer [id=" + id + ", name=" + name + ", email=" + email + ", birth=" + birth + "]";
    }
}

有了customer表的查找操作,在试试order表的查询

下图为编程的思想图

package com.JDBCStudy3.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 org.junit.Test;

import JDBC_util.JDBCutils;

/*
 * 针对于Order表的通用的查询操作
 * */
public class OrderForQuery {
    /*
     * 针对于表的字段名与类的属性名不相同的情况:
     * 1、必须声明sql时,使用类的属性名来命名字段的别名
     * 2、使用ResultSetMetaData时,需要使用getColumnLabel()来替换getColumnName(),获取列的别名
     * 说明:如果sql中没有给字段取别名,getColumnLabel()获取的就是列名
     * */
    
    @Test
    public void testOrederForQuery() {
        String sql = "select order_id orderId,order_name orderName,order_date orderDate from `order` where order_id = ?";
        Order order = orderForQuery(sql, 1);
        System.out.println(order);
    }

    /*
     * 通用的针对于Order表的查询操作
     */
    @SuppressWarnings("finally")
    public Order orderForQuery(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();
            // 获取列数
            int columnCount = rsmd.getColumnCount();
            if (rs.next()) {
                Order order = new Order();
                for (int i = 0; i < columnCount; i++) {
                    // 获取每个列的列值:通过ResultSet
                    Object columnValue = rs.getObject(i + 1);
                    /*
                     * 通过ResultSetMetaData
                     * 获取列的列名:getColumnName() -- 不推荐使用
                     * 获取列的别名:getColumnLabel()
                     * */
                    //String columnName = rsmd.getColumnName(i + 1);
                    String columnLabel = rsmd.getColumnLabel(i);
                    // 通过反射,将对象指定名columnName的属性赋值为指定的值columnValue
                    Field field = Order.class.getDeclaredField((String) columnLabel);
                    field.setAccessible(true);
                    field.set(order, columnValue);
                }
                return order;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCutils.closeResource(conn, ps, rs);
            return null;
        }
    }

    public void testQuery1() {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCutils.getConnection();
            String sql = "select order_id,order_name,order_date from `order` where order_id = ?";
            ps = conn.prepareStatement(sql);
            ps.setObject(1, 1);

            rs = ps.executeQuery();
            if (rs.next()) {
                int id = (int) rs.getObject(1);
                String name = (String) rs.getObject(2);
                Date date = (Date) rs.getObject(3);

                Order order = new Order(id, name, date);
                System.out.println(order);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCutils.closeResource(conn, ps, rs);
        }
    }
}

order类

package com.JDBCStudy3.PreparedStatement.crud;

import java.sql.Date;

public class Order {
    private int orderId;
    private String orderName;
    private Date orderDate;

    public Order() {
        super();
    }

    public Order(int orderId, String orderName, Date orderDate) {
        super();
        this.orderId = orderId;
        this.orderName = orderName;
        this.orderDate = orderDate;
    }

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    public String getOrderName() {
        return orderName;
    }

    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    @Override
    public String toString() {
        return "Order [orderId=" + orderId + ", orderName=" + orderName + ", orderDate=" + orderDate + ", getOrderId()="
                + getOrderId() + ", getOrderName()=" + getOrderName() + ", getOrderDate()=" + getOrderDate()
                + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
                + "]";
    }
}

 

posted @ 2021-01-21 19:36  我等着你  阅读(80)  评论(0)    收藏  举报