数据库持久化+JDBC数据库连接

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

瞬时状态

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

持久状态

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

数据持久化技术

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

JDBC框架

Driver 接口

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

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

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

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

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

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

将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可以降低耦合性

//本机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地址),端口号,数据库名

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

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

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

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

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

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

二、执行sql语句

Statement statement = conn.createStatement();
int result = statement.executeUpdate("sql语句字符串对象")
  • int executeUpdate(sql);
  • 针对数据库的增(insert into)、删(delete from)、改(update set)操作
  • 返回值类型:实际影响的行数
  • ResultSet executeQuery(sql);
  • 针对数据库的查询(select from)操作
  • 返回值类型:一个结果集类型
  • boolean execute(sql);
  • 针对数据库的增删改查操作,一般我们不会使用,jdbc的底层代码会使用
  • 如果执行的sql语句是增删改,返回false
  • 如果执行的sql语句是查询,返回true
//使用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);
}
resultSet.close();
statement.close();
connection.close();

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

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 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  List executeQuery(String sql,List list,Class tClass){
        Connection connection = getConnection();
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List 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

封装查询返回值遍历方式

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

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

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

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

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

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

PreparedStatement类和Statement的比较

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

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

3、PreparedStatement 可以防止 SQL 注入

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

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

2、代表 结果集

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

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

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

常用方法

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

DAO 模式组成

Original: https://www.cnblogs.com/am0304/p/16493993.html
Author: 超甜的小布丁
Title: 数据库持久化+JDBC数据库连接

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622529/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何把 MySQL 备份验证性能提升 10 倍

    JuiceFS 非常适合用来做 MySQL 物理备份,具体使用参考我们的官方文档。最近有个客户在测试时反馈,备份验证的数据准备( xtrabackup –prepare)过程非常…

    数据库 2023年5月24日
    073
  • MySQL数据类型和表操作

    MySQL数据类型和表修改 整型的定义 //创建有符号整数表 CREATE TABLE t1 (id TINYINT); //创建无符号整数表 CREATE TABLE t2 (i…

    数据库 2023年6月16日
    099
  • 腾讯云linux系统安装FTP操作

    命令 rpm -qa | grep vsftpd 来查看是否安装相应的包ftp 如下图已安装 一:安装FTP: 1、命令:yum install -y vsftpd 2、装之后首先…

    数据库 2023年6月11日
    061
  • 工具 | 常用 PostgreSQL 预防数据丢失方案

    作者:张连壮 PostgreSQL 研发负责人从事多年 PostgreSQL 数据库内核开发,对 Citus 有非常深入的研究。 PostgreSQL 本身不具备数据闪回和数据误删…

    数据库 2023年5月24日
    083
  • 分布式全局唯一ID

    方案一、UUID UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片…

    数据库 2023年6月9日
    096
  • 百万数据 mysql count(*)优化

    Original: https://www.cnblogs.com/sunshine-blast/p/16272978.htmlAuthor: 魁哥2020Title: 百万数据 …

    数据库 2023年5月24日
    082
  • Redis集群(二)哨兵模式

    一、作用和架构 1. 作用 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心功能是 主节点的自动故障转移。下面是Redis官方文档对于哨…

    数据库 2023年6月11日
    092
  • datatable 转化成xml以及json

    datatable dt=xxx获取 赋值给应用的字段 var pp=dt.row[0][“datatable里面的字段”].tostring() var …

    数据库 2023年6月9日
    085
  • Linux_文件传输工具_FileZilla

    FileZilla功能介绍: Filezilla是如此容易的下载和启动,你可能不会意识到它是多么强大。只需输入几个基本的服务器设置,您就可以点击一下启动并运行。要上传和下载文件,只…

    数据库 2023年6月11日
    0139
  • NO.1 通讯录管理系统+源代码(C++)

    功能描述:显示简单的菜单,供用户选择操作 实现步骤:直接cout输出 功能描述:根据用户不同的操作代码选择,进入不同的功能,我们使用switch分支结构进行搭建 实现步骤:用whi…

    数据库 2023年6月14日
    076
  • mysql-存储引擎

    1.存储引擎 完整的建表语句:CREATE TABLE dept ( DEPTNO int(2) NOT NULL, DNAME varchar(14) DEFAULT NULL,…

    数据库 2023年5月24日
    087
  • 集成 nacos注册中心配置使用

    pom <span class="hljs-tag"><<span class="hljs-name">pro…

    数据库 2023年6月6日
    0101
  • SQL的约束

    概念:约束是作用于表中字段上的规则,用于限制存储表中的数据; 常见的约束分类:约束 描述 关键字 非空约束 限制该字段的数据不能为null not null 唯一约束 保证该字段的…

    数据库 2023年6月16日
    093
  • 数字加密

    java中使用数组对数字进行简单的加密。 数字加密 需求: 某系统的数字密码:比如1983,采用加密方式进行传输,规则如下:先得到每位数,然后每位数都加上5,再对10取余,最后将所…

    数据库 2023年6月16日
    0170
  • 学习笔记——Django项目中新增数据、修改数据

    2022-09-30 新增数据 方式一: 进入虚拟环境,进入shell工具环境中(”python manage.py shell”),插入数据。在插入数据之…

    数据库 2023年6月14日
    0104
  • linux常用命令(持续更新中…)

    查看所有开机启动服务:systemctl list-unit-files # 按Enter翻页 查看所有开机启动服务:systemctl list-unit-files | gre…

    数据库 2023年6月14日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球