JDBC优化

Java基础

浏览数:104

2019-8-23

AD:资源代下载服务

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的数据已经删除了
插入成功


查询数据

作者:Dl_毛良伟