Java基础——编写自己的JDBC框架

Java基础27~使用JDBC+连接池+反射编写简单的ORM框架 按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。道路是曲折的,前途是光明的!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!码讲义、实战项目、讲解视频,并且会持续更新!** 阅读详情

到现在我们先想想,我们学习了数据库操作哪些内容?????

  1. 先是JDBC入门学习,学习Java连接数据库

  2. 然后将连接数据库getConnection和释放连接release提取出来, 封装成jdbcutils

  3. 然后就是事务,主要是学习下面几个函数使用

    Connection.setAutoCommit(false);//开启事务(start transaction)
    
    Connection.rollback();//回滚事务(rollback)
    
    Connection.commit();//提交事务(commit)
    
    
    
    Savepoint sp = conn.setSavepoint();
    
    Conn.rollback(sp);
    
    Conn.commit();//回滚后必须通知数据库提交事务

     

  4. 然后就是学习数据库连接池,主要学习两个 DBCP和C3P0,主要是改进jdbcutils

  5. 然后就是编写自己的JDBC框架,说白了就是将CRUD整合成update函数和query函数


我们先来说说 update 万能更新

看看下面的几个sql语句

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'

DELETE FROM Person WHERE LastName = 'Wilson'

认真观察, 实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,我们就把sql语句拆分成一个框架sql语句和实体sql对象 String sql, Object params[]

这个好理解,所以写成万能update也简单

/**
    * @Method: update
    * @Description: 万能更新
    * @param sql 要执行的SQL
    * @param params 执行SQL时使用的参数
    * @throws SQLException
    */ 
    public static void update(String sql,Object params[]) throws SQLException{
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try{
            conn = getConnection();
            st = conn.prepareStatement(sql);
            for(int i=0;i<params.length;i++){
                st.setObject(i+1, params[i]);
            }
            st.executeUpdate();
            
        }finally{
            release(conn, st, rs);
        }
    }

 


但是!!!!!!

query不好理解,因为select * from table 这个* 不同select 就有不同的对象,所以写万能query就有点麻烦。

万幸有Object对象来指向它的万物子孙

Object obj = new Person() ; Object obj1 = new Cat() ; Object obj2 = new Shop() ; .......

因此, 我们需要将具体的类传入到参数中,来保存select查询的结果

我们来一步步看看用户的操作思路

首先,我们要从数据库中把我们想要查询的字段给查询出来嘛,

每个使用select 的用户知道数据库的table , 知道table包含哪些字段嘛, 所以就会设置相应的类来存储这些字段

不仅获取到table内容,

我们还要知道字段名,这个很重要 ,你想想,我们光光从数据库取出数据是不够的, 还要把数据装填给对象啊,

比如:select * from student ,执行了条sql后, 内容保存在哪里呢?

好吧,我们在java的domain 写个Student类, 然后new一个Student对象嘛,

但是咋个一一赋值呢? 所以我们要知道字段名,下面这几行代码就可以获取到,

    Connection conn = JdbcUtils.getConnection();
    String sql = "select * from account ";
    PreparedStatement st = conn.prepareStatement(sql);
    ResultSet rs = st.executeQuery();
    ResultSetMetaData metadata = rs.getMetaData();

弱弱解释一下ResultSetMetaData可以干什么事情,如下:

/**  
 * <p>Title: testResultSetMetaData</p>  
 * <p>Description:  获取结果集的元数据</p>    
 * @throws SQLException 
 * 
 * getColumnCount() 返回resultset对象的列数
 * getColumnName(int column) 获得指定列的名称
 * getColumnTypeName(int column)获得指定列的类型
 */

接下来就是写类, 类的成员变量要跟数据库的字段一一对应,

然后怎么把查询的字段内容复制给这个类呢???

我们来梳理一下正常操作流程,先查询数据库 ,获取到列名和列的内容,

用BeanUtils,将字段复制给类的对象

        while (rs.next()) {
            // 2.赋值给对象
            int colCount = metaData.getColumnCount();
            Account account = new Account();
            for (int i = 1; i <= colCount; i++) {
                String colName = metaData.getColumnName(i );
                Object objCol = rs.getObject(i);
                
                BeanUtils.setProperty(account, colName, objCol);
            }
            list.add(account);
        }

主要用到了BeanUtils ,这样就把列的内容复制给对象了

  • commons-beanutils-1.9.3.jar

  • commons-logging-1.2.jar

