java连接数据库的5种方式

方式一直接导入第三方库驱动类


这种加载方式在jdbc入门时已经用过,这个driver属于第三方库,。为静态加载,灵活性差,依赖性抢

 

方式二使用反射机制获取

方式一和方式二代码

package com.hsp.edu;import com.mysql.cj.jdbc.Driver;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;//java获取连接的5种方式
public class JdbcConnect {public static void main(String[] args) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {connect01();connect02();}//方式一,直接导入第三方库驱动类public static void connect01() throws SQLException {//获取驱动Driver driver = new Driver();//获取连接String url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useSSL=false&useSer" +"verPrepStmts=true&characterEncoding=utf-8&useSSL=false";//将用户名和密码放入到Properities对象中Properties properties = new Properties();properties.setProperty("user","root");//用户properties.setProperty("password","888888");//密码final Connection connect = driver.connect(url, properties);System.out.println(connect);}//方式二:使用反射加载Driver:动态加载,更加的灵活,减少依赖public static void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, NoSuchMethodException, InvocationTargetException {//获取Driver类的字节码文件对象final Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");//注意:在用字节码文件对象获取Driver对象时,直接newInstance被idea提示已经弃用final Constructor<?> Constructor = clazz.getDeclaredConstructor();final Driver driver = (Driver)Constructor.newInstance();String url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useSSL=false&useSer" +"verPrepStmts=true&characterEncoding=utf-8&useSSL=false";//将用户名和密码放入到Properities对象中Properties properties = new Properties();properties.setProperty("user","root");//用户properties.setProperty("password","888888");//密码final Connection connect = driver.connect(url, properties);System.out.println(connect);}
}

连接方式三:使用DriverManager类

//方式三:使用DriverManager替换Driverpublic static void connect03() throws SQLException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {//DriverManager类支持更好的获取连接的方法,可以直接将用户和密码作为参数,而不用存储到Properitiesfinal Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");final Constructor<?> constructor = clazz.getDeclaredConstructor();final Driver driver =(Driver)constructor.newInstance();//创建url和user和passwordString url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useSSL=false&useSer" +"verPrepStmts=true&characterEncoding=utf-8&useSSL=false";String user = "root";final String password = "888888";DriverManager.registerDriver(driver);//注册Driver驱动final Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);}

连接方式四:在加载Driver类时自动完成驱动注册(以此简化代码)


Driver类的底层源码

静态代码块:在类加载的时候会执行一次
从上面的Driver类的源码可以看出,在加载Driver类的时候,其静态代码块,已经完成了驱动的注册

//方式四:加载Driver时自动完成注册(这种方式使用的最多,推荐使用)public static void connect04() throws ClassNotFoundException, SQLException {//使用反射加载了Driver类//在加载 Driver类时,完成注册Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTC&useSSL=false&useSer" +"verPrepStmts=true&characterEncoding=utf-8&useSSL=false";String user = "root";String password="888888";final Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);}

连接方式五:将信息写入到配置文件

