zoukankan      html  css  js  c++  java
  • 查询

    前提准备
    包结构:
    这里写图片描述

    ========================
    JDBC 操作的工具类:

    package com.atguigu.jdbc;
    
    import java.io.IOException;
    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;
    
    /**
     * JDBC 操作的工具类
     */
    public class JdbcUtils {
    
        public static void close(ResultSet resultSet){
            try {
                if(resultSet != null){
                    resultSet.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //关闭数据库资源
        public static void close(Connection connection){
            try {
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        public static void close(Statement statement){
            try {
                if(statement != null){
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
        //根据配置文件获取数据库连接
        public static Connection getConnection() throws ClassNotFoundException, SQLException, IOException{
            Connection connection = null;
    
            //0. 读取 Properties 文件
            Properties properties = new Properties();
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            properties.load(in);
    
            //1. 准备连接数据库的四个基本信息: 
            String driverClassName = properties.getProperty("jdbc.driverClass");
            String url = properties.getProperty("jdbc.jdbcUrl");
            String user = properties.getProperty("jdbc.user");
            String password = properties.getProperty("jdbc.password");
    
            //2. 加载驱动
            Class.forName(driverClassName);
    
            //3. 调用 DriverManager.getConnection(url, user, password) 获取连接
            connection = DriverManager.getConnection(url, user, password);
    
            return connection;
        }
    
    }
    

    ========================================
    JDBC连接数据库相关信息配置文件/jdbc-1/src/jdbc.properties:

    jdbc.user=root
    jdbc.password=root
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/jdbc1
    
    
    #jdbc.user=scott
    #jdbc.password=tiger
    #jdbc.driverClass=oracle.jdbc.driver.OracleDriver
    #jdbc.jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:ORCL001

    =======================================
    数据库表信息:
    user表
    这里写图片描述
    product表:
    这里写图片描述

    ==================================
    实体信息:
    User.java

    package com.atguigu.jdbc;
    
    public class User {
    
        private Integer id;
        private String username;
        private String password;
    
        public User() {
            // TODO Auto-generated constructor stub
        }
    
        public User(Integer id, String username, String password) {
            super();
            this.id = id;
            this.username = username;
            this.password = password;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", password="
                    + password + "]";
        }
    }
    

    Product.java:

    package com.atguigu.jdbc;
    
    import java.util.Date;
    
    public class Product {
    
        private Integer id;
        private String name;
    
        private String desc;
        private Date createDate;
    
        public Product() {
            // TODO Auto-generated constructor stub
        }
    
        public Product(Integer id, String name, String desc, Date createDate) {
            super();
            this.id = id;
            this.name = name;
            this.desc = desc;
            this.createDate = createDate;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        public Date getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
    
        @Override
        public String toString() {
            return "Product [id=" + id + ", name=" + name + ", desc=" + desc
                    + ", createDate=" + createDate + "]";
        }
    }
    
    ========================================
    //第一种实现方式:查询数据表里的数据并打印出来
    @Test
        public void testResultSet(){
            String sql = "SELECT id, username, password FROM users";
    
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
                connection = JdbcUtils.getConnection();
                preparedStatement = connection.prepareStatement(sql);
    
                //执行查询, 将返回 ResultSet 对象
                resultSet = preparedStatement.executeQuery();
    
                //处理结果集
                //1. ResultSet#next() 有两个作用: 侦测结果集是否有下一条记录, 若有则
                //注意: 指针最开始时指向第一条记录的前面. 
                //1.1 返回 true
                //1.2 指针向下移动一个单位
                int i=1;
                while(resultSet.next()){
                    System.out.println("第"+i+"条结果:");
                    //2. 获取每一行中具体列的值. 调用 ResultSet#getXxx() 方法
                    int id = resultSet.getInt(1);
                    String username = resultSet.getString("username");
                    String password = resultSet.getString(3);
    
                    System.out.println(id + "," + username + "," + password);
                     i++;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                //3. 关闭结果集
                JdbcUtils.close(resultSet);
                JdbcUtils.close(preparedStatement);
                JdbcUtils.close(connection); 
            }
        }
    ==================================================
    //第二种实现方式:实体封装数据表数据,查询所有记录
    //编写获取数据表所有记录的方法
    /**
         * 一般地, 
         * 数据表 对应 一个 Java 类.
         * 数据表的一条记录 对应 一个 Java 类的对象
         * 数据表的一列 对应 一个 Java 类的属性
         * 
         * ORM: Object Relation Mapping
         */
        public List<User> getAllUsers(){
            List<User> users = new ArrayList<>();
    
            String sql = "SELECT id, username, password FROM users";
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
                connection = JdbcUtils.getConnection();
                preparedStatement = connection.prepareStatement(sql);
    
                //执行查询, 将返回 ResultSet 对象
                resultSet = preparedStatement.executeQuery();
    
                //处理结果集
                //1. ResultSet#next() 有两个作用: 侦测结果集是否有下一条记录, 若有则
                //注意: 指针最开始时指向第一条记录的前面. 
                //1.1 返回 true
                //1.2 指针向下移动一个单位
                while(resultSet.next()){
                    //2. 获取每一行中具体列的值. 调用 ResultSet#getXxx() 方法
                    int id = resultSet.getInt(1);
                    String username = resultSet.getString("username");
                    String password = resultSet.getString(3);
    
                    User user = new User(id, username, password);
                    users.add(user);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                //3. 关闭结果集
                JdbcUtils.close(resultSet);
                JdbcUtils.close(preparedStatement);
                JdbcUtils.close(connection); 
            }
    
            return users;
        }
    //测试
    @Test
        public void testGetAllUsers(){
            System.out.println(getAllUsers());
        }
    ======================================
    //第三种实现方式:实体封装数据表数据,查询一条记录
    //根据id获取到user表里的一条记录的方法
    public User getUserById(Integer id){
            String sql = "SELECT id, username, password FROM users WHERE id = ?";
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
                connection = JdbcUtils.getConnection();
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setInt(1, id);
    
                //执行查询, 将返回 ResultSet 对象
                resultSet = preparedStatement.executeQuery();
    
                //处理结果集
                //1. ResultSet#next() 有两个作用: 侦测结果集是否有下一条记录, 若有则
                //注意: 指针最开始时指向第一条记录的前面. 
                //1.1 返回 true
                //1.2 指针向下移动一个单位
                if(resultSet.next()){
                    //2. 获取每一行中具体列的值. 调用 ResultSet#getXxx() 方法
                    String username = resultSet.getString("username");
                    String password = resultSet.getString(3);
    
                    User user = new User(id, username, password);
                    return user;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                //3. 关闭结果集
                JdbcUtils.close(resultSet);
                JdbcUtils.close(preparedStatement);
                JdbcUtils.close(connection); 
            }
    
            return null;
        }
    //测试
    @Test
        public void testGetById(){
            User user = getUserById(50);
            System.out.println(user);
    }
    //根据id获取到product表里的一条记录的方法
    public Product getProductById(Integer id){
            String sql = "SELECT id, name, description, create_date FROM products WHERE id = ?";
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
                connection = JdbcUtils.getConnection();
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setInt(1, id);
    
                resultSet = preparedStatement.executeQuery();
    
                if(resultSet.next()){
                    String name = resultSet.getString("name");
                    String desc = resultSet.getString("description");
                    Date createDate = resultSet.getDate("create_date");
    
                    Product product = new Product(id, name, desc, createDate);
                    return product;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                //3. 关闭结果集
                JdbcUtils.close(resultSet);
                JdbcUtils.close(preparedStatement);
                JdbcUtils.close(connection); 
            }
    
            return null;
        }
    //测试
    @Test
        public void testGetById(){
            Product product = getProductById(1);
            System.out.println(product);
    }
    ======================================================
    //第四种实现方式:实体封装数据表数据,查询一条记录
    //编写通用的 根据 id 获取对象的方法.
        public <T> T getById(String sql, Integer id, Class<T> clazz){
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
    
            try {
                connection = JdbcUtils.getConnection();
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setInt(1, id);
    
                resultSet = preparedStatement.executeQuery();
    
                if(resultSet.next()){
                    //该创建什么类型的对象呢 ? 该如何把查询的列的值赋给该对象对应的属性呢 ?
                    //若数据表的列和类的属性不一致, 则可以使用别名的方式进行映射.
                    //所以只需要为列的别名对应的属性赋值就可以了. 
                    T result = clazz.newInstance();
    
                    //如何知道查询哪些列了呢 ? 如何来获取每个列的值呢 ?
                    //可以通过调用 ResultSet#getMetaData() 方法来获取 ResultSetMetaData 对象
                    //ResultSetMetaData 对象中即包含了描述 ResultSet 的数据. 例如有哪些列
                    ResultSetMetaData metaData = resultSet.getMetaData();
    
                    //获取有多少列.
                    int columnCount = metaData.getColumnCount();
                    for(int i = 0; i < columnCount; i++){
                        //可以调用 ResultSetMetaData#getColumnName() 获取了具体列的名字
                        String columnName = metaData.getColumnName(i + 1);
    //                  System.out.println(columnName);
    
                        //可以调用 ResultSetMetaData#getColumnName() 获取了具体列的别名
                        String columnLabel = metaData.getColumnLabel(i + 1);
    //                  System.out.println(columnLabel);
    
                        //获取列的值的时候, 需要传入的事列的别名
                        Object columnValue = resultSet.getObject(columnLabel);
    
                        //为 object 的 columnLabel 属性赋值为 columnValue.
                        //可以使用反射. 也可以调用工具类的工具方法
                        PropertyUtils.setProperty(result, columnLabel, columnValue);
                    }
    
                    //返回
                    return result;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally{
                //3. 关闭结果集
                JdbcUtils.close(resultSet);
                JdbcUtils.close(preparedStatement);
                JdbcUtils.close(connection); 
            }
    
            return null;
        }
    //测试
    @Test
        public void testGetById(){
    
            String sql = "SELECT id, name, description as "desc", create_date as "createDate" "
                    + "FROM products WHERE id = ?";
            Object object = getById(sql, 1, Product.class);
            System.out.println(object);
    
            sql = "SELECT id, username, password FROM users WHERE id = ?";
            User user = getById(sql, 1, User.class);
            System.out.println(user);
    }

    未完待续!

  • 相关阅读:
    STM32f469I discovery烧写demo例程
    dsp5509的中断系统
    DSP5509之采样定理
    DSP5509开发之FPGA接口
    mongodb学习之:安全和认证
    mongodb学习之:GridFS
    tornado之异步web服务一
    mongodb学习之:数据库命令以及固定集合
    docker: Dockerfile命令介绍
    mongodb学习之:聚合
  • 原文地址:https://www.cnblogs.com/lisingshen/p/7499736.html
Copyright © 2011-2022 走看看