JDBC优化

1.元数据

  • DatabaseMetaData
    -- 作用
(1) DatabaseMetaData实例的获取
(2) 获得当前[数据库](http://lib.csdn.net/base/mysql)以及驱动的信息
(3) 获得当前数据库中表的信息
(4)获得某个表的列信息
(5)获得表的关键字信息
(6)获取指定表的外键信息

-- 获取数据库元数据

DatabaseMetaData metaData = conn.getMetaData();

--实现过程

//1. 获取数据库元数据
    @Test
    public void testDB() throws Exception {
        // 获取连接
        Connection conn = JdbcUtil.getConnection();
        // 获取数据库元数据
        DatabaseMetaData metaData = conn.getMetaData();

        System.out.println(metaData.getUserName());
        System.out.println(metaData.getURL());
        System.out.println(metaData.getDatabaseProductName());
    }
image.png
//2. 获取参数元数据
    @Test
    public void testParams() throws Exception {
        // 获取连接
        Connection conn = JdbcUtil.getConnection();
        String sql = "select * from admin where id=? and username=?";

        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 参数元数据
        ParameterMetaData p_metaDate = pstmt.getParameterMetaData();
        // 获取参数的个数
        int count = p_metaDate.getParameterCount();

        // 测试
        System.out.println(count);
    }
image.png
// 3. 获取结果集元数据
    @Test
    public void testRs() throws Exception {
        String sql = "select * from admin ";

        // 获取连接
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        // 得到结果集元数据(目标:通过结果集元数据,得到列的名称)
        ResultSetMetaData rs_metaData = rs.getMetaData();

        // 迭代每一行结果
        while (rs.next()) {
            // 1. 获取列的个数
            int count = rs_metaData.getColumnCount();
            // 2. 遍历,获取每一列的列的名称
            for (int i=0; i<count; i++) {
                // 得到列的名称
                String columnName = rs_metaData.getColumnName(i + 1);
                // 获取每一行的每一列的值
                Object columnValue = rs.getObject(columnName);
                // 测试
                System.out.print(columnName + "=" + columnValue + ",");
            }
            System.out.println();
        }
    }
将数据表中的信息全部显示出来
数据表中的信息

2.Dao操作的抽取

  • 目的:减少代码的重复性

实现过程

  • 1.创建通用的dao
package com.ouya.util;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/**
 * 创建通用的dao,所有的dao都继承此类;
 * Created by pc on 17-4-30.
 */
public class BaseDao {
    //初始化参数
    private static Connection conn;
    private static PreparedStatement pstmt;
    private static ResultSet rs;

    /**
     * 更新的通用方法
     *
     * @param sql
     * @param paramsValue
     */
    public void update(String sql, Object[] paramsValue) {

        try {
            //获取链接
            conn = JdbcUtil.getConnection();
            //创建执行命令的pstmt对象
            pstmt = conn.prepareStatement(sql);
            //参数元数据:得到占位符参数的个数
            int count = pstmt.getParameterMetaData().getParameterCount();

            //设置占位符参数的值
            if (paramsValue != null && paramsValue.length > 0) {
                //循环给参数赋值
                for (int i=1;i<count;i++) {
                    pstmt.setObject(i + 1, paramsValue[i]);
                }
            }
            //执行更新
            pstmt.executeUpdate();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            JdbcUtil.closeAll(conn,pstmt,rs);
        }
    }

    /**
     * 查询的通用方法
     * @param sql
     * @param paramsValue
     * @param clazz
     * @param <T>
     * @return
     */

    public <T> List<T> query(String sql, Object[] paramsValue, Class<T> clazz) {
        try {
            //返回的集合
            List<T> list = new ArrayList<T>();
            //对象
            T t = null;

            conn = JdbcUtil.getConnection();
            pstmt = conn.prepareStatement(sql);

            int count = pstmt.getParameterMetaData().getParameterCount();
            if (paramsValue != null && paramsValue.length > 0) {
                for (int i=0;i<count;i++) {
                    pstmt.setObject(1, paramsValue[i]);
                }
            }

            //执行查询
            rs = pstmt.executeQuery();
            //获取结果集元素
            ResultSetMetaData rsmd = rs.getMetaData();
            //获取列的个数
            int columnCount = rsmd.getColumnCount();

            //遍历rs
            while (rs.next()) {
                //要封装的对象
                t = clazz.newInstance();
                //遍历每一行的每一列,封装数据
                for (int i=1;i<count;i++) {
                    //获取每一列的列名称
                    String columnName = rsmd.getColumnName(i + 1);
                    //获取每一列的列名称对应的值
                    Object value = rs.getObject(columnName);
                    BeanUtils.copyProperty(t, columnName, value);
                }
                //把封装完毕的对象添加到集合中
                list.add(t);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            JdbcUtil.closeAll(conn, pstmt, rs);
        }
        return null;
    }

}

  • 2.写DemoDao类,定义数据表的增删改查
package com.ouya.util;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/**
 * 创建通用的dao,所有的dao都继承此类;
 * Created by pc on 17-4-30.
 */
public class BaseDao {
    //初始化参数
    private static Connection conn;
    private static PreparedStatement pstmt;
    private static ResultSet rs;

    /**
     * 更新的通用方法
     *
     * @param sql
     * @param paramsValue
     */
    public void update(String sql, Object[] paramsValue) {

        try {
            //获取链接
            conn = JdbcUtil.getConnection();
            //创建执行命令的pstmt对象
            pstmt = conn.prepareStatement(sql);
            //参数元数据:得到占位符参数的个数
            int count = pstmt.getParameterMetaData().getParameterCount();

            //设置占位符参数的值
            if (paramsValue != null && paramsValue.length > 0) {
                //循环给参数赋值
                for (int i = 0; i < count; i++) {
                    pstmt.setObject(i + 1, paramsValue[i]);
                }
            }
            //执行更新
            pstmt.executeUpdate();

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.closeAll(conn, pstmt, rs);
        }
    }

    /**
     * 查询的通用方法
     *
     * @param sql
     * @param paramsValue
     * @param clazz
     * @param <T>
     * @return
     */

    public <T> List<T> query(String sql, Object[] paramsValue, Class<T> clazz) {
        try {
            //返回的集合
            List<T> list = new ArrayList<T>();
            //对象
            T t = null;

            conn = JdbcUtil.getConnection();
            pstmt = conn.prepareStatement(sql);

            int count = pstmt.getParameterMetaData().getParameterCount();
            if (paramsValue != null && paramsValue.length > 0) {
                for (int i = 0; i < count; i++) {
                    pstmt.setObject(1, paramsValue[i]);
                }
            }

            //执行查询
            rs = pstmt.executeQuery();
            //获取结果集元素
            ResultSetMetaData rsmd = rs.getMetaData();
            //获取列的个数
            int columnCount = rsmd.getColumnCount();

            //遍历rs
            while (rs.next()) {
                //要封装的对象
                t = clazz.newInstance();
                //遍历每一行的每一列,封装数据
                for (int i = 1; i < columnCount; i++) {
                    //获取每一列的列名称
                    String columnName = rsmd.getColumnName(i + 1);
                    //获取每一列的列名称对应的值
                    Object value = rs.getObject(columnName);
                    BeanUtils.copyProperty(t, columnName, value);
                }
                //把封装完毕的对象添加到集合中
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JdbcUtil.closeAll(conn, pstmt, rs);
        }
        //return null;
    }
}
  • 3.创建DemoDaoTest,进行测试
package com.ouya.util;

import org.junit.Test;

import java.util.List;

/**
 * Created by pc on 17-4-30.
 */
public class DemoDaoTest {
    DemoDao demoDao = new DemoDao();
    @Test
    public void testUpDate() {

        //删除
//        demoDao.delete(2);

        //插入
//        Admin admin = new Admin();
//        admin.setPwd("sss");
//        admin.setUsername("sss");
//        demoDao.insert(admin);

        //查询
        List<Admin> list = demoDao.getAll();
        System.out.println(list);
        //根据id查询
//        List<Admin> list = (List<Admin>) demoDao.findById(1);
//        System.out.println(list);
    }
}

  • 4.操作成功截图
id为2的数据已经删除了
插入成功

查询数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • DBUtils是Apache组织提供的一个能方便的对各种数据库进行操作的开源类库,它是一个对数据库操作的类库,把对...
    Dl_毛良伟阅读 3,226评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,477评论 19 139
  • JDBC概述 在Java中,数据库存取技术可分为如下几类:JDBC直接访问数据库、JDO技术、第三方O/R工具,如...
    usopp阅读 8,864评论 3 75
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 12,589评论 0 16
  • 关于Daily Scrum 1、站立会议维持在15分钟以内,团队成员只说今天做了什么,将要做什么,遇到什么困难。2...
    klsh_木木丿丿丿阅读 2,350评论 0 0