JDBC(12.11)

本文介绍了JDBC的基本概念,包括JDBC的作用、核心类(DriverManager、Connection、Statement和ResultSet)的使用方法,以及如何在项目中加载驱动和使用连接池(如C3P0)。此外,还讲解了dbUtils工具包的使用和事务管理的ACID特性。

目录

什么是JDBC?

如何使用JDBC


什么是JDBC?

JDBC就是通过java对数据库建立连接

JDBC的核心类:

 DriverManager(驱动管理者)
     1. 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
     2. 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
 
  Connection(数据库连接对象)       
   Connection最为重要的一个方法就是用来获取Statement对象

  Statement(SQL执行对象)
     作用:
     1.向数据库发送SQL
     2.执行SQL,并且获取执行结果
     核心方法:
     1. void executeUpdate(String sql):执行更新操作(insert、update、delete等);
     2. ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;

  ResultSet(结果集对象)
     将查询结果封装到Resultset结果集中。结果集是一个二维的表格,有行有列。
     核心方法:
     1. boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
     2. XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
     3. XXX getXXX(String colName):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。

如何使用JDBC

1.将对应版本的驱动包放入项目的lib目录下,然后将驱动包载入到项目中

2.加载驱动(通过Class类的forname方法通知系统加载对应驱动)

Class.forName("com.mysql.cj.jdbc.Driver");

3.获取连接

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/wte?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "root");
            

连接的组成分为三部分:

url:

jdbc:mysql:这是URL的固定前缀

localhost:3306:这是主机和端口号

wte:是数据库的名称

useUnicode=true&characterEncoding=utf8&useSSL=false:这是字符集,编码,加密的设置

user:账号

password:密码

4.创建执行对象并且执行sql语句(下例是执行DML语句的例子)

Statement statement = connection.createStatement();
String sql = "DELETE from `emp` where `empno`='"+ emp.getEmpno()+"'";
statement.executeUpdate(sql);
连接池

    作用:避免频繁地创建和销毁连接
    C3P0连接池使用步骤
        导入dbutils.jar包
        在src目录下新建c3p0-config.xml文件,在文件中写入配置
        创建工具类对象:public static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("mysql");
        获取连接对象: Connection con = comboPooledDataSource.getConnection
        归还连接对象: con.close()

dbUtil

    JDBC的工具类,封装了对数据库操作的方法
    使用方法:
        1.导入dbutils.jar包
        2.创建工具类对象

  ComboPooledDataSource ds = new ComboPooledDataSource("mysql");
  QueryRunner qr = new QueryRunner(qr);

主要方法:

查询:update(String sql,Object...params);

修改:query(String sql,ResultSetHandler rs,object...params);

resulthandler

作用:用于在关闭连接前处理结果集

实现类:

  ①ArrayHandler:把结果集中的第一行数据转成对象数组。
  ②ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
  ③BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  ④BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
  ⑤MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
  ⑥MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
  ⑦ColumnListHandler:将结果集中某一列的数据存放到List中。
  ⑧KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的列。
  ⑨ScalarHandler:获取结果集中第一行数据指定列的值,常用来进行单值查询

事务

    四大特性(ACID)
        原子性
            事务是一个完整的操作,各个步骤都不可分,要么都执行,要么都不执行
        一致性
            当事务完成时,数据必须一致
        隔离性
            并发的事务之间彼此隔离,不依赖或影响其他事务
        持久性
            事务完成后对数据库的修改是永久的

    构成
        开始:Begin
        主体
        结束:Commit

