java连接数据库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这篇demo是有关于java连接数据库的方式


提示:以下是本篇文章正文内容,下面案例可供参考

一、JDBC是什么?

jdbc是java databases conn;一个Java连接数据库的接口,本文介绍的是java和mysql的jdbc

二、使用步骤

1.下载java-mysql的jar包

下载地址:https://dev.mysql.com/downloads/connector/j/
进入下面的页面选择适合自己的jar下载
在这里插入图片描述

2.部署jar包到项目

  1. 讲下载的jar包放到工程的lib目录下
    在这里插入图片描述

  2. 部署jar包为项目依赖(右击lib下的jar包add as library)
    . 在这里插入图片描述

3.JDBC工具类

示例代码,仅供参考

 final static String URL="jdbc:mysql://127.0.0.1:3306/databases";
    final static String USER="userName";
    final static String PWD="passward";
    public static Connection createConn(){
        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接
            return DriverManager.getConnection(URL, USER, PWD);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 关闭资源
     * @param conn 链接
     * @param stat 陈述
     */
    public static void close(Connection conn, Statement stat, ResultSet resultSet){

        if(resultSet!=null){
            try{
                resultSet.close();
            }catch (Exception e){

            }
        }

        if(conn!=null){
            try {
                conn.close();
            }catch (Exception e){

            }

        }

        if(stat!=null){
            try {
                stat.close();
            }catch (Exception e){

            }
        }


    }

    //注意:每一个sql语句对应他的预处理参数
    public static boolean trancPreDML(List<String> sqlList,List<Object>...params){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = DBUtil.createConn();
            //设置事务提交方式为非自动提交
            conn.setAutoCommit(false);
            //执行语句
            for (int j=0;j<sqlList.size();j++) {
                ps = conn.prepareStatement(sqlList.get(j));
                //如何进行赋值操作,给 ?占位符进行赋值操作
                // 个数通过可变参数获取
                List<Object> param = params[j];
                for (int i = 0;i<param.size();i++){
                    //在SQL中 ? 从1开始,现在i = 0开始,需要注意
                    ps.setObject(i+1,param.get(i));
                }
                // 进行陈述 返回结果集
                int result = ps.executeUpdate();
            }
            conn.commit();
            return true;
        }catch (Exception e){
            try {
                conn.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }finally {
            close(conn,ps,null);
        }
        return false;
    }
        /**
         * 完成增,删,改 共同操作
         * @param sql 增,删,改 任意sql
         * @param params 参数对当前SQL中?赋值操作
         * @return 结果集 返回SQL的影响的行数
         */
        public static int preDML(String sql,Object... params){
            Connection conn = null;
            PreparedStatement ps = null;

            try {
//            conn = DBUtil.getConn();
                conn = DBUtil.createConn();
                ps = conn.prepareStatement(sql);
                //如何进行赋值操作,给 ?占位符进行赋值操作
                // 个数通过可变参数获取
                for (int i = 0;i<params.length;i++){
                    //在SQL中 ? 从1开始,现在i = 0开始,需要注意
                    ps.setObject(i+1,params[i]);
                }
                // 进行陈述 返回结果集
                return ps.executeUpdate();

            }catch (Exception e){

            }finally {
                DBUtil.close(conn,ps,null);
            }

            return 0;
        }

        /**
         * 对于任意一张表,任意一个SQL查询,都可以进行数据查询 一行数据
         * @param clazz 告诉表对应 实体bean,就是指具体类型
         * @param sql  操作当前表 查询
         * @param params 对当前 占位符赋值操作
         * @param <T> 操作完成返回的具体类型
         * @return
         */
        public static <T> T preQuery(Class<T> clazz,String sql, Object... params ){
            //声明三个对象 JDBC
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            // 异常处理
            try {
                conn = DBUtil.createConn();
                ps = conn.prepareStatement(sql);
                // 给当前的占位符进行赋值操作
                for (int i = 0; i <params.length ; i++) {
                    ps.setObject(i+1,params[i]);
                }
                rs = ps.executeQuery();
                //通过元数据获取到所有列的数量,获取到当前列名字
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();
                if(rs.next()){
                    T t = clazz.newInstance(); // newInstance 这个方法调用无参
                    for (int i = 0; i <columnCount ; i++) {
                        // 获取列的名字 rsmd中
                        String columnName = rsmd.getColumnName(i + 1);
                        // 获取列的数据 rs中
                        Object value = rs.getObject(i + 1);
                        // 可以通过反射,获取到当前属性对象,然后通过回调方式进行赋值操作
                        Field field = clazz.getDeclaredField(columnName);
                        // 进行破解当前私有属性
                        field.setAccessible(true);
                        // 回调
                        field.set(t,value);
                        //关闭权限
                        field.setAccessible(false);
                    }

                    return t;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                DBUtil.close(conn,ps,rs);
            }

            return null;
        }

        /**
         *当前这个方法不支持Blob存储,不是万能
         * @param clazz 类型
         * @param sql sql语句
         * @param params  对sql语句??进行赋值操作
         * @param <T> 如果list 中size 是 0,当前查询失败,如果1 就查询一条数据,list.get(0) 获取当前数据
         * @return
         */
        public static <T> List<T> preQueryAll(Class<T> clazz, String sql, Object... params){

            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            List<T> list = new ArrayList<>();
            try {
                conn = DBUtil.createConn();
                ps = conn.prepareStatement(sql);
                for (int i = 0; i <params.length; i++) {
                    ps.setObject(i+1,params[i]);
                }
                rs = ps.executeQuery();
                ResultSetMetaData rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount();
                while (rs.next()){
                    // 获取每一行,行中列不变
                    T t = clazz.newInstance();
                    for (int i = 0; i <columnCount ; i++) {
                        // 列的名字 列的数据
                        String columnName = rsmd.getColumnLabel(i + 1);
                        Object value = rs.getObject(i + 1);
                        // 列的名字和类中属性名字一致,所以可以使用反射
                        Field field = clazz.getDeclaredField(columnName);
                        field.setAccessible(true);
                        //回调
                        field.set(t,value);
                        field.setAccessible(false);
                    }
                    list.add(t);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                DBUtil.close(conn,ps,rs);
            }
            return list;
        }
## 4.测试连接
在单体测试框架中测试

@Test
public void testConn(){
Connection conn = DBUtil.createConn();
System.out.println(conn);
}

如果输出结果不为空则java连接mysql成功
# 总结
注意在连接过程中,数据库的配置,版本都以及jdbc的版本都要兼容,可能导致连接失败

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值