一个疑问:为什么不写`Class.forName("com.mysql.cj.jdbc.Driver");也可以获取到连接?


在驱动文件中META-INF下面的services有个com.mysql.cj.jdbc.Driver文件里面已经记录了加载的全类名。我们的程序将会直接按照文件中的内容进行加载


使用配置文件,当我们需要修改的时候就不用修改代码,只用修改配置文件即可

解惑:Properties类和properties文件没有直接关系(以前认为如果创建了一个properies文件,就已经存在了一个Properties对象)

Properties类只是和properties文件存储的格式一样(以键值对的形式存储),但是在使用的时候还是需要将文件中的数据读取到程序中

  • 配置文件目录
//方式五:进一步优化,将信息写入到配置文件public static void connect05() throws IOException, ClassNotFoundException, SQLException {//通过Properties对象获取配置文件信息Properties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));//此时已经将配置文件的信息读取到了Properties中//获取相关信息final String user = properties.getProperty("user");//用户final String password = properties.getProperty("password");//密码final String url = properties.getProperty("url");//urlfinal String driver = properties.getProperty("driver");Class.forName(driver);//注册驱动final Connection connection = DriverManager.getConnection(url, user, password);//获取连接System.out.println(connection);}

课堂练习

属性文件

package com.hsp;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*
参考老师代码,使用方式5完成
1.创建news表
2.使用jdbc添加5条记录
3.修改id=1的记录content改成一个新的记录*/
public class Jdbc02 {public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {//前置工作:获取配置文件中的信息Properties properties = new Properties();properties.load(new FileInputStream("src\\mysql1.properties"));//读取信息到集合中final String driver = properties.getProperty("driver");//获取全类名final String url = properties.getProperty("url");//获取urlfinal String user = properties.getProperty("user");//获取用户名final String password = properties.getProperty("password");//获取密码System.out.println(properties);//1.注册驱动Class.forName(driver);//2.获取连接final Connection connection = DriverManager.getConnection(url, user, password);//3.执行 SQL语句//String sql1 = "CREATE TABLE news(id INT,content VARCHAR(32))";String sql2="INSERT INTO news VALUES (1,'居民健康'),(2,'商品健康'),(3,'大熊猫')";String sql3="UPDATE news SET content='湖北'WHERE id=1;";final Statement statement = connection.createStatement();//final int row1 = statement.executeUpdate(sql1);//返回影响的行数final int row2 = statement.executeUpdate(sql2);//返回影响的行数final int row3 = statement.executeUpdate(sql3);//:验证是否执行成功/*if(row1!=0){System.out.println("执行成功");}else {System.out.println("执行失败");}*/if (row2!=0){System.out.println("执行成功");}else {System.out.println("执行失败");}if(row3!=0){System.out.println("执行成功");}else {System.out.println("执行失败");}//4.关闭资源statement.close();connection.close();}
}

分类: JDBC和数据库连接池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3816.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IP地址与子网掩码】网络杂谈(19)之IP地址分类与子网掩码的概念

涉及知识点 什么是子网掩码&#xff0c;IP地址的分类&#xff0c;子网掩码的概念&#xff0c;深入了解子网掩码与IP地址,A类&#xff0c;B类&#xff0c;C类&#xff0c;D类&#xff0c;E类ip地址范围。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可…

数据库大题

(计算题&#xff0c;20分) 设有两个关系R和S,求① R ∪ S R \cup S R∪S;② R − S R - S R−S;③ R S R \times S RS;④ ∏ C , A ( R ) \prod_{C,A}(R) ∏C,A​(R);⑤ σ B > ′ 4 ′ ( R ) \sigma_{B>4}(R) σB>′4′​(R) 关系R关系S (简答题&#xff0c;10…

图像基本操作

图像基本操作 环境配置地址&#xff1a; Anaconda:https://www.anaconda.com/download/ Python_whl:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv IDE:按照自己的喜好&#xff0c;选择一个能debug就好 数据读取-图像 cv2.IMREAD_COLOR&#xff1a;彩色图像cv2.IM…

原生JS实现图片裁剪功能

功能介绍&#xff1a;图片通过原生input上传&#xff0c;使用canvas进行图片裁剪。 裁剪框限制不允许超出图片范围&#xff0c;图片限制了最大宽高&#xff08;自行修改要的尺寸&#xff09;&#xff0c;点击确认获取新的base64图片数据 注&#xff1a;fixed布局不适用该方案&…

JDK8新特性-下部

文章目录 一、Stream结果收集1.1 结果收集到集合中1.2 结果集收集到数组中1.3 对流中数据做聚合运算1.4 对流中数据做分组操作1.5 对流中的数据做分区操作1.6 对流中的数据做拼接 二、并行的Stream流2.1 串行的Stream流2.2 并行流2.2.1获取并行流2.2.2 并行流操作 2.3 串行流与…

arcgis js 通过某一个经纬度 定位报错,并且图标变得很大【已解决】

报错 svg.js:42 Error: attribute transform: Expected number, “…0000,0.02102085,NaN,NaN)”. svg.js:49 Error: attribute x: Expected length, “NaN”. svg.js:49 Error: attribute y: Expected length, “NaN”. 图标特别大&#xff0c;也看不到地图 分析 这个方法中…

vhost-net-原理-初始化流程-数据传输流程-vhost-net后端

文章目录 1.vhost net2.vhost-net的初始化流程vhost net设置vhost dev设置vhost vring设置 3.数据收发流程分析3.1 数据发送3.2 数据接收 4ioventfd和irqfd的通知机制4.1ioeventfdqemu侧kvm侧总体效果 4.2irqfdqemu侧kvm侧总体效果 参考&#xff1a; 1.vhost net 传统的virtio…

linux eventfd事件通知 比信号量更好用

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 概述 原理简介 使用场景 接口说明 头文件 参数说明 代码演示 默认参数 …

探讨绿色照明与智能照明节能控制系统应用

张心志 安科瑞电气股份有限公司 上海嘉定 201801 【摘 要】随着社会经济的不断发展&#xff0c;人们对生活质量、环境品质越发重视。积极推广绿色智能照明&#xff0c;提高城市照明质量&#xff0c;对于改善人们居住环境意义重大。文章简要介绍了绿色照 明的基本要求、室内智…

Excel 经常复制粘贴失效,复制表格粘贴不了无反应,怎么解决?

环境&#xff1a; Win10 专业版 Excel2021 L盾加密客户端 wps2021 问题描述&#xff1a; 之前正常的&#xff0c;excel2016和2021 经常复制表格粘贴不了无反应每隔10几分钟随机出现&#xff0c;在表格外面复制粘贴没有问题&#xff0c;把外面东西&#xff0c;粘贴进表格里…

UE5 Stride Warping Orientation Warping功能学习

在UE5的 Lyra Demo中&#xff0c;运用到了各类动画Warping&#xff08;动画扭曲&#xff09;技术&#xff0c;通过各类Warping节点在动画蓝图中的合理组织&#xff0c;可以有效的解决运动滑步问题&#xff0c;并为动画增添更多细节。 本文主要基于Animation Warping插件讲一下…

SQL中的——左连接(Left join)、右连接(Right join)、内连接(Inner join)

前言 最近有一个开发需求&#xff0c;需要实现一个复杂年度报表&#xff0c;前后端都是博主开发&#xff0c;这里的业务逻辑比较复杂&#xff0c;也很锻炼sql能力&#xff0c;这里博主也将表的内外连接做了一个整理分享给大家 一、概念 首先还是介绍一下这三个的定义 1.Lef…