热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javajdbc连接_[基础篇]数据库07JDBC学习

JDBC学习1.JDBC基础JDBC基础概念持久化持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业

JDBC学习

1.JDBC基础

JDBC基础概念

持久化

持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。

持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中

141b7f30e612cf89ef2834be5baa8d40.png

java中的数据存储技术

在Java中,数据库存取技术可分为如下几类:

  • JDBC直接访问数据库
  • JDO技术
  • 第三方O/R工具,如Hibernate, ibatis(MyBatis) 等

JDBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了JDBC

JDBC的作用

JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源

JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题

JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程

ced8da0c19789e61e9f1514060fcadc6.png
bc8ba38d41659aff4210fdb827304761.png

JDBC接口(API)包括两个层次:

  • 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)
  • 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用
ed2be3e0e7273015da85e2ac69aec7e2.png

JDBC中的API

JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果

b2384f86a32154cae5f80c3eba578056.png

DriverManager

<1>加载与注册 JDBC 驱动

管理一组 JDBC 驱动程序的基本服务

  • 加载 JDBC 驱动需调用 Class 类的静态方法 forName( )&#xff0c;向其传递要加载的 JDBC 驱动的类名
  • DriverManager 类是驱动程序管理器类&#xff0c;负责管理驱动程序
  • 通常不用显式调用 DriverManager 类的 registerDriver( ) 方法来注册驱动程序类的实例&#xff0c;因为 Driver 接口的驱动程序类都包含了静态代码块&#xff0c;在这个静态代码块中&#xff0c;会调用 DriverManager.registerDriver( ) 方法来注册自身的一个实例

<2>建立连接

  • 可以调用 DriverManager 类的 getConnection( ) 方法建立到数据库的连接

在建立连接的时候需要四个参数连接数据库

用户名、密码、url、driver

  • JDBC URL 用于标识一个被注册的驱动程序&#xff0c;驱动程序管理器通过这个 URL 选择正确的驱动程序&#xff0c;从而建立到数据库的连接
  • JDBC URL的标准由三部分组成&#xff0c;各部分间用冒号分隔。
  • jdbc:<子协议>:<子名称>
  • 协议&#xff1a;JDBC -- URL中的协议总是jdbc
  • 子协议&#xff1a;子协议用于标识一个数据库驱动程序
  • 子名称&#xff1a;一种标识数据库的方法。子名称可以依不同的子协议而变化&#xff0c;用子名称的目的是为了定位数据库提供足够的信息
8e28b37a02438ef980fc5da2dd4b8593.png

对于 MySql数据库连接&#xff1a; jdbc:mysql://localhost:3306/test

对于 SQLServer 数据库连接&#xff1a;jdbc:microsoft:sqlserver//localhost:1433; DatabaseName&#61;sid

对于 MYSQL 数据库连接&#xff1a;jdbc:mysql://localhost:3306/sid

如果是远程连接数据库&#xff0c;则将相应的localhost换成相应的ip地址

Statement

  • 通过调用 Connection 对象的 createStatement 方法创建该对象
  • 该对象用于执行静态的 SQL 语句&#xff0c;并且返回执行结果
  • Statement 接口中定义了下列方法用于执行 SQL 语句&#xff1a;
  • ResultSet excuteQuery(String sql)
  • int excuteUpdate(String sql)

用于执行静态 SQL 语句并返回它所生成结果的对象

ResultSet

通过Statement 对象的 excuteQuery() 查询到的结果集是ResultSet就是一张数据表

  • 通过调用 Statement 对象的 excuteQuery( ) 方法创建该对象
  • ResultSet对象以逻辑表格的形式封装了执行数据库操作之后的结果集&#xff0c;ResultSet接口由数据库厂商实现
  • ResultSet 对象维护了一个指向当前数据行的游标&#xff0c;初始的时候&#xff0c;游标在第一行之前&#xff0c;可以通过 ResultSet 对象的next( )方法移动到下一行
  • ResultSet 接口的常用方法&#xff1a;
  • boolean next()
  • getString()
c478ce4b8a393e9372e9d136044b5f7f.png

PrepareStatement

  • 可以通过调用 Connection 对象的 preparedStatement( ) 方法获取 PreparedStatement 对象
  • PreparedStatement 接口是 Statement 的子接口&#xff0c;它表示一条预编译过的 SQL 语句
  • PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示&#xff0c;调用 PreparedStatement 对象的 setXXX( ) 方法来设置这些参数. setXXX( ) 方法有两个参数&#xff0c;第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始)&#xff0c;第二个是设置的 SQL 语句中的参数的值

