您当前的位置:首页 > 电脑百科 > 数据库 > 百科

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

时间:2022-07-27 15:08:55  来源:  作者:java资料库哆啦A梦

数据持久化

数据持久化就是 内存中的数据模型转换为存储模型 ,以及 将存储模型转换为内存中的数据模型 的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、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 本机端口号:3306String 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. 数据库连接和关闭工具类 : 避免了数据库连接和关闭代码的重复使用,方便修改


Tags:数据库   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  Search: 数据库  点击:(9)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28  Search: 数据库  点击:(19)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  Search: 数据库  点击:(20)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12  Search: 数据库  点击:(37)  评论:(0)  加入收藏
让数据库和缓存数据保持一致的三种策略
如何保证缓存和数据库的一致性,这算得上是个老生常谈的话题啦,看到好多技术新人在写更新缓存数据代码,采用了非常复杂甚至“诡异”的方案,甚为不解。一、背景目前随着缓存架构方...【详细内容】
2024-02-20  Search: 数据库  点击:(45)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  Search: 数据库  点击:(56)  评论:(0)  加入收藏
一篇文章,彻底理解数据库操作语言:DDL、DML、DCL、TCL
本篇文章以具体的SQL语句讲解了数据库SQL语言四大分类(数据定义语言DDL,数据操作语言DML,数据查询语言DQL,数据控制语言DCL),同时也介绍了事务控制语言TCL。最近与开发和运维讨论...【详细内容】
2024-01-30  Search: 数据库  点击:(50)  评论:(0)  加入收藏
一文读懂:什么是数据库,它到底有啥用?
提到数据库,可能很多人会很陌生。但据库其实已经渗入我们生活的方方面面,像网上购物、扫码点餐、抢红包等等应用背后都离不开数据库的支持。可以说数据库是支撑各类应用软件运...【详细内容】
2024-01-25  Search: 数据库  点击:(47)  评论:(0)  加入收藏
oracle数据库基础学习
在当今数字化时代,数据库已成为企业运营的关键要素。而Oracle数据库,作为全球领先的企业级数据库管理系统,更是备受推崇。本文将带您深入了解Oracle数据库的基础知识,帮助您从零...【详细内容】
2024-01-20  Search: 数据库  点击:(106)  评论:(0)  加入收藏
一个流行的支持超多数据库的ORM库
Sequelize 是一个流行的 Node.js ORM(对象关系映射)库,用于在 Node.js 中操作关系型数据库。它支持多种数据库系统,如 PostgreSQL、MySQL、SQLite 和 MSSQL,并提供了简单易用的 A...【详细内容】
2024-01-15  Search: 数据库  点击:(83)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(9)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(7)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(19)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(20)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(11)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(17)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 &darr;select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(13)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(13)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(37)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, &#39;研发部(RD)&#39;, &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(24)  评论:(0)  加入收藏
站内最新
站内热门
站内头条