最新报错:2025-10-23 11:07:12,653 INFO aipaas [postgre_checkpointer.py-lifespan-120] [p-2496 t-140287704712192] (instance_id:c390e714-cb0a-483e-bdf0-fbe29eff2043 ip:12.11.6.98 trace_id:8bdf3189) 🛑 Application shutdown complete. ERROR: Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 732, in lifespan async with self.lifespan_context(app) as maybe_state: File "/usr/local/lib/python3.11/contextlib.py", line 204, in __aenter__ return await anext(self.gen) ^^^^^^^^^^^^^^^^^^^^^ File "/jupyter/workspace/iscp-app-aigc-ai/scm_agent/src/infrastructures/memory/postgre_checkpointer/postgre_checkpointer.py", line 115, in lifespan await app.state.cp_pool.get() # 启动时测试 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/jupyter/workspace/iscp-app-aigc-ai/scm_agent/src/infrastructures/memory/postgre_checkpointer/postgre_checkpointer.py", line 80, in get async with AsyncPostgresSaver.from_conn_string(self.db_url) as temp_saver: File "/usr/local/lib/python3.11/contextlib.py", line 204, in __aenter__ return await anext(self.gen) ^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/langgraph/checkpoint/postgres/aio.py", line 73, in from_conn_string async with await AsyncConnection.connect( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psycopg/connection_async.py", line 115, in connect params = await cls._get_connection_params(conninfo, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psycopg/connection_async.py", line 203, in _get_connection_params return conninfo_to_dict(conninfo, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psycopg/conninfo.py", line 82, in conninfo_to_dict opts = _parse_conninfo(conninfo) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/psycopg/conninfo.py", line 103, in _parse_conninfo raise e.ProgrammingError(str(ex)) from None psycopg.ProgrammingError: invalid connection option "postgresql+psycopg://jdbc_isc_agent:nKYjPC56mdxU%23%23@7.221.76.109:5432/agent?sslmode" ERROR: Application startup failed. Exiting.
10-24
### SQL: UPDATE DIM_TREE_EDIT_TMP s1 SET task_status = s2.taskStatus, last_update_date = s2.lastUpdateDate FROM ( WITH draft_tmp AS ( SELECT t1.dim_id, MAX( t2.last_update_date ) last_update_date FROM DIM_TREE_EDIT_TMP t1, dim_tree_node_draft_t t2 WHERE t1.dim_id = t2.dim_id AND t1.user_name_guid = t2.last_updated_by_guid AND t1.user_name_guid = ? GROUP BY t1.dim_id UNION ALL SELECT t1.dim_id, MAX( t2.last_update_date ) last_update_date FROM DIM_TREE_EDIT_TMP t1, dim_node_ref_draft_t t2 WHERE t1.dim_id = t2.rel_id AND t1.user_name_guid = t2.last_update_usercn_guid AND t1.user_name_guid = ? GROUP BY t1.dim_id ), process_tmp AS ( SELECT tb.rn, tb.creation_date, tb.STATE, tb.task_status, tb.business_target_id FROM ( SELECT ROW_NUMBER ( ) OVER ( PARTITION BY P.business_target_id ORDER BY P.creation_date DESC ) rn, P.creation_date, P.STATE, P.task_status, P.business_target_id FROM dim_process_instance_t P WHERE P.business_target_id IN ( SELECT dim_id FROM DIM_TREE_EDIT_TMP WHERE user_name_guid = ? ) AND applicant_guid = ? ) tb WHERE rn = 1 ) SELECT T.ID, T.dim_id AS dimId, T.cname, T.ename, CASE WHEN P.task_status = '待审批' OR P.task_status = '待审核' THEN '2' WHEN d.dim_id IS NOT NULL THEN '1' ELSE'3' END AS taskStatus, CASE WHEN P.task_status = '待审批' OR P.task_status = '待审核' THEN P.creation_date WHEN d.dim_id IS NOT NULL THEN d.last_update_date ELSE T.last_update_date END AS lastUpdateDate FROM DIM_TREE_EDIT_TMP T LEFT JOIN draft_tmp d ON T.dim_id = d.dim_id LEFT JOIN process_tmp P ON T.dim_id = P.business_target_id WHERE T.user_name_guid = ? ) s2 WHERE s1.ID = s2.ID ### Cause: com.huawei.opengauss.jdbc.util.PSQLException: [12.11.1.141:48510/7.203.211.124:8000] ERROR: deadlock detected
11-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值