但这里也有一个问题, 就是sql 必须是select * from *** ,

如果用户不想用这条sql呢? 怎么办 , 比如:select name , money from account where id=?

那么就制定一个规则,用户要查询什么,就封装什么对象

比如你只想查询表中某几个字段的内容, 那么你就要将这几个字段封装成对象,

没办法, 系统不可能预先知道你要查询啥子吧,只有用户你自己知道,自己知道就自己动手封装

select id , name from account where id = xxx

抽取出来, 就是 :

框架 + 参数 + 对象

 

    String sqlString = " select id,money from account where name =? ";
    Object[] paramsObjects = { "aaa"};
    Account account = new Account();
    
    query(sqlString, paramsObjects, account);

然而, apache的dbutils不是使用BeanUtils ,肯定是自己写

也就是这句话BeanUtils.setProperty(account, colName, objCol); 要想办法重新写, 咋写????

反射,还记得吗?

需要自动化赋值类成员 的代码模板

    // 1.获取Class对象
    Class clazz = Class.forName("com.reflect.domain.Student");
    
    // 2.获取一个对象,或者调用者手动传进来一个
    Object obj = clazz.getConstructor().newInstance();// 产生Student对象--》Student stu = new Student();
    
    // 3.获取某个字段(可以是私有的)
    Field field1 = clazz.getDeclaredField("phoneNum");
    
    //  4.赋值
    field1.setAccessible(true);//暴力反射,解除私有限定
    field1.set(obj, "18888889999");

上面的phoneNum是成员变量,感觉好像不智能,,,,

getColumnName(int column) 获得指定列的名称 , 忘啦??? 这一步步来着呢

 

到现在就顺了,因为我们啥都理顺了,总结一下步骤:

  1. 使用jdbcutils连接数据库

  2. 用conn.prepareStatement(sql);预执行sql语句

  3. 获取结果集的元数据

  4. 使用反射给对象赋值

  5. binggo!!!

    /**
     * @param sql 用户传递的sql语句
     * @param params sql语句中包含的参数
     * @param obj 用户传进来的对象, 比如Account account = new Account();
     */
     public void query(String sql, Object[] params, Object obj) {
        // 1.首先,获取数据库的连接
        Connection conn = JdbcUtils.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        ResultSetMetaData metaData = null;
​
        try {
            //2.用conn.prepareStatement(sql);预执行sql语句
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }
            rs = ps.executeQuery();
​
            //3.获取结果集的元数据
            metaData = rs.getMetaData();
            int colCount = metaData.getColumnCount();
            
            //4.使用反射给对象赋值
            Class<? extends Object> clazz = obj.getClass();
            //这是好像应该用list,因为rs获取的结果有可能是多个
            while (rs.next()) {
                for (int i = 1; i <= colCount; i++) {
                    String colName = metaData.getColumnName(i);
                    Object objCol = rs.getObject(i);
​
                    //4.使用反射给对象赋值
                    Field field = clazz.getDeclaredField(colName);
                    field.setAccessible(true);
                    field.set(obj, objCol);
                }
            }
​
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.releaseConnection(conn, ps, rs);
        }
    }

上面就是JdbcUtils框架查询函数的流程, 只是说JdbcUtils框架将上面的函数做了处理,用BeanHandler 和BeanListHandler 来封装了上面一部分的代码,

感觉是不是高级些,取个名字都这么氧气?

BeanHandler 和BeanListHandler都实现了ResultSetHandler 这个接口, ResultSetHandler 是系统暴露给用户的接口

还是那个话,用户query数据库, 数据库返回结果集, 这个结果集该咋处理, 系统不知道, 只有用户知道,

用户要是都不知道, 那用户干嘛查询来了?????

既然用户知道,那我系统就给你一个接口, 你来实现呗,只要你按照我的框架协议写就好了

 

我们现在来看看上面的query如何改造嘛:

第1、2 步骤是标准数据库操作,这个不宜分离开来

第3、4步则是处理结果集合,我们想办法改造,说是改造, 还不如说向Apache的dbutils靠拢, 看看他们是怎么写的

我们来看看 3、4步,

传入的参数是ResultSet rs , 返回的是Object obj 或者是List<Object> ,这也说明了返回的结果不相同,众口难调,于是系统写个接口, 让用户自个儿实现

我们先想想,系统如何写接口???? 本身就这几行代码,系统能玩出什么花样????

既然是接口, 那么就要抽出共性,步骤4肯定不能, 因为返回的是Object的话,就没有while循环,如果是list,则有while循环,这个就是个性

