与JDBC相识的第一天超级NICE
目录
JDBC概述
1.1 数据的持久化
1.2 Java中的数据存储技术
1.3 JDBC介绍
1.4 JDBC体系结构
1.5 JDBC程序编写步骤
获取数据库连接
2.1加载与注册JDBC驱动
2.2 要素二:URL
2.3 要素三:用户名和密码
通用的操作代码
增删改
代码:查询单条记录
代码:多条记录的查询
前面我们讲到了sql的学习已经慢慢的结束,结果马上JDBC里面就见到了我们的老朋友哈哈,今天为大家带来了JDBC的学习!
初识JDBC,感觉很熟悉但是其实又很陌生哈哈,这就是第一感觉
JDBC概述
1.1 数据的持久化
1. 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
2. 持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
1.2 Java中的数据存储技术
在Java中,数据库存取技术可分为如下几类:
JDBC直接访问数据库
JDO (Java Data Object )技术
第三方O/R工具,如Hibernate, Mybatis 等
JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。
1.3 JDBC介绍
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
如果没有JDBC,那么Java程序访问数据库时是这样的:
1.4 JDBC体系结构
JDBC接口(API)包括两个层次:
面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
1.5 JDBC程序编写步骤
概念讲得也差不多了,那我们直接上代码看看操作流程!
获取数据库连接
获取数据库也可以分成好几个步骤,可以慢慢的去熟悉,以后用多了,就直接拿来用了
首先得导一个那种类似于插件的东西,如下图所示的mysql5.1.7
2.1加载与注册JDBC驱动
加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
Class.forName(“com.mysql.jdbc.Driver”);
注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用
2.2 要素二:URL
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔。
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
几种常用数据库的 JDBC URL
MySQL的连接URL编写方式:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
jdbc:mysql://localhost:3306/test
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
jdbc:mysql://localhost:3306/test?user=root&password=123456
Oracle 9i的连接URL编写方式:
jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称
jdbc:oracle:thin:@localhost:1521:test
SQLServer的连接URL编写方式:
jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称
jdbc:sqlserver://localhost:1433:DatabaseName=atguigu
2.3 要素三:用户名和密码
user,password可以用“属性名=属性值”方式告诉数据库
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
其中,配置文件声明在工程的src目录下:【jdbc.properties】
下面直接上我们的连接方式:
@Testpublic void testConnection5() throws Exception {//1.加载配置文件InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties pros = new Properties();pros.load(is);//2.读取配置信息String user = pros.getProperty("user");String password = pros.getProperty("password");String url = pros.getProperty("url");String driverClass = pros.getProperty("driverClass");//3.加载驱动Class.forName(driverClass);//4.获取连接Connection conn = DriverManager.getConnection(url,user,password);System.out.println(conn);}
同时也别忘记还要去释放资源:
public static void closeResource(Connection conn, Statement ps){try {if (ps!=null)ps.close();}catch (SQLException e){e.printStackTrace();}try {if (conn!=null)conn.close();}catch (SQLException e){e.printStackTrace();}}/***@haKu* 关闭资源的操作**/public static void closeResource(Connection conn, Statement ps, ResultSet rs){try {if (ps!=null)ps.close();}catch (SQLException e){e.printStackTrace();}try {if (conn!=null)conn.close();}catch (SQLException e){e.printStackTrace();}try {if (rs!=null)rs.close();}catch (SQLException e){e.printStackTrace();}}
通用的操作代码
增删改
接下来我们放上一个实际性的操作,如果通过JDBC来实现对数据库进行增删改的操作,为了方便起见,我们就直接放上了通用的增删改操作!
//通用的增删改操作public void update(String sql,Object ...args) {Connection conn= null;PreparedStatement ps= null;try {//1.获取数据库的连接conn = JDBCUtils.getConnection();//2.预编译sql语句,返回PreparedStatement的实例ps = conn.prepareStatement(sql);//3.填充占位符for (int i = 0; i <args.length ; i++) {ps.setObject(i+1,args[i]);//小心参数声明错误}//4.执行ps.execute();} catch (Exception e) {e.printStackTrace();} finally {//5.资源的关闭JDBCUtils.closeResource(conn,ps);}}
代码:查询单条记录
通用的查询一条数据,并且附上测试结果,首先我们先看看获取一条记录的方法怎么敲写的:
/***@haKu* 使用PreparedStatement 实现针对于不同表的通用的查询,返回一条记录***/public <T> T getInstance(Class<T> clazz,String sql,Object ...args){Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try {conn = JDBCUtils.getConnection();ps = conn.prepareStatement(sql);for (int i=0;i<args.length;i++){ps.setObject(i+1,args[i]);}rs=ps.executeQuery();//获取结果集的元数据:ResultSetMetaDataResultSetMetaData rsmd = rs.getMetaData();int columnCount=rsmd.getColumnCount();if (rs.next()){//这个位置的对象,得是通用的//通用类型T t = clazz.newInstance();for (int i = 0; i <columnCount ; i++) {Object columnvalue = rs.getObject(i + 1);//获取每个列的列名String columnLabel = rsmd.getColumnLabel(i+1);//给 t对象指定某个属性,赋值为columnName: 通过反射Field field = clazz.getDeclaredField(columnLabel);field.setAccessible(true);field.set(t,columnvalue);}return t;}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn,ps,rs);}return null;}
测试的代码:
@Testpublic void testGetInstance(){String sql="select id,name,email from customers where id=?";Customer customer=getInstance(Customer.class,sql,1);System.out.println(customer);String sql1="select order_id orderId,order_name orderName,order_date orderDate from `order` where order_id=?";Order order=getInstance(Order.class,sql1,1);System.out.println(order);}
测试结果图:
获取多条数据呢,换汤不换药,只要是知道一条是怎么拿到的,多条可谓是 锦上添花的事儿!
简单点想,就像是放到集合里面不就可以看全部的嘛,所以也不是很难,加油 相信自己!
代码:多条记录的查询
代码如下:
public <T> List<T> getForList(Class<T> clazz,String sql,Object ...args){Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try {conn = JDBCUtils.getConnection();ps = conn.prepareStatement(sql);for (int i=0;i<args.length;i++){ps.setObject(i+1,args[i]);}rs=ps.executeQuery();//获取结果集的元数据:ResultSetMetaDataResultSetMetaData rsmd = rs.getMetaData();int columnCount=rsmd.getColumnCount();//创建集合对象ArrayList<T> list = new ArrayList<T>();while (rs.next()){//这个位置的对象,得是通用的//通用类型T t = clazz.newInstance();for (int i = 0; i <columnCount ; i++) {Object columnvalue = rs.getObject(i + 1);//获取每个列的列名String columnLabel = rsmd.getColumnLabel(i+1);//给 t对象指定某个属性,赋值为columnName: 通过反射Field field = clazz.getDeclaredField(columnLabel);field.setAccessible(true);field.set(t,columnvalue);}list.add(t);}return list;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn,ps,rs);}return null;}
测试代码:(这里面注意的就是,方法里面的参数,得对应,都是基础性的东西,必须的注意到!)
@Testpublic void testGetForList(){String sql="select id,name,email from customers where id<?";List<Customer> list=getForList(Customer.class,sql,12);list.forEach(System.out::println);}
测试结果:
测试结果里面没有十一是因为,我的表里面本来就不存在id为11的条目数据,所以大可放心的观看代码。
今天的学习就到此结束了,感谢大家的陪伴,又是收获满满的一天,一定会在学习的道路上越走越强的!!!
与JDBC相识的第一天超级NICE相关推荐
- [水]2015百度之星初赛第一场 超级赛亚ACMer
Description 百小度是一个ACMer,也是一个超级赛亚人,每个ACMer都有一个战斗力,包括百小度. 所谓超级赛亚人的定义,是说如果在对抗中刚好接近极限状态,那就会激发斗志,实力提升. 具 ...
- GitHub趋势榜第一:超级命令行工具Semantic,比较解析源代码
新智元报道 来源:GitHub 编辑:大明 [新智元导读]作为开发者,天天都要与源代码打交道,面对不同版本,不同语言的代码进行比较.分析,理顺开发流程往往是开发者的日常.近日,一款名为Sema ...
- 嵌入式智能家居项目视频监控_智能化您的视频嵌入
嵌入式智能家居项目视频监控 Video content is taking over the Internet. The trend began long ago and the most recen ...
- Spring JDBC Template
Spring为我们提供了JDBC的模板来连接数据库,Spring JDBC Template. 使用: 第一,导入相关的jar包 第二,要连接数据库首先要加载驱动,获得连接,然后才能进行相关的数据库操 ...
- mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?
原文链接:https://www.cnblogs.com/homejim/p/8076481.html 在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加 ...
- JDBC详解系列之流程
JDBC概述定义:JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API, 可以为多种关系数据库提供统一访问,它由一组用Java ...
- 原生JDBC和工具类的基本实现
工具: IDEA MySQL8.0或之前版本 文章目录 JDBC原理 JDBC入门案例 JDBC的API详解 JDBC增删改查操作 JDBC工具类 JDBC是Java访问数据库的标准规范,可以为不同的 ...
- 数据层优化-jdbc连接池简述、druid简介
终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化 ...
- springboot手写JDBC面对2000并发量毫无压力
声明:本博客所有文章都是原创,不会有任何抄袭现象.请转载的朋友,标注出处,谢谢. 最近比较流行springboot微服务,那么持久层到底怎么样才算好?面对高并发的压力,如何抵制?本文将以JDBC来讲解 ...
最新文章
- 网络流24题之魔术球问题
- SpringBoot使用Redis和MyBatis完成缓存数据的增删改查
- Python--strip()学习记录
- php与java安全之争
- Kafka Broker常用配置详解
- keras版Mask-RCNN来训练自己的目标检测数据集
- https请求 nginx 不生效_nginx设置https后无法打开网页
- Centos6.5之yum安装LAMP+wordpress
- 使用cl编译器,将记事本写的c文件编译成dll和exe 步骤如下(记事本保存成.c)
- vue3的语法使用总结api
- 在vs2005调试asp程序
- 《深入浅出统计学》笔记
- 电信接入点服务器修改,修改apn加快电信4g网速(电信最佳apn接入点)
- visio2010画图
- 服务器显示阵列卡升级,dell r730服务器更换阵列卡后报错,弹出黑框
- 国家集训队论文99~08年全版
- 三种古典密码的认识(置换密码,代换密码和轮换密码)
- 计算机毕设题目设计与实现(论文+源码)_kaic
- krpano限制场景视角
- 投稿经验分享之四:SCI投稿之JEI录用