小结

java.sql.DriverManager&#xff1a;用来装载驱动程序&#xff0c;获取数据库连接。
java.sql.Connection&#xff1a;完成对某一指定数据库的联接
java.sql.Statement&#xff1a;在一个给定的连接中作为SQL执行声明的容器&#xff0c;他包含了两个重要的子类型。
Java.sql.PreparedSatement &#xff1a;用于执行预编译的sql声明
Java.sql.CallableStatement&#xff1a;用于执行数据库中存储过程的调用
java.sql.ResultSet&#xff1a;对于给定声明取得结果的途径

数据库的连接

连接说明

  • 开启数据库的相关服务&#xff1a;OracleServiceORCLOracleDb11g_home1TNSListener
  • 加载jar包到指定工程&#xff1a;
  • 在oracle数据库的安装目录下的指定路径查找到相应的jar包
  • 本机查找路径&#xff1a;D:Oracle_Databseproduct11.2.0dbhome_1jdbclib
341004abda750f7acb3b201b896d6492.png
  • 选择ojdbc6.jar文件&#xff0c;复制到指定的工程下新建的lib文件夹中
dcee8c1ca6256c877b4e364bf4c8a685.png
  • 右键点击objbc6文件&#xff0c;选择“Build Path”-->“Add to Build Path”,添加完成后可看到工程新增了以下的内容
0c9442a1cd10925c974a5e1897c8f63e.png
  • 编写代码完成数据库连接测试
  • 四个属性的设定

用户名、密码分别为登录oracle数据库的用户名、密码

驱动查找&#xff1a;ojdbc6.jar包下的“oracle.jdbc.driver”包下的“OracleDriver.class”

ee56ba31bbaccef1e3b8daa66aca8ef6.png
a74fec03f77140483a3ffb71b02781f1.png

驱动driver&#61;”oracle.jdbc.driver.OracleDriver ”;

连接url&#61;”jdbc:oracle:thin:&#64;localhost:1521:orcl ”;

  • 通过“ Class.forName(driver); ”获取驱动
  • 通过DriverManager的getConnection方法获取数据库连接&#xff1a;

“DriverManager.getConnection(url, username, password)”

  • 返回获取的数据库连接

普通连接

public

测试结果&#xff1a;如果测试成功&#xff0c;会相应返回一个内存地址&#xff0c;如果连接失败则会提示相应的连接错误提示

0fdc8e802172046c40b727b604370c81.png

属性配置

在src文件夹下存放属性配置文件“jdbc.properties”&#xff0c;里面相应包含数据库连接所需要的四个属性

76fdc6d3f816f2ff3605c4f353af26ae.png
548982f3b1ed2a8e5fd0b6bfceaa9708.png

public

测试结果&#xff1a;如果测试成功&#xff0c;会相应返回一个内存地址&#xff0c;如果连接失败则会提示相应的连接错误提示

b33bedd1c5f57759d066a265f016b750.png

单例模式&#xff08;双重验证&#xff09;

