数据持久化

数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。

瞬时状态

保存在内存的程序数据,程序退出,数据就消失了

持久状态

保存在磁盘上的程序数据,程序退出后依然存在

数据持久化技术

Hibernate、JPA、==JDBC(Java Datebase Connectivity)==等

JDBC框架

Driver 接口

java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现

在程序中不需要直接去访问实现了 Driver 接口的类,而是由**驱动程序管理器类(java.sql.DriverManager)**去调用这些Driver实现

连接、操作数据库步骤

Connection conn = null;
Statement st=null;
ResultSet rs = null;
try {
//获得Connection
//创建Statement
//处理查询结果ResultSet
}catch(Exception e){
e.printStackTrance();
} finally {
//释放资源ResultSet, Statement,Connection
}

一、获取数据库连接对象步骤

1、导入jar包

1、在项目中创建lib文件夹

2、将jar文件放置到lib文件夹

3、集成到项目中,右键build(eclipse)、add as library(idea)

2、注册驱动(Java代码中加载驱动类)

将com.mysql.jdbc包下的Driver类的字节码文件从本地磁盘加载到方法区中

==Oracle的驱动==:oracle.jdbc.driver.OracleDriver

==mySql的驱动==: com.mysql.jdbc.Driver

方式一:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名

//将com.mysql.jdbc包下的Driver类的字节码文件从本地磁盘加载到方法区中
Class.forname("com.mysql.jdbc.Driver")

方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序

DriverManager.registerDriver(com.mysql.jdbc.Driver);

通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,原因:

1、该方法,过于依赖jar包的存在

2、该方法,会造成二次注册

3、使用Class.forname可以降低耦合性

3、获取连接对象

//本机IP:localhost 本机端口号:3306
String url = "jdbc:mysql://IP地址:端口号/库名?serverTimezone=Asia/Shanghai&characterEncoding=utf-8";
String user = "用户名";
String passWord = "密码";
Connection conn = DriverManager.getConnection(url,user,passWord);

协议:JDBC URL中的协议总是jdbc

子协议:子协议用于标识一个数据库驱动程序

子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为 了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名

几种常用数据库的JDBC URL

对于 Oracle 数据库连接,采用如下形式:

jdbc:oracle:thin:@localhost:1521:库名

对于 SQLServer 数据库连接,采用如下形式:

jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=库名

对于 MYSQL 数据库连接,采用如下形式:

jdbc:mysql://localhost:3306/库名

二、执行sql语句

1、获取Statement对象

Statement statement = conn.createStatement();

2、执行sql语句

int result = statement.executeUpdate("sql语句字符串对象")

Statement类方法分类

  • int executeUpdate(sql);

    • 针对数据库的增(insert into)、删(delete from)、改(update set)操作
    • 返回值类型:实际影响的行数
  • ResultSet executeQuery(sql);
    • 针对数据库的查询(select from)操作
    • 返回值类型:一个结果集类型
  • boolean execute(sql);
    • 针对数据库的增删改查操作,一般我们不会使用,jdbc的底层代码会使用
    • 如果执行的sql语句是增删改,返回false
    • 如果执行的sql语句是查询,返回true

3、处理执行结果(ResultSet)

//使用Statement类的方法ResultSet executeQuery(String sql);获得结果集类型的对象
ResultSet set = statement.executeQuery(sql);
while(set.next()){
//形参可以直接写字段名,字段名不区分大小写
String id = set.getInt("book_id");
//也可以写字段索引,索引从1开始
String id = set.getInt(1);
}

4、释放资源

resultSet.close();
statement.close();
connection.close();

实现JDBC工具类

将获取连接和关闭资源等公共、重复的代码封装成一个工具类

