深入浅出学习Hibernate框架(二):JDBC基础操作
上篇博客《深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架》简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate。这篇博客将介绍JDBC的基本操作,说起这JDBC,大部分程序员是已经非常熟悉了,为了我的Hibernate学习的连载,所以在这篇要简单介绍一下JDBC的有关操作,因为这是Hibernate实现的基础,没有了JDBC也就没有了Hibernate框架,因为Hibernate框架是对JDBC做的高度封装。这篇博客主要介绍JDBC建立数据库配置连接和JDBC中的相关类和接口以及JDBC各种操作的实现。
希望读者能够认真的学习学习JDBC,基础的东西才是最重要的,没有基础其它一切都是浮云,当然这篇也是以后要深入学习Hibernate框架的基础和伏笔,希望读者能够好好学习一下。
先说什么是JDBC,JDBC是由一组用java编写的类和接口的组成。在具体的开发中,JDBC提供了一个标准的API,有了它我们能够用JAVA API来编写数据库应用程序。
下面来说如何建立和配置连接。数据库连接是JDBC进行查询的先决条件,而且经过了开发的朋友门都知道,现在主流的数据库都提供了本身专用的数据库连接驱动,有了数据库连接驱动给我们带来了不少帮助,但是也给我们带来了许多麻烦,例如版本不兼容等等问题。
下面以Mysql为例来建立和配置连接:
1. 加入驱动程序。拷贝Mysql的JDBC驱动到运行程序能够找到的目录
2. 确保Mysql数据库处于运行状态(前两步是傻瓜式级别的操作在这里就不介绍了)
3. 编写JDBC程序(在这里给出源代码)
源代码:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- public classDBUtil {
- /**
- * 取得Connection
- * @return
- */
- public static Connection getConnection() {
- Connectionconn = null;
- try {
- Class.forName("com.mysql.jdbc.Driver");
- Stringurl = "jdbc:mysql://localhost:3306/User";
- Stringusername = "root";
- Stringpassword = "123";
- conn= DriverManager.getConnection(url, username, password);
- }catch(ClassNotFoundException e) {
- e.printStackTrace();
- }catch(SQLException e) {
- e.printStackTrace();
- }
- return conn;
- }
- public static void main(String []args){
- System.out.println("测试开始");
- System.out.println(DBUtil.getConnection());
- System.out.println("测试结束");
- }
- }
结果截图:

下面介绍一下JDBC接口:
JDBC接口是指进行数据库操作提供的公共访问方法,使用这些方法可以简化对数据库的操作,JDBC的接口放在了JDK中的java.sql包里。
截图:

这里面就介绍几个比较重用的也是比较重要的几个接口和一个driverManager类。

上面一部分都是枯燥的概念和理论,下面来看看JDBC如何利用这些接口和类来实现各种操作的。
Statement和PreparedStatement:
Statement接口代表一个数据库的状态,在向数据库发送相应的SQL语句时候都要用这两个接口。而statement是操作没有参数的sql语句,而preparedStatement即可以操作有参数的,也可以操作没有参数的,所以preparedStatement避免了sql注入问题。
举例:
Statement源代码:
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class StatementTest {
- public static void main(String[] args) throws SQLException {
- String sql="insert into User (name,password,id) values ('1','2','11111')";
- Connection conn=DBUtil.getConnection();
- Statement stmt=conn.createStatement();
- stmt.executeUpdate(sql);
- System.out.println("执行成功");
- }
- }
PreparedStatement源代码:
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class PreparedStatementTest {
- public static void main(String[] args) throws SQLException {
- String sql="insert into User (name,password,id) values (?,?,?)";
- Connection conn=DBUtil.getConnection();
- PreparedStatement pstmt=conn.prepareStatement(sql);
- pstmt.setString(1, "1");
- pstmt.setString(2, "2222");
- pstmt.setString(3,"3333");
- pstmt.executeUpdate();
- System.out.println("执行成功");
- }
- }
ResultSet
ResultSet接口是查询结果集接口,它返回的结果集进行处理。
举例:
源代码:
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public class ResultSetTest {
- public static void main(String[] args) throws SQLException {
- String sql="select * from User where id=?";
- Connection conn=DBUtil.getConnection();
- PreparedStatement pstmt=conn.prepareStatement(sql);
- pstmt.setString(1, "11111");
- ResultSet rs=pstmt.executeQuery();
- if(rs.next()){
- System.out.println("name="+rs.getString("name"));
- System.out.println("password="+rs.getString("password"));
- }
- }
- }
结果:

ResultSetMetaData
ResultSetMetaData接口可以通过数组形式,遍历数据库的各个字段的属性,对于开发者来说,这个机制意义非常大。
举例:
源代码:
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class ResultSetMetaDataTest {
- public static void main(String[] args) throws SQLException {
- String sql ="select * from User order by id";
- Connection conn=DBUtil.getConnection();
- //获得可以前后滚动的类型
- Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
- ResultSet rs=stmt.executeQuery(sql);
- ResultSetMetaData rsm=rs.getMetaData();
- System.out.println("共获的"+rsm.getColumnCount()+"列信息");
- for(int i=1;i<rsm.getColumnCount();i++){
- System.out.println("第"+i+"列的名称为"+rsm.getColumnName(i)+"类型为"+rsm.getColumnTypeName(i));
- }
- }
- }
结果:

总结:
这一篇博客对JDBC、JDBC一些重要接口做了简要的分析,主要是为了让读者对JDBC有所了解,对以后学习Hibernate有很大帮助,hibernate的操作最终也是转换为jdbc的操作。所以这篇博客的意义在于后面学习深入的引子。学习JDBC之后,在下一篇博客要介绍java反射机制,因为这个知识也对以后深入学习Hibernate有非常大的帮助。敬请期待!
深入浅出学习Hibernate框架(二):JDBC基础操作的更多相关文章
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
这篇博客是hibernate学习的第一篇,主要简介hibernate框架,之后简单说一下hibernate的文件夹结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hiberna ...
- 深入浅出学习hibernate框架(三):java的反射机制
上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...
- 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...
- Lua和C++交互 学习记录之二:栈操作
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Tensorflow深度学习之十二:基础图像处理之二
Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像: ...
- Elasticsearch学习系列二(基础操作)
本文将分为3块讲解Es的基础操作.分别为:索引(index).映射(mapping).文档(document). 索引操作 创建索引库 语法: PUT /索引名称{ "settings&qu ...
- 深入浅出微服务框架dubbo(一):基础篇
一.基础篇 1.1 开篇说明 dubbo是一个分布式服务框架,致力于提供高性能透明化RPC远程调用方案,提供SOA服务治理解决方案.本文旨在将对dubbo的使用和学习总结起来,深入源码探究原理,以备今 ...
- 【SSH之旅】一步步学习Hibernate框架(一):关于持久化
在不引用不论什么框架下,我们会通过平庸的代码不停的对数据库进行操作,产生了非常多冗余的可是又有规律的底层代码,这样频繁的操作数据库和大量的底层代码的反复书写极大的浪费了程序人员的书写.就在这样一种情况 ...
- Hibernate框架笔记03表操作多对多配置
目录 1. 数据库表与表之间的关系 1.1 一对多关系 1.2 多对多关系 1.3 一对一关系[了解] 2. Hibernate的一对多关联映射 2.1 创建一个项目,引入相关jar包 2.2. 创建 ...
随机推荐
- Another app is currently holding the yum lock; waiting for it to exit.. yum被锁定无法使用
yum被锁定无法使用 Another app is currently holding the yum lock; waiting for it to exit.. 解决方法: rm -rf /var ...
- activiti并行和串行区别
多实例还有并行.串行区分.以下解释一下什么是并行与串行 并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响. 串行代表工作或任务由一个人完成后,再由另 ...
- Oozie工作流属性配置的方式与策略
本文原文出处: http://blog.csdn.net/bluishglc/article/details/46049817 Oozie工作流属性配置的三种方式 Oozie有三种方法可以给工作流提供 ...
- gcp上使用gpu来学习tensorflow
1080ti显卡实在是太贵了,8k一张的价格,让我感到无耐.还好,有gcp的gpu来训练,最有意思的是,他还提供300美元,让你挥霍. 1.当然是申请gcp的账号. 2.登录后,左侧->&quo ...
- Mac OSX 快捷键&命令行
一.Mac OSX 快捷键 ctrl+shift 快速放大dock的图标会暂时放大,而如果你开启了dock放大Command+Op ...
- IE报错:The given path's format is not supported
在使用FileUpload控件进行上传EXCEL文件时,本地调试上传无问题,但是发布之后报地址无效错误 一.出现这个错误的主要原因是,在本地上传图片的时候HttpPostedFileBase对象里面保 ...
- 菜鸟调错(一)——Maven项目部署到Jboss出现:Failed to create a new SAX parser
今天调试的时候遇到一个错误,往Jboss的deploy目录扔war包的时候,报了一个“Failed to create a new SAX parser”的错误.在网上找了找解决方案,一般都说将项目中 ...
- Nan-boxing技术介绍
NaN-boxing看起来像英文翻译的“南拳”,其实它是表示一个无效的double数.NaN-boxing技术:通过一个64位的数字来表示多种数据类型的技术,它通过一个nan浮点数来保存数据,根据IE ...
- Linux系统磁盘满解决方案
1.查看磁盘使用率 df -lh 执行结果: 2.定位最大文件目录 du -h --max-depth=1 执行结果: 3.定位最大文件 ls -lhS 执行结果: 4.备注 配合du -h --ma ...
- stm32keilIDE遇到的bug
最进项目中遇到keil中使用sscanf时,采取类正则表达 %*[^/]/%[^@]时不能正确得到的结果,同样的代码在gcc中运行通过.然后又遇到stm32 keil编译器printf带多个参数就卡死 ...