jdbc和连接池对于你这个场景来说,都足够,既然用spring管理了,建议还是使用连接池,另外,spring自身没有实现连接池,一般都是对第三方连接池的包装,常见的有C3P0,dbcp以及最近比较流行的boneCP等,这几个配置都差不多太多,以boneCP为例:
<bean id="dataSource" class="comjolboxbonecpBoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbcdriverClass}" />
<property name="jdbcUrl" value="${jdbcurl}" />
<property name="username" value="${jdbcuser}" />
<property name="password" value="${jdbcpassword}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jdbcTemplate" class="orgspringframeworkjdbccoreJdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
现有俩表A,B,A表有主键,B表建立外键关联到A表
修改A表,若修改之后的结果是B表外键字段的值在A表中找不到了,则会报错,不允许进行此修改,其他情况可以任意修改。
修改B表,必须保证修改后B表外键字段的值依然能在A表中找到,否则会报错。
俩表自己的修改,只会影响自己表的数据,对其他表无影响。
你好,这种功能的实现方法有很多。下面提供两种方案。
1 建立级联
2 建立触发器
参见下面的代码,有问题再追问。
-- 建立测试环境-- 创建测试主表 ID 是主键
CREATE TABLE test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表
CREATE TABLE test_sub (
id INT NOT NULL,
main_id INT ,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
方法一、级联
-- 增加外键约束, 实现级联删除
-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)
ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCEStest_main ON DELETE CASCADE;
-- 测试删除主表数据 将成功地执行
DELETE TEST_MAIN WHERE ID = 1;
-- 测试检索子表,应该只有一条 main_id = 2 的数据
SELECT FROM test_sub;
go
(1 行受影响)
id main_id value
----------- ----------- ----------
2 2 TWOTWO
(1 行受影响)
方法二、建立触发器进行删除
IF EXISTS (SELECT NAME FROM SYSOBJECTS
WHERE NAME = 'DEL_TR' AND TYPE = 'TR')
DROP TRIGGER DEL_TR
GO
CREATE TRIGGER DEL_TR
ON TEST_MAIN
FOR DELETE
AS
IF (SELECT COUNT() FROM DELETED) > 0
DELETE FROM TEST_SUB WHERE ID IN (SELECT ID FROM DELETED)
GO
Oracle、DB2、SQL Server 都支持。
MySQL 触发器不支持 。
-- 创建测试主表 ID 是主键
CREATE TABLE test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表
CREATE TABLE test_sub (
id INT NOT NULL,
main_id INT ,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
Oracle
-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;
CREATE OR REPLACE TRIGGER BeforeDeleteTest_sub
BEFORE DELETE ON test_sub
FOR EACH ROW
BEGIN
dbms_outputput_line('BEFORE DELETE test_sub');
dbms_outputput_line('Old value = ' || :oldvalue );
END;
/
SQL> set serveroutput on
SQL> -- 测试删除主表数据 将成功地执行
SQL> DELETE
2 TEST_MAIN
3 WHERE
4 ID = 1;
BEFORE DELETE test_sub
Old value = ONEONE
已删除 1 行。
SQL>
SQL> -- 测试检索子表,应该只有一条 main_id = 2 的数据
SQL> SELECT
2
3 FROM
4 test_sub;
ID MAIN_ID VALUE
---------- ---------- --------------------
2 2 TWOTWO
DB2
-- 日志信息表
CREATE TABLE log_table ( log_data varchar(50));
-- 触发器
CREATE TRIGGER AfterDeleteTest_sub
AFTER DELETE ON test_sub
REFERENCING OLD AS O
FOR EACH ROW
BEGIN
INSERT INTO log_table VALUES ( 'Delete value = ' || Ovalue );
END
@
-- 外键约束
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id)
REFERENCES test_main ON DELETE CASCADE;
-- 测试删除主表数据 将成功地执行
DELETE
TEST_MAIN
WHERE
ID = 1;
-- 检查日志信息表,看看触发器是否被触发
db2 => SELECT FROM log_table;
LOG_DATA
--------------------------------------------------
Delete value = ONEONE
1 条记录已选择。
-- 测试检索子表,应该只有一条 main_id = 2 的数据
db2 => SELECT FROM test_sub;
ID MAIN_ID VALUE
----------- ----------- ----------
2 2 TWOTWO
1 条记录已选择。
SQL Server
-- 触发器
CREATE TRIGGER AfterDeleteTest_sub
ON Test_sub
FOR DELETE
AS
DECLARE
@OldValue VARCHAR(10);
BEGIN
PRINT('AFTER DELETE');
SELECT @OldValue = value FROM deleted;
PRINT('Old Value = ' + @OldValue);
END;
go
-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;
GO
-- 测试删除主表数据 将成功地执行
1> DELETE TEST_MAIN WHERE ID = 1;
2> GO
AFTER DELETE
Old Value = ONEONE
(1 行受影响)
-- 测试检索子表,应该只有一条 main_id = 2 的数据
SELECT
FROM
test_sub;
go
(1 行受影响)
id main_id value
----------- ----------- ----------
2 2 TWOTWO
(1 行受影响)
MySQL
-- 日志信息表
CREATE TABLE log_table ( log_data varchar(50));
-- 触发器
DELIMITER //
CREATE TRIGGER BeforeDeleteTest_sub
BEFORE DELETE ON Test_sub
FOR EACH ROW
BEGIN
INSERT INTO log_table VALUES ( CONCAT('Delete Value = ', oldValue) );
END;
//
DELIMITER ;
-- 外键
ALTER TABLE test_sub ADD CONSTRAINT fk_main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main(id)
ON DELETE CASCADE;
-- 删除
DELETE FROM test_main WHERE id = 1;
-- 检查日志信息表,看看触发器是否被触发
mysql> SELECT FROM log_table;
Empty set (000 sec)
MySQL 外键级联删除, 不会触发 子表的触发器
-- 测试检索子表,应该只有一条 main_id = 2 的数据
mysql> SELECT FROM test_sub;
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | 2 | TWOTWO |
+----+---------+--------+
1 row in set (000 sec)
>
String driverName = "commysqljdbcDriver"; // 加载JDBC驱动
String dbURL = "jdbc:mysql://localhost:3306/test"; // 连接服务器和数据库test
String userName = "sa"; // 默认用户名
String userPwd = "sa"; // 密码
javasqlConnection dbConn;
try {
ClassforName(driverName)newInstance();
dbConn = javasqlDriverManagergetConnection(dbURL, userName, userPwd);
Systemoutprintln("Connection Successful!"); //如果连接成功 控制台输出Connection Successful!
} catch (ClassNotFoundException e) {
Systemoutprintln("没有找到驱动");
} catch (Exception e) {
// TODO: handle exception
eprintStackTrace();
}
还是直接上代码吧。
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=one";
这种不是纯jdbc驱动,用这种方式连接数据库还需要几个类包的,分别是msbasejar、mssqlserverjar和msutiljar,百度一下,可以在网上找到
以上就是关于用jdbc连接数据库时无法找到驱动类怎么办,是什么问题下面是我的代码全部的内容,包括:用jdbc连接数据库时无法找到驱动类怎么办,是什么问题下面是我的代码、数据库的两个表通过主键和外键相关联如果修改其中表的数据会不会自动修改另一个表的数据啊、c# 设计数据库中有两个表,当主表中的一条记录删除时,副表中的相关记录全部自动删除等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)