步骤3又跟步骤4紧密联系,也不能作为共性,所以干脆来个猛的,

系统写个接口, 啥都不干,就来规范!!!

/**
* @ClassName: ResultSetHandler
* @Description:结果集处理器接口
*
*/ 
public interface ResultSetHandler {
    
    /**
    * @Method: handler
    * @Description: 结果集处理方法
    * @param rs 查询结果集
    * @return
    */ 
    public Object handler(ResultSet rs);
}

把个性的操作全部放在handler中实现,

接下来就是BeanHandler 和BeanListHandler , 一个是返回Ojbect 一个是返回list

一个个来

BeanHandler 其实就是不用while嘛

BeanHandler 写法,跟上面的代码有点不一样, 但说白了,都差不多, 我们来看嘛

/**
* @ClassName: BeanHandler
* @Description: 将结果集转换成bean对象的处理器
*
*/ 
public class BeanHandler implements ResultSetHandler {
    private Class<?> clazz;
    public BeanHandler(Class<?> clazz){
        this.clazz = clazz;
    }
    public Object handler(ResultSet rs) {
        try{
            if(!rs.next()){
                return null;
            }
            Object bean = clazz.newInstance();
            //得到结果集元数据
            ResultSetMetaData metadata = rs.getMetaData();
            int columnCount = metadata.getColumnCount();//得到结果集中有几列数据
            for(int i=0;i<columnCount;i++){
                String coulmnName = metadata.getColumnName(i+1);//得到每列的列名
                Object coulmnData = rs.getObject(i+1);
                Field f = clazz.getDeclaredField(coulmnName);//反射出类上列名对应的属性
                f.setAccessible(true);
                f.set(bean, coulmnData);
            }
            return bean;
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

BeanHandler 把clazz作为了成员变量, 然后遵守

public Object handler(ResultSet rs); 返回bean object

是不是差不多嘛???

不过它这里有点巧妙的,就是把clazz作为了成员变量 , 返回Object bean = clazz.newInstance(); 也就是传入进去的对象是什么,然后装填该对象, 返回的就是什么对象, 从这个角度来看,BeanHandler 像是一个容器,可以装可乐,也可以装芬达。。。。 但是主体框架没有变化,有点类似 Object obj = new student();

想哈我们怎么调用它嘛

(Account) JdbcUtils.query(sql, params, new BeanHandler(Account.class));

对不对, 传入的是BeanHandler框架,只是BeanHandler装的内容不一样,返回的就是该内容

 

BeanListHandler

其实也一样, 无非就多了个while循环嘛

看代码

/**
* @ClassName: BeanListHandler
* @Description: 将结果集转换成bean对象的list集合的处理器
*
*/ 
public class BeanListHandler implements ResultSetHandler {
    private Class<?> clazz;
    public BeanListHandler(Class<?> clazz){
        this.clazz = clazz;
    }
    
    public Object handler(ResultSet rs) {
        try{
            List<Object> list = new ArrayList<Object>();
            while(rs.next()){
                Object bean = clazz.newInstance();
                
                ResultSetMetaData  metadata = rs.getMetaData();
                int count = metadata.getColumnCount();
                for(int i=0;i<count;i++){
                    String name = metadata.getColumnName(i+1);
                    Object value = rs.getObject(name);
                    
                    Field f = bean.getClass().getDeclaredField(name);
                    f.setAccessible(true);
                    f.set(bean, value);
                }
                list.add(bean);
            }
            return list.size()>0?list:null;
        
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

是不是多了个while嘛?

然后看调用

(List<Account>) JdbcUtils.query(sql, params,new BeanListHandler(Account.class));

有点意思

 

 

我们回过头来说说query ,现在我们是不是改造了嘛,该咋写

第1、2步不变,第3、4步封装成接口,让用户自己去实现,实现的方式有BeanHandler 和BeanListHandler

所以

/**
    * @Method: query
    * @Description:万能查询
    * 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,
    * @param sql 要执行的SQL
    * @param params 执行SQL时使用的参数
    * @param rsh 查询返回的结果集处理器
    * @return
    * @throws SQLException
    */ 
    public static Object query(String sql,Object params[],ResultSetHandler rsh) throws SQLException{
        // 1.首先,获取数据库的连接
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        
        try{
            conn = getConnection();
            //2.用conn.prepareStatement(sql);预执行sql语句
            st = conn.prepareStatement(sql);
            for(int i=0;i<params.length;i++){
                st.setObject(i+1, params[i]);
            }
            rs = st.executeQuery();
            /**
             * 对于查询返回的结果集处理使用到了策略模式,
             * 在设计query方法时,query方法事先是无法知道用户对返回的查询结果集如何进行处理的,
             * 即不知道结果集的处理策略,
             * 那么这个结果集的处理策略就让用户自己提供,query方法内部就调用用户提交的结果集处理
             * 策略进行处理
             * 为了能够让用户提供结果集的处理策略,需要对用户暴露出一个结果集处理接口ResultSetHandler
             * 用户只要实现了ResultSetHandler接口,那么query方法内部就知道用户要如何处理结果集了
             */
            return rsh.handler(rs);
            
        }finally{
            release(conn, st, rs);
        }
    }

基本上就说完了。接下来我们学习Apache的dbutils

Java与数据库操作与框架 通过ORM框架,可以使用对象来表示数据库中的数据,从而避免了直接使用SQL语句进行数据库操作时可能出现的错误。它提供了一种标准的方法来使用SQL语句与数据库进行交互。当使用executeQuery()方法执行查询语句时,Statement对象返回一个ResultSet对象,用于存储查询结果。它提供了一种简单的方法来执行各种数据库操作,包括与数据库建立连接、创建和执行SQL语句、处理异常、关闭连接等。使用JdbcTemplate对象执行SQL语句,使用Spring JDBC框架的API来实现与数据库的交互。 阅读详情

相关推荐

轻量级的java数据源jdbc框架

非常小巧的基于c3p0数据源和纯java的jdbc原生写的数据源框架,支持多数据源连接,mysql,oracle,sqlserver等等。方便小巧,侵入性低,与任何框架都易于集成和使用。

java框架004——jdbc(Java Database Connectivity)包括MySQL的安装和使用教程

一、JDBC简介 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源 JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。 JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了

weixin_45084986的博客 824

从零开始掌握Python机器学习:七步教程 基础篇

前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。 第一步:基本 Python 技能 如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。 首先,你需要安装 Python。因为我们后...

hcgx2018的博客 1613

java实现JDBC连接(三) JdbcFramework数据框架

获取结果集的列名称、根据列的名称查找属性、将属性的首字母转换大写。

weixin_47276069的博客 307

ROS TF坐标转换实战:从零搭建机器人坐标系(附常见问题排查)

本文提供了一份ROS TF坐标转换的实战指南,详细讲解了如何从零为机器人搭建完整的坐标系,并深入解析了TF的原理。内容涵盖静态与动态坐标变换的发布、URDF模型使用、以及Rviz和rqt_tf_tree等可视化调试工具。文章还附带了常见问题排查表,帮助开发者快速定位并解决TF树断裂、数据错位等典型问题。

weixin_29268385的博客 204

Grey Hack v0.7.3618 保姆级教程:手把手教你用metaxploit.so写一个自动提权脚本

本文详细介绍了如何在Grey Hack v0.7.3618中使用metaxploit.so库编写自动化提权脚本。从环境准备到核心功能解析,再到漏洞利用链构建和权限提升的智能处理,手把手教你掌握游戏中的高级黑客技巧。通过多库联合利用和错误处理优化,提升脚本的效率和成功率。

weixin_42537919的博客 394

Java中jdbc的框架

使用框架可以简化代码,提高开发效率,所以了解和掌握一些框架也是必须的,下面简单介绍几个jdbc框架: 1.jdbcTemplate Spring提供 2.commons-dbutils Apache提供,小巧的jdbc轻量级封装的工具包,主要是对结果集的封装 3.Hibernate 开放源代码的对象关系映射框架,对jdbc进行了非常轻量级的对象封装 4.ibatis/MyBatis 比Hibernate轻便 5.jdbm 为用Perl, Python, C等作为jdbm的Java应用程序

Javaesandyou的博客 2336

别再瞎调参数了!分子动力学模拟新手必看的力场选择与验证实战指南

本文为分子动力学模拟新手提供力场选择与验证的实战指南,详细解析主流力场特性及适用场景,并通过水分子案例演示完整的验证流程。文章重点对比SPC/E、TIP3P和OPLS-AA三种力场在GROMACS中的表现,帮助读者避免常见参数调整误区,提升模拟准确性。

weixin_26934905的博客 425

深入解析JDBC与ORM框架:Java程序员的数据库操作利器

本文深入探讨了Java开发中与数据库交互的两种核心技术:JDBC和ORM框架,旨在帮助Java程序员或初学者更好地理解和应用这些技术,提升开发效率和代码质量。

小L的博客 1605

STM32G0实战:手把手教你用国产GD25Q16 Flash存储传感器数据(附完整驱动)

本文详细介绍了如何使用国产GD25Q16 Flash芯片与STM32G0系列MCU实现传感器数据存储的完整方案。从SPI接口配置、驱动层实现到存储系统架构设计,提供了实战代码和优化策略,帮助开发者快速构建高性价比的物联网数据存储系统。

weixin_30733003的博客 106

【RT-DETR涨点改进】全网独家创新,卷积细节涨点改进篇 | TCSVT 2025 | 引入DGBM差分专家引导双向调制模块,利用双向仿射调制实现特征分布对齐,含多种创新改进,助力小目标检测高效涨点

本文提出DGBM差分专家引导双向调制模块,用于改进RT-DETR目标检测网络。该模块通过差分建模突出不同层级特征的独特信息,利用双向调制实现特征分布对齐,增强局部细节与全局语义的协同表达。DGBM包含差分专家机制、物理反演建模和双向仿射调制三个关键部分,能有效解决CNN与Transformer特征融合冲突问题。实验表明,该方法可提升复杂场景下的检测精度,降低误检漏检率,且模块具有可插拔、易集成的特点。文章详细介绍了模块结构、原理、优势及具体实现代码,并提供了四种RT-DETR改进方案的yaml配置文件。

Ai缝合怪、助力小伙伴高效发论文 441

Java 编写自己的JDBC框架

元数据- DataBaseMetaData 元数据:数据库、表、列的定义信息。 Connection.getDatabaseMetaData() DataBaseMetaData对象 getURL():返回一个String类对象,代表数据库的URL。 getUserName():返回连接当前数据库管理系统的用户名。 getDatabaseProductName():返回数据库的产...

jeanboy 913

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

722

java jdbc doc_javaweb编写自己的jdbc框架.doc

javaweb编写自己的jdbc框架.doc javaweb编写自己的JDBC框架一、元数据介绍元数据指的是“数据库“、“表“、“列“的定义信息。1.1、DataBaseMetaData元数据Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象。DataBaseMetaData对象的常用方法:getUR...

weixin_35705784的博客 96

RISC-V CPU设计(三)---多周期CPU的设计与实现

基本情况 本多周期CPU支持RV32I指令集(fence,ecall,ebreak除外),已通过部分指令的测试,如代码有bug,欢迎指出。 模块划分 代码将CPU划分为以下几个模块: 1.控制单元:ControlUnit 用于产生控制信号,是CPU的大脑,指挥中枢。 2.分支决策单元:BranchUnit 用于决定B型指令是否发生跳转 3.立即数单元:ImmUnit 用于从指令中解析出立即数. 4.寄存器堆:RegisterFile RISC-V的32个寄存器,其中x0寄存器恒为0,不可更改。 5.指令存储

qq_40268672的博客 5542

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java web学习总结40:编写自己的JDBC框架

一、元数据介绍   元数据指的是"数据库"、"表"、"列"的定义信息。 1.1、DataBaseMetaData元数据   Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象。   DataBaseMetaData对象的常用方法: getURL():返回一个String类对象

云潇洒 360

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

11 csdn java 王少飞-编写自己的JDBC框架

JNDI技术简介 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包, 这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。 其核心API为Context,它代表JNDI容器,其

Dream_Mr.wang的专栏 597

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java Web基础入门第五十九讲 编写自己的JDBC框架

元数据介绍元数据指的是”数据库”、”表”、”列”的定义信息。DataBaseMetaData元数据Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象。 DataBaseMetaData对象的常用方法: getURL():返回一个String类对象,代表数据库的URL。 getUserName():返回

李阿昀的博客 2833

Java基础27~使用JDBC+连接池+反射编写简单的ORM框架,linux运维学习

@Test public void testJDBC(){ try (Connection conn = DriverManager.getConnection(URL,“root”,“123456”)){ Statement statement = conn.createStatement(); String sql = “insert into students(stu_name,stu_age,stu_gender,stu_class_id) values(‘张三’,20,‘男’,1)”; int r

m0_64204730的博客 178
上一篇: javaweb学习总结(三十八)——事务
big_bit
博客等级 码龄11年 67粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值