/**

优化

考虑到之后的测试中始终需要对相应的文件、连接进行操作&#xff0c;为了保证操作的安全性&#xff0c;每次操作结束之后均要关闭相应的连接&#xff0c;因此为了避免重复代码的冗余&#xff0c;考虑将关闭连接的操作封装为一个方法freeAll(Connection conn,Statement st,ResultSet rs)

//关闭连接

在之后的练习中仍有许多内容需要进一步加以完善&#xff0c;改进&#xff0c;从而进一步优化代码&#xff0c;需要自己加以把握&#xff0c;巩固&#xff01;不断地优化自己的代码设计思想

CRUD

普通方式更新

public

结果分析&#xff1a;可结合数据库进行测试&#xff0c;查看结果的正确性

1.创建表stu

14a16be0d457b4529b36d3e42f5c90b3.png

2.新增数据&#xff08;多次修改sql语句、执行&#xff09;

9663b18d2653a0b72ab7e878d4d6927a.png

3.删除数据

6820d4724180998de780e1f464e5b930.png

4.修改数据

0622d727507ce7cd6180bd48d43bb880.png

5.查询所有的数据

3d5a906a622a5e4479920f4cd6c6eb25.png

缺点&#xff1a;代码虽然简单、形式单一&#xff0c;但却没有很好的通用性&#xff08;将sql语句写死&#xff01;&#xff09;&#xff0c;不能很好地实现需求&#xff0c;可以作为简单参考&#xff0c;在此基础上应该更好地完善&#xff0c;下述通过绑定变量方式更新进行叙述

绑定变量方式更新

public

结果分析&#xff1a;可结合数据库进行测试&#xff0c;查看结果的正确性

1.创建表stu

14a16be0d457b4529b36d3e42f5c90b3.png

2.新增数据

dab34f40ac3722f7626556127305589d.png

3.删除数据

f8c26733e84456a0f457422d93c42e71.png

4.修改数据

6e1ed154d8ab728604d2163c3bf110a7.png

5.查询单一数据

5e75be124e0f65b6fa3c823b31d0f39c.png

6.查询所有数据

f2e5804b73fb937a8e495aa40ceb4e51.png

案例分析

设计分析

创建表格&#xff0c;插入指定的数据&#xff0c;设计输入显示实现数据的录入、删除、修改、信息的查询

d177610ed792e884451b8b7dcc2b2105.png
f59096bb46507025f26e06b48a0fb906.png

结合题目需求&#xff0c;在前面所学案例的基础上可以进一步对代码继续进行优化

1.设计相应的界面提示&#xff0c;将获取用户输入部分独立出来

3147e6b1942a16fd0a604fec9edee3eb.png
f75e4172caa57fd18eab96e6906760b0.png
bcba09f704ddef8451aacc18f2946bf7.png
f1a43559343cb7d2dc081a5c8d6a7c6c.png

2.根据用户的输入决定要执行的sql语句&#xff0c;再将String类型的sql传入相应的方法中

256799996eab64aa7d4a2a67f308a0db.png
371e2e60d5c5d51de234aa2210fe8945.png

3.考虑重复代码的问题&#xff0c;尝试着将部分重复代码进行整合&#xff0c;整合为一个通用的方法。此处可以考虑将insert、delete、update方法整合成为一个通用的方法&#xff0c;通过传入的参数决定要执行的操作&#xff08;根据不同的需求传入sql语句&#xff0c;以及所需的参数&#xff09;

c41b76e510d9680a2f983b9cabeb358a.png

可以直接根据内容拼接sql语句&#xff0c;也可通过预编译sql语句&#xff0c;将相关参数传入后执行

4.另外独立封装增删改查方法进行测试

9113fff546cf607d470078aec6d4c822.png

代码分析

public

普通方式

PersonCRUD .java

public

Menu .java

public

优化代码

PersonCRUD2 .java

public

Menu2 .java

public

PrepareStatement 和Statement的区别

  • 代码的可读性和可维护性
  • PreparedStatement 能最大可能提高性能
  • DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用&#xff0c;所以语句在被DBServer的编译器编译后的执行代码被缓存下来&#xff0c;那么下次调用时只要是相同的预编译语句就不需要编译&#xff0c;只要将参数直接传入编译过的语句执行代码中就会得到执行。
  • 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
  • (语法检查&#xff0c;语义检查&#xff0c;翻译成二进制命令&#xff0c;缓存)
  • PreparedStatement 可以防止 SQL 注入

sql注入

在数据库中创建相应的表格进行测试

aee86b7cb4c841c2991c7d477e6309e7.png

public

PreparStatement 提高效率

一次性插入太多数据可能会报相应的错误&#xff0c;因此在创建连接的时候要注意连接的使用量、最大连接数

ORA-12519, TNS:no appropriate service handler found

public

2.数据库事务相关

2.1事务相关的基础概念

事务的四个重要概念

什么是事务&#xff1f;

数据库事务(Database Transaction) &#xff0c;是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完全地不执行。事务的完成由若干个DML语句组成的。

在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态

为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态

事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃所作的所有修改而回到开始事务时的状态

事务的四大特性&#xff1f;ACID

数据库事务有四大特性: ACID --> 原子性 一致性 隔离性 持久性

  • 原子性(Atomicity)

指事务在逻辑上是不可分割的操作单元&#xff0c;所有的语句要么都执行成功&#xff0c;要么都执行失败并进行撤销。

  • 一致性(Consistency)

从一个状态转换为另外一个状态

事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束

  • 隔离性(Isolation)

隔离性是针对并发而言。所谓的并发是指数据库服务器同时执行多个事务&#xff0c;如果在执行的过程中不采取有效的专门控制机制&#xff0c;并发事务之间会发生相互干扰

隔离性就是隔离并发运行的多个事务避免产生相互影响

事务的隔离性是指一个事务的执行不能被其他事务干扰&#xff0c;即一个事务内部的操作及使用的数据对并发的其他事务是隔离的&#xff0c;并发执行的各个事务之间不能互相干扰

  • 持久性(Durability)

事务一旦提交对数据的修改就是持久性的&#xff0c;数据已经从内存转移到了外部服务器上&#xff0c;并执行了固化的步骤

在数据库中由并发导致的各种问题包含哪些?

由于数据库的隔离性导致的并发问题包括以下内容

对于同时运行的多个事务&#xff0c;当这些事务访问数据库中相同的数据&#xff0c;如果没有采取必要的隔离机制将会导致各种并发问题。

  • 脏读

对于两个事务T1,T2 。 T1读取了已经被T2更新但是还没有提交的字段之后&#xff0c;如果T2发生了回滚&#xff0c;T1读取的内容就是无效的。

  • 不可重复读

对于两个事务T1&#xff0c;T2。T1读了一个字段&#xff0c;然后T2更新了该字段之后&#xff0c;T1再次读取同一个字段&#xff0c;两次读取的值就是不同的。

  • 幻读(虚度)

对于两个事务T1,T2 T1从一个表中读取一个字段&#xff0c;然后T2在该表中插入一个新的行之后&#xff0c;如果T1再次读取这个表发现数据行数变多。

  • 丢失更新

是第一次提取的内容被第二次提交的内容进行了覆盖

数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.

一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

为了解决以上问题设计了哪些隔离级别详细解释?

为了解决并发问题 数据库定义了四种隔离级别。隔离级别越高效率越慢&#xff0c;根据业务选择一个合适的隔离级别&#xff0c;在性能和安全上做平衡。

0d1d66606c15257151775f14c8f8e788.png
  • read_uncommitted&#xff1a;读未提交的数据

允许事务读取未被其他事务提交的变更&#xff0c;脏读&#xff0c;不可重复读&#xff0c;&#xff08;虚读&#xff09;幻读问题都会出现

  • read_commited &#xff1a;读已提交的数据

只允许事务读取已经被其他事务提交的变更&#xff0c;可以避免脏读&#xff0c;但是不可重复读和幻读依然存在

  • Repeatableread&#xff1a;可重复读

确保事务可以多次从一个字段中读取相同的值&#xff0c;这个事务存在期间&#xff0c;禁止其他事务对这个字段进行更新&#xff0c;可以避免脏读&#xff0c;不可重复读但是幻读依然存在。

  • Serializable &#xff1a;串行化

确保可以从一个表中读取相同的行&#xff0c;这个事务存在期间禁止其他事务对该表进行插入、更新和删除操作。所有的并发问题都可以避免&#xff0c;但是性能十分低下。

  • 丢失更新&#xff1a;主要是使用乐观锁和悲观锁解决丢失更新。

并不是所有的数据库都支持这四种隔离级别

  • Oracle支持两种隔离级别 read_commited 、Serializable 默认的隔离级别是read_commited
  • Mysql支持四种隔离级别 mysql的默认隔离级别是repeatableread

1 read uncommited

2 read commited

4 repeatable read

8 serializable

事务的操作

转账测试

利用事务实现转账小程序&#xff0c;在数据库中创建了如下的表

--

如果转账过程中没有出现异常&#xff0c;则正常操作&#xff0c;余额有所变动&#xff0c;但如果转账过程中出现差错&#xff0c;则事务发生回滚&#xff0c;余额不会发生变动

2db8c943498c463a0f8ea401dd7636fe.png

隔离级别测试

public

2.2数据库连接池

在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步骤&#xff1a;  

  • 在主程序&#xff08;如servlet、beans&#xff09;中建立数据库连接
  • 进行sql操作
  • 断开数据库连接

这种模式开发&#xff0c;存在的问题:

普通的JDBC数据库连接使用 DriverManager 来获取&#xff0c;每次向数据库建立连接的时候都要将 Connection 加载到内存中&#xff0c;再验证用户名和密码(得花费0.05s&#xff5e;1s的时间)。需要数据库连接的时候&#xff0c;就向数据库要求一个&#xff0c;执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用&#xff0c;若同时有几百人甚至几千人在线&#xff0c;频繁的进行数据库连接操作将占用很多的系统资源&#xff0c;严重的甚至会造成服务器的崩溃。

对于每一次数据库连接&#xff0c;使用完后都得断开。否则&#xff0c;如果程序出现异常而未能关闭&#xff0c;将会导致数据库系统中的内存泄漏&#xff0c;最终将导致重启数据库。

这种开发不能控制被创建的连接对象数&#xff0c;系统资源会被毫无顾及的分配出去&#xff0c;如连接过多&#xff0c;也可能导致内存泄漏&#xff0c;服务器崩溃。

数据库连接池&#xff1a;

  • 为解决传统开发中的数据库连接问题&#xff0c;可以采用数据库连接池技术。
  • 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接&#xff0c;当需要建立数据库连接时&#xff0c;只需从“缓冲池”中取出一个&#xff0c;使用完毕之后再放回去。
  • 数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是重新建立一个。
  • 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中&#xff0c;这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用&#xff0c;连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数&#xff0c;当应用程序向连接池请求的连接数超过最大连接数量时&#xff0c;这些请求将被加入到等待队列中。

优势&#xff1a;

  • 连接复用&#xff1a;通过建立一个数据库连接池以及一套连接使用管理策略&#xff0c;使得一个数据库连接可以得到高效、安全的复用&#xff0c;避免了数据库连接频繁建立、关闭的开销。连接池技术尽可能多地重用了消耗内存地资源&#xff0c;大大节省了内存&#xff0c;提高了服务器地服务效率&#xff0c;能够支持更多的客户服务。通过使用连接池&#xff0c;将大大提高程序运行效率&#xff0c;同时&#xff0c;我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等
  • 资源重用&#xff1a;由于数据库连接得以重用&#xff0c;避免了频繁创建&#xff0c;释放连接引起的大量性能开销。在减少系统消耗的基础上&#xff0c;另一方面也增加了系统运行环境的平稳性。
  • 更快的系统反应速度&#xff1a;数据库连接池在初始化过程中&#xff0c;往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言&#xff0c;直接利用现有可用连接&#xff0c;避免了数据库连接初始化和释放过程的时间开销&#xff0c;从而减少了系统的响应时间
  • 新的资源分配手段&#xff1a;对于多应用共享同一数据库的系统而言&#xff0c;可在应用层通过数据库连接池的配置&#xff0c;实现某一应用最大可用数据库连接数的限制&#xff0c;避免某一应用独占所有的数据库资源
  • 统一的连接管理&#xff0c;避免数据库连接泄露&#xff1a;在较为完善的数据库连接池实现中&#xff0c;可根据预先的占用超时设定&#xff0c;强制回收被占用连接&#xff0c;从而避免了常规数据库连接操作中可能出现的资源泄露

C3P0数据库连接池

导入c3p0相关jar包

搜索才c3p0相关信息&#xff0c;可以从c3p0官网上下载&#xff0c;也可以从maven网站进行搜索下载

https://www.mchange.com/projects/c3p0/

http://mvnrepository.com/

此外还要下载相应的依赖包

b50d82bcd9a40925f2d4d4d52146c63e.png

下载完成后加对应jar包加载到指定项目中&#xff0c;随后查看c3p0官网中相关的配置信息

https://www.mchange.com/projects/c3p0/apidocs/index.html

ba9c9dfd5b88bdf6d45db7791f2facb7.png

利用c3p0创建数据库连接池

在当前工程下创建配置文件“c3p0-config.xml”&#xff0c;如果没有指定的路径&#xff0c;默认是在src目录下查找&#xff0c;因此要将相应的配置文件放置在src目录下

3682442cdb208f6f783248187506dd12.png
079fc898f30356ce587675418ce92817.png

测试连接

public

连接成功结果&#xff1a;

15b3b2104e035640efb9d888e9202158.png

c3p0在底层做了许多优化工作&#xff0c;目前暂时不需要做过多深究&#xff0c;简单了解并应用即可

3.QueryRunner工具类的使用

http://mvnrepository.com/artifact/commons-dbutils/commons-dbutils

加载dbutils jar包到指定的工程

基础语法

--创建worker表简单实现dbutils的测试

与此相对应的是要创建相应的Model&#xff0c;其属性与数据库中的表的列一一对应&#xff0c;测试则是通过Junit进行单元测试

public

通用的DAO

5377d94ef4137dfab667936d58612187.png

/**

Jdbc调用存储过程和函数

public




推荐阅读
author-avatar
留香1980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有