java基础之jdbc

本文档详细介绍了如何使用JDBC进行数据库操作,包括配置数据库连接信息、读取配置文件、建立连接、关闭资源、添加修改删除及查询方法。此外,还展示了通用DAO层的实现,包括通过Map集合优化查询、分页查询等实用功能。
摘要由CSDN通过智能技术生成

JDBC案例

1.在DBHelper类中写参数信息

import com.sun.media.sound.SoftTuning;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.List;
import java.util.Properties;

/**
 * JDBC
 */
public class DBHelper {

    //设置url ,建立链接时,指向数据库的地址
    private static String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
    //设置遍历和用户建立连接
    private static String driver = "com.mysql.jdbc.Driver";
    //账号
    private static String username = "root";
    //密码
    private static String password = "root";
    //链接对象
    private static Connection conn;
    //预编译对象
    private static PreparedStatement ps;
    //返回结果对象
    private static ResultSet rs;
    //私有构造函数,避免创建该类
    private DBHelper() {
    }
    
    static {
        try {
            //加载驱动
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //建立链接并返回链接对象
    public static Connection getConn() {
        try {
            //如果已经存在该链接对象,直接返回
            if(conn!=null)return conn;
            //建立链接
            conn= DriverManager.getConnection(url, username, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
//    关闭资源
    public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if (conn != null) conn.close();
            if (ps != null) ps.close();
            if (rs != null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static void close(Connection conn, PreparedStatement ps) {
        close(conn, ps, null);
    }
    public static void close(Connection conn) {
        close(conn, null, null);
    }

}

2.读取配置文件,然后进行建立链接的JDBC

DBHelper.properties配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/school?useSSL\=false&serverTimezone\=UTC&characterEncoding\=utf8
jdbc.username=root
jdbc.password=root

JDBC文件

package cn.hp.demo3;

import com.sun.media.sound.SoftTuning;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.List;
import java.util.Properties;

/**
 * JDBC
 */
public class DBHelper {

   //设置url ,建立链接时,指向数据库的地址
    private static String url = "";
    //设置遍历和用户建立连接
    private static String driver = "";
    //账号
    private static String username = "";
    //密码
    private static String password = "";
    //链接对象
    private static Connection conn;
    //预编译对象
    private static PreparedStatement ps;
    //返回结果对象
    private static ResultSet rs;
    //私有构造函数,避免创建该类
    private DBHelper() {
    }
    /**
     * 读取配置文件信息,
     */
    private static void init(){
        //获取Properties对象
        Properties p= new Properties();
        try {
            //Properties对象获取资源文件的输入流
            p.load(new FileInputStream("DBHelper.properties"));
            driver=p.getProperty("jdbc.driver");
            url=p.getProperty("jdbc.url");
            username=p.getProperty("jdbc.username");
            password=p.getProperty("jdbc.password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static {
        //配置信息初始化
        init();
        try {
            //加载驱动
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //建立链接并返回链接对象
    public static Connection getConn() {
        try {
            //如果已经存在该链接对象,直接返回
            if(conn!=null)return conn;
            //建立链接
            conn= DriverManager.getConnection(url, username, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
//    关闭资源
    public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if (conn != null) conn.close();
            if (ps != null) ps.close();
            if (rs != null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static void close(Connection conn, PreparedStatement ps) {
        close(conn, ps, null);
    }
    public static void close(Connection conn) {
        close(conn, null, null);
    }

}

3.添加修改删除方法

/**
 * 添加,修改删除
 * @param sql
 * @param obj
 */
public static void addOrUppOrDel (String sql, Object ... obj){
   getConn();//1.建立链接
        try {
            ps = conn.prepareStatement(sql);//2.获取预编译对象
            //3.参数赋值
            if(obj!=null){
                for (int i=0; i < obj.length; i++) {
                    Object o = obj[i];
                    ps.setObject(i+1, o);
                }
            }
            //4、执行
            int i = ps.executeUpdate();
        System.out.println(i);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

4.查询方法

public static void select(String sql,Object ...obj){
    getConn();//1.建立链接
    try {
        ps = conn.prepareStatement(sql);//2.获取预编译对象
        //3.参数赋值
        if(obj!=null){
            for (int i=0; i < obj.length; i++) {
                Object o = obj[i];
                ps.setObject(i+1, o);
            }
        }
    	//4、执行
        rs= ps.executeQuery();
        //5.结果进行获取输出
        while (rs.next()) {
            System.out.println(rs.getObject("id"));
            System.out.println(rs.getObject("type_name"));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

5.通过Map集合,优化数据库查询方法

/**
     * 查询方法
     * @param sql sql语句
     * @param obj 参数
     * @return List<Map> 
     */
    public static List<Map> select(String sql, Object...obj) {
        List<Map> list = new ArrayList<>();
//        1.建立连接
        getConn();
        try {
//        2.创建语句对象,预编译
            ps = conn.prepareStatement(sql);
//        3.参数处理    itar 普通for循环
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
//        4.执行sql,得到结果集
            rs = ps.executeQuery();
            ResultSetMetaData metaData = rs.getMetaData();//元数据,查询的数据结构
            while (rs.next()) {
                Map map = new HashMap();
                int columnCount = metaData.getColumnCount();//字段的列数,id,name  获取的就是2
                for (int i = 0; i < columnCount; i++) {
                    //metaData.getColumnLabel(i+1)//这个的从1开始获取第几列的字段名称
                    //rs.getObject(i+1)//根据列数(从1开始)数据集中的数据
                    map.put(metaData.getColumnLabel(i+1), rs.getObject(i+1));
                }
                list.add(map);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, ps, rs);
        }
//        5.返回结果集
        return null;
    }

通用版的dao层

package cn.hp.util;

import java.util.List;
import java.util.Map;
public class BeanDao {

    /**
     * 查询所有
     * @param sql sql语句
     * @param obj 参数
     */
    public static List<Map> findAll(String sql, Object... obj) {
        return DBHelper.select(sql, obj);
    }

    /**
     * 修改方法
     * @param sql sql语句
     * @param obj 参数
     */
    public int update(String sql, Object... obj) {
        return DBHelper.update(sql, obj);
    }

    /**
     * 单个查询
     *
     * @param sql sql
     * @param obj 参数
     * @return
     */
    public Map getOne(String sql, Object... obj) {
        List<Map> list = DBHelper.select(sql, obj);
        if (list != null && list.size() > 0) {
            return list.get(0);
        }
        return null;
    }

    /**
     * 分页查询
     *
     * @param sql
     * @param page  当前页
     * @param limit 每页的条数
     * @return
     */
    public static PageBean selectPage(String sql, Integer page, Integer limit, Object... obj) {
        int totalCount = getCount(sql, obj);//获取总行数
        int totalPages = totalCount % limit == 0 ? (totalCount / limit) : (totalCount / limit) + 1;//总页数
        int startIndex = (page - 1) * limit;//开始条数
        sql = sql + " limit " + startIndex + "," + limit;//添加分页条件
        List<Map> list = DBHelper.select(sql, obj);
        PageBean pageBean = new PageBean(page, limit, totalCount, totalPages, list);//分页
        return pageBean;
    }

    /**
     * 查询总条数
     * @param sql
     * @return
     */
    private static int getCount(String sql, Object... obj) {
        int num = 0;
        List<Map> list = DBHelper.select("select count(*) num from (" + sql + ") z", obj);
        if (list != null) {
            num =  Integer.valueOf(list.get(0).get("num").toString());
        }
        return num;
    }

    public static void main(String[] args) {
        PageBean pageBean = selectPage("select * from emp", 2, 2);
        System.out.println(pageBean);

    }
}

通过反射,封装操作数据库的方法基类

package cn.hp.web.dao.impl;


import cn.hp.web.util.DBHelper;
import cn.hp.web.util.DBHelper2;
import cn.hp.web.util.PageBean;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BeanDao {


    /**
     * 升级后的查询方法
     *
     * @param sql sql语句
     * @param obj 参数
     * @return 升级
     */
    public static <T> List<T> select(String sql, Class<T> clz, Object... obj) {
        System.out.println(sql);
        for (int i = 0; i < obj.length; i++) {
            Object o = obj[i];
            System.out.println(o);
        }
        //        1.建立连接
        Connection conn = DBHelper2.getConn();
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<T> list = new ArrayList<T>();
        try {
//        2.创建语句对象,预编译
            ps = conn.prepareStatement(sql);
//        3.参数处理    itar 普通for循环
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
//        4.执行sql,得到结果集
            rs = ps.executeQuery();
            while (rs.next()) {
//                手动进行数据处理
//                Dept dept = new Dept();
//                dept.setId(rs.getInt("id"));
//                dept.setName(rs.getString("name"));
                //通过反射将数据集转换成对应的实体(比如Dept)
                T bean = toDataChange(rs, clz);
                list.add(bean);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper2.close(conn, ps, rs);
        }
//        5.返回转换后的集合
        return list;
    }

    /**
     * 具体的转换方法
     *
     * @param rs
     * @param clz
     * @param <T>
     * @return
     */
    private static <T> T toDataChange(ResultSet rs, Class<T> clz) {
        try {
            T bean = clz.newInstance();//获取clz 的实例
            ResultSetMetaData metaData = rs.getMetaData();//元数据,查询的数据结构
            int columnCount = metaData.getColumnCount();//字段的列数,id,name  获取的就是2
            for (int i = 0; i < columnCount; i++) {
                String key = metaData.getColumnLabel(i + 1);//这个的从1开始获取第几列的字段名称         -->列名
                Object value = rs.getObject(key);//根据列名获取数据集中的数据
                Field field = clz.getDeclaredField(key);//获取实体类中指定的字段对象
                field.setAccessible(true);//给赋值提速
                field.set(bean, value);//给实体对应字段具体赋值
            }
            return bean;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 修改方法
     *
     * @param sql sql语句
     * @param obj 参数
     * @return
     */
    public int update(String sql, Object... obj) {
        System.out.println(sql);
        for (int i = 0; i < obj.length; i++) {
            Object o = obj[i];
            System.out.println(o);
        }
        int count = 0;
//        1.建立连接
        Connection conn = DBHelper2.getConn();
        PreparedStatement ps = null;
        try {
//        2.创建语句对象,预编译
            ps = conn.prepareStatement(sql);
//        3.参数处理    itar 普通for循环
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
//        4.执行sql,得到影响的条数
            count = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBHelper2.close(conn, ps);
        }
//        5.返回影响的条数
        return count;
    }

    /**
     * 单个查询
     *
     * @param sql sql
     * @param clz 要返回的实体
     * @param obj 参数
     * @param <T>
     * @return
     */
    public <T> T findByOne(String sql, Class<T> clz, Object... obj) {
        List<T> list = select(sql, clz, obj);
        if (list != null && list.size() > 0) {
            return list.get(0);
        }
        return null;
    }

    /**
     * 分页查询
     * @param sql
     * @param page  当前页
     * @param limit 每页的条数
     * @param clz
     * @param obj   参数
     * @param <T>
     * @return
     */
    public <T> PageBean<T> selectPage(String sql, Integer page, Integer limit, Class<T> clz, Object... obj){
        int totalCount = getCount(sql, obj);
        int totalPages = totalCount%limit==0?(totalCount/limit):(totalCount/limit)+1;//总页数

        int startIndex=(page-1)*limit;//开始条数
        sql= sql + " limit "+startIndex+","+limit;//添加分页条件

        List<T> list = select(sql, clz, obj);
        PageBean<T> pageBean = new PageBean<T>(page, limit, totalCount, totalPages, list);
        return  pageBean;
    }

    /**
     * 查询总条数
     * @param sql
     * @return
     */
    private int getCount(String sql, Object... obj) {
        int num = 0;
//        1.建立连接
        Connection conn = DBHelper2.getConn();
        PreparedStatement ps = null;
        ResultSet rs =null;
        try {
//        2.创建语句对象,预编译
            ps = conn.prepareStatement("select count(*) num from ("+sql+") z");
//        3.参数处理    itar 普通for循环
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i + 1, obj[i]);
            }
//        4.执行sql,得到影响的条数
            rs = ps.executeQuery();
            while(rs.next()){
                num=rs.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBHelper2.close(conn, ps, rs);
        }
//        5.返回总行数
        return num;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由自在1039

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值