网站首页 > 开源技术 正文
什么是JDBC
Java数据库连接,简称JDBC(java Database Connectivity),是一种用于执行SQL语句的java API,它由一组java编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据的开发人员能够用纯java API编写数据库应用程序。
- 有了JDBC 向各种关系型数据库发送SQL语句就是一件很容易的事。是一个独立于数据库的管理系统,提供了通用的SQL数据库存取操作的接口(CRUD:Create Read Update Delete),定义了一组同一标准,为访问不同数据库提供同一途径。它是由sum公司开发的一套系统组件,供开发者直接调用。
程序是如何同数据库进行沟通的
- 数据库本身就是一个独立运行的应用程序,编写应用程序就是利用网络通信协议与数据库进行命令交换,来进行命令的增删查找。双层架构
- 问题的重点在于,你的应用程序如何调用这组程序库?
- 因为每个数据库的通常有不同的通信协议,用于连接不同数据库在API上也会有所不同
- JDBC 基本上就是用来解决这些问题,当应用程序需要练级数据库就调用这组标准的API,而标准的API中的接口由数据库厂商实现,通常称为JDBC驱动程序(Driver)。
- 三层架构
JDBC分为两部分
- JDBC 应用程序开发者接口((ApplicationDeveloper Interface)
- JDBC 驱动程序开发者接口 (Driver Developer Interface)),驱动程序接口是数据库厂商要实现驱动程序时的规范,一般开发者并不用了解。
使用JDBC代码进行数据库连接处理:
开发应用程序过程中,如果要操作数据库,我们是通过JDBC所提供的接口来实现设计程序的,理论上必须更换数据库的时候,应用程序不用修改,直接更换数据库驱动程序实现数据库的更换。
Connection conn = DriverManager.getConnection(....); //驱动 Statement st = conn.createStatement(); //声明 ResultSet rs = st.executeQuery("select * from T_user"); //executeQuery 执行命令 假设这段代码是连接MySQL数据库,你会需要在Classpath中设置MySQL;对应JDBC的驱动程序。 具体来说,就是在Classpath 中设置一个JAR文件此时应用程序、JDBC 与数据库的关系如下图所示。
- 连接MySQL 数据库
- 连接Oracle 数据库
JDBC体系结构:java访问各种关系型数据库的一系列API,功能包括
1、建立数据库连接2、创建SQL语句3、执行SQL语句4、查看或修改结果具体的方法:
代码实例:Connection conn = DriverManager.getConnection("URL",“user”,"password")url:数据库地址,jdbc:mysql://localhost:/database(数据库名字)?useUnicode=true&characterEncoding=UTF-8 //在数据库名字后面最好加入utf—8 user:数据库用户名 password:数据库密码 oracle:连接驱动://Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:dabase",“user”,“password”)
- executeQuery():运行select 语句,返回ResultSet 结果集。
- executeUpdate():运行 insert、delete、update的操作,返回更新的行数。
- true:表示 SQL执行返回的结果是resultSet类型(select)
- 表示 SQL执行返回的结果不是是resultSet类型 (insert,delete,update)
- Statement :执行SQL语句:并且返回他所生成的结果对象:Statement,由createStatement创建,用于发送简单的sql语句(不带参数):不使用,而使用它的子类PreparedStatement
- PreparedStatement接口:用于发送一个或者多个输入参数的sql语句,它的父类是Statement,但是其效率更高,
- 并且可以防止SQL注入
- ,因此我们一般都用prepareStatement.
- CallableStatement,继承prepareStatement,由preParCall创建,
- 用于调用存储过程
- 。
- execute():运行语句返回是否有结果集:true/false,
- 不过该方法很少用来返回结果集,因为容易发生SQL注入
- 我们常用的是:
- DriverManager:驱动管理
- Connection:连接与特定数据库的连接(会话),在连接上下文中执行SQL语句并且返回结果
- DriverManager 的 getConnection()方法是建立JDBC URL中定义的数据库在Connection 连接的(连接对象内部其实包含了Socket对象,是一个远程连接,比较耗时,这是Connection对象管理的一个要点,
- 在实际开发中,为了提高效率,我们使用连接池来管理连接对象
- )
使用JDBC的步骤
- 导入jar包 :MySQL-connector-java-5.1.33-bin.jar
- 编写代码:
- name="root";
- password= "1121"
- url = "jdbc:mysql://localhost:/database(数据库名字)?useUnicode=true&characterEncoding=UTF-8"
- driveClassName = "com.mysql.jdbc.Driver"
- 编写连接MySQL的四大参数
- 加载MySQL的驱动类
- class.forName(driveClassName)
- 获取MySQL数据库的连接对象
- Connection conn = DriveManger.getConnection(url,name,password);
- 向MySQL数据库发送SQL语句
- String sql = "insert into dept values(65,"tt","oo")";
- Statement stmt = conn.createStatement();
- int result = stmt.executeUpdate(sql);
- 查询语句的话,读取结果集中的数据
- 关闭MySQL数据库相关的连接
- stmt.close();
- conn.close();
- 用到的对象:
- Result executeQuery(String sql) :返回结果集
- int stmt.executeUpdate(sql) : 返回返回更新数据
- DriverManager (管理JDBC驱动程序):getConnection(String url,name,password)
- Connection(管理连接):conn.createStatement()
- Statement (执行静态SQL语句):
- ResultSet(查询数据库得到的结果集):将结果集封装成类
- next()
- first()
- last()
- previous()
- relative(int rows)
- absolute(int row)
- 移动光标:
- 获取字段: getxxx();
JDBC 连接池:相当于容器
- Connection 连接的弊端
- ,每次连接都要验证密码和用户名,用完后由被关闭,当下次执行的时候又再次连接,这样既耗时又浪费资源(可以比较为一次性手机和公共电话),为了提高程序效率我们使用连接池。
- 数据库连接池基本思想:为数据库建立缓冲池(连接的集合),预先在里面方一定数量的的连接对象,当Java application(应用程序)需要获取数据库连接时,直接从连接池中取一个出来,用完后不关闭,再放到池中,重复利用,做到资源共享。
- JDBC 提供了DataSource接口来使用数据库连接池,但是JDBC没用对该接口进行实现,但是在实际开发中我们不需要自己实现,直接利用第三方工c3p0 就可以完成。
- c3p0是在JDBC的第二步使用,替换连接步骤。
- c3p0产生的类和原生的类不一样,前者是代理连接数据库,后者是直接连接数据库
- 关闭释放资源的方式不同
- ,c3p0这个时候调用的close()方法不是扔掉,而是还回连接池.
- c3p0 使用步骤:
- 导入c3p0jar 包
- 创建C3P0数据源
- 设置数据库属性(url , user. password)
- 加载驱动(不用class.forName())
- 设置初始化的连接数(连接池大小):最大连接数(虽然连接池的初始化连接是10,但是当链接不够时还可以重新申请,直到上限,如果超过上限,则等待),和最小连接(2)
- C3P0—config.xml 文件名不能修改,放置在src路径下
- name—config.xml 标签的name属性不可以自定义
- property 标签的name属性不能修改
- Property 标签内部的值不能加双引号
- DBUtils工具:简化JDBC代码,查询数据,可以完成自动封装,但是只能单表查询封装,多表关联无法封装,多表关联封装以后MyBatis 框架或者Hibernate 框架来完成。
- 自动封装的原理:通过反射机制创建目标对象,必须调用无参构造,实体类必须有一个无参构造,属性必须有stter方法
注意
- 提供SQL占位符:用?代替参数。
- String sql = "update card set name = ? ,classs= ? where cno= ?";
- 关于SQL注入:
- 原理:利用系统没有对用户输入的数据进行充分验证,在用户输入的信息中注入非法SQL语句,从而利用系统的sql引擎完成恶意行为的做法。
- 解决方案:占位符替换,也不用拼接sql语句。定义子类。
- 在数据库中保存图片(音频 视频):(图片音视频都是以二进制的形式保存在数据库中(选择适合的类型,注意资源大小),二进制保存类型有(只是大小不同)tinyblob:255kb 、blob:65kb 、mediublob: 16M )
- JDBC 事务:(一般框架里面都有,具体写代码的时候不用自己去写)
- 关闭自动提交 //setAutoCommit(false);
- 手动提交 //conn.commit();
- 回滚 //conn.rollback();
- 硬编码:是将数据库信息写死在程序中,每次修改信息,都需要重新编译java程序;一般会将数据库的连接信息提取出来放在配置文件里面,java程序只需要读取配置文件就、就可以了。
- 写底层框架的条件:(学会看源码)1.xml解析 2.反射 3. 接口---->实现类
- 框架:就是工具,提高编写效率(类似于洗衣机) 按照正确的步骤操作。
- 异常处理:1,自己处理(try catch 自己处理)。 2,抛出给上级 。类似于公司出问题自己处理或者上级处理,但是最高是JVM。
- 关于封装:当一个代码多次重复执行,那么我们可以将它封装成一个类,一个方法多次被调用,那么将他放到静态代码块中。
- java 中对数据库的操作时,一般是建立一个模型类,将数据库的表映射到模型类,然后以面向对象的操作方法来处理。
关注微信公众号「Java大联盟」,关注即可获取海量学习干货,同时还有不定期送书,键盘,鼠标等粉丝福利。
猜你喜欢
- 2024-09-19 将Sentinel监控数据持久化到外部InfluxDB时间序列数据库
- 2024-09-19 【每日一学】解锁数据库之门:深入探讨JDBC技术的奇妙世界
- 2024-09-19 成为优秀的Java程序员要具备哪些技能?
- 2024-09-19 Java架构师的10个学习经验,不可错过
- 2024-09-19 软件测试学习教程——JDBC开发(jdbc 测试)
- 2024-09-19 文科妹子都能看懂Mybatis快速入门教程
- 2024-09-19 如何通过连接池提高API性能(连接池获取连接)
- 2024-09-19 应大家需要,Java常用开发工具汇总来了
- 2024-09-19 jSqlBox 4.0.8 发布,在 Java 里直接写 SQL 的 ORM 工具
- 2024-09-19 一行代码搞定数据库操作 ThinkJDBC
你 发表评论:
欢迎- 最近发表
-
- Shell脚本编程入门:轻松掌握自动化利器
- 告别代码恐惧症!豆包推出可视化AI编程,拖拽即可创建网页应用
- 星空外挂出程序单设置_启根教育(星空外挂excel通用程序单改三视图)
- PLC编程中的IF语句:从基础到高级的全面指南(附源码例程)
- 过程测量与控制仪表的功能标志及图形符号
- 西门子PLC编程基本指令汇总(西门子plc编程指令教学)
- 仪创Web门禁控制器:RESTful API标志门禁进入"可编程智能硬件"时代
- Python初体验:从入门到实践(python入门操作)
- Linux系统编程之进程基础知识(linux进程常用命令)
- [西门子PLC] 西门子1200 、200smart、 LOGO! 实现S7通讯演示功能
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)