import java.sql.*;
public class JDBCUtil {
private static String driver;
private static String url;
private static String user;
private static String passWord;
//解析配置文件.properties
static {
try {
Properties properties = new Properties();
properties.load(new FileInputStream(".properties文件路径"));
driver = (String) properties.get("driver");
url = (String) properties.get("url");
user = (String) properties.get("user");
passWord = (String) properties.get("passWord");
}catch (Exception e){
e.printStackTrace();
}
}
//获得Connection对象
public static Connection getConnection(){
Connection connection = null;
try{
Class.forName(driver);
connection = DriverManager.getConnection(url,user,passWord);
}catch (Exception e){
e.printStackTrace();
}
return connection;
}
//关闭资源 -- 针对查询
public static void close(ResultSet resultset,Statement statement,Connection connection){
try {
if (resultset != null) {
resultset.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
//关闭资源 -- 针对增删改
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
//针对DML语句--增删改
public static boolean executeUpdate(String sql,List<Object> list){
Connection connection = getConnection();
PreparedStatement pre = null;
try {
pre = connection.prepareStatement(sql);
for (int i = 0;i < list.size();i++){
pre.setObject(i + 1,list.get(i));
}
return (pre.executeUpdate() > 0)? true : false;
}catch (Exception e){
e.printStackTrace();
}finally {
close(pre,connection);
}
return false;
}
//针对查DQL语句
public static <T> List<T> executeQuery(String sql,List<Object> list,Class<T> tClass){
Connection connection = getConnection();
PreparedStatement statement = null;
ResultSet resultSet = null;
List<T> li = new ArrayList<>();
try {
statement = connection.prepareStatement(sql);
for (int i = 0;i < list.size();i++){
statement.setObject(i + 1,list.get(i));
}
resultSet = statement.executeQuery();
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
//获取列数
int count = resultSetMetaData.getColumnCount();
//遍历所有行
while (resultSet.next()){
T t = tClass.newInstance();
for (int i = 1;i <= count;i++){
//获取每一列列名
String keyName = resultSetMetaData.getColumnLabel(i);
//获取每一列对应的值
Object value = resultSet.getObject(keyName);
//T中对应的属性
Field key = tClass.getDeclaredField(keyName);
key.setAccessible(true);
key.set(t,value);
}
li.add(t);
}
}catch (Exception e){
e.printStackTrace();
}finally {
close(connection,statement,resultSet);
}
return li;
}
}

封装查询返回值遍历方式

List<Map> list = JDBCUtils.executeQuery(sql,new ArrayList());
for (Map<String,Object> map : list){
for (Map.Entry<String,Object> entry : map.entrySet()){
String s = entry.getKey();
Object o = entry.getValue();
System.out.print(s + "=" + o + ",");
}
System.out.println();
}

sql注入攻击

SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在 用户输入数据中注入非法的 SQL 语句段或命令,如下,从而利用系统的 SQL 引擎完成恶意行为的做法。

SELECT user, password FROM user_table WHERE user='a' OR 1 = ' AND password = ' OR '1' = '1'

对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement(继承于Statement) 取代 Statement 就可以了

PreparedStatement类

1、可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象

2、PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

PreparedStatement类和Statement的比较

1、代码的可读性和可维护性

2、PreparedStatement 能最大可能提高性能

3、PreparedStatement 可以防止 SQL 注入

4、如果拼接表名、列名、关键字,必须使用Statement,防止sql语句错误

ResultSet类

1、通过调用 PreparedStatement 对象的 excuteQuery() 方法创建该对象

2、代表结果集

3、ResultSet 返回的实际上就是一张数据表.,有一个指针指向数据表的第一条记录的前面。

ResultSetMetaData 类

1、通过调用ResultSet对象的getMetaData()方法创建改对象

2、可用于获取关于 ResultSet 对象中列的类型和属性信息的对象

常用方法

JDBC封装Dao

**DAO (Data Access objects 数据存取对象)**是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。能够是代码的结构更加清晰化。

DAO 模式组成

  1. DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
  2. DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
  3. 实体类:用于存放与传输对象数据。
  4. 数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改

数据库持久化+JDBC数据库连接的更多相关文章

  1. activemq 5.13.2 jdbc 数据库持久化 异常 找不到驱动程序

    原文:https://my.oschina.net/u/2284972/blog/662033 摘要: activemq jdbc 数据库持久化 异常 找不到驱动程序 Caused by: java. ...

  2. JDBC数据库连接技术

    [学习笔记]JDBC数据库连接技术(Java Database Connectivity) 一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称 ...

  3. 【学习笔记】JDBC数据库连接技术(Java Database Connectivity)

    一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称.它可以把数据持久保存,是一种持久化机制. 1.持久化 持久化就是将程序中的数据在瞬时状态和 ...

  4. Java操作数据库——使用JDBC连接数据库

    Java操作数据库——使用JDBC连接数据库 摘要:本文主要学习了如何使用JDBC连接数据库. 背景 数据持久化 数据持久化就是把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应 ...

  5. SpringCloud微服务实战——搭建企业级开发框架(五):数据库持久化集成MySql+Druid+MyBatis-Plus

      在引入相关数据库持久化相关依赖库之前,我们可以考虑到,当我们因业务开发需要,引入各种各样的依赖库时,Jar包冲突是我们必须面对的一个问题,Spring为了解决这些Jar包的冲突,推出了各种bom, ...

  6. JAVA基础知识之JDBC——JDBC数据库连接池

    JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...

  7. 转!!各种数据库的jdbc驱动下载及连接方式

    各种数据库驱动 数据库名称 下载地址 说明 Mysql http://www.mysql.com/products/connector/j/ Shipped. But need to download ...

  8. 各种数据库使用JDBC连接的方式

    Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...

  9. Java jdbc数据库连接池总结!(转)

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

随机推荐

  1. 实体linux服务器-由自动ip改为固定ip后,无法上网问题--配置问题解法

    新入公司,研发产业为零,开始搞. linux之前是自动获取ip地址的,网上搜索的帖子,耍流氓的居多,不能上网的原因很多,我这个是配置不对,看是否与你的一样. 1.首先看下当前电脑网卡,根据地址可以判断 ...

  2. grafana v8.0+ 隐藏表格字段

    Select panel title → Inspect → Panel JSON Set "type" to "table-old" Apply The vi ...

  3. 手脱PESpin壳【06.exe】

    1.查壳 2.LoradPE工具检查 一方面可以用LoradPE工具查看重定位,另一方面也可获取一些详细信息 3.查找OEP ①未发现pushad 开始未发现pushad,进行单步步入,很快就能找到p ...

  4. 面试官:Kafka是什么,它有什么特性与使用场景?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 不知不觉进入了五月份了,天气越 ...

  5. PowerJob高级特效-容器部署完整教程

    介绍 powerjob提供了容器功能,用来做一些灵活的任务处理.这里容器为 JVM 级容器,而不是操作系统级容器(Docker).(至于为什么取"容器"这个有歧义的名字是因为作者没 ...

  6. 零基础学Java第四节(字符串相关类)

    本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...

  7. 揭秘华为云GaussDB(for Influx):数据直方图

    摘要:本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第九期:最佳实践 ...

  8. 斯坦福NLP课程 | 第15讲 - NLP文本生成任务

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  9. Java 线程创建与常用方法

    进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理 IO ...

  10. Python3 collections模块

    https://www.cnblogs.com/zhangxinqi/p/7921941.html http://www.wjhsh.net/meng-wei-zhi-p-8259022.html h ...