JDBC连接mysql

news2024/12/23 20:15:17

文章目录

    • JDBC简介
    • JDBC-MYSQL驱动下载
    • JDBC使用
      • 通过结果集查询
    • PreparedStatement 预处理查询
    • 事务
    • 批处理
    • 连接池
      • 1.C3P0
      • 2.德鲁伊 druid
    • DBUtils工具

JDBC简介

JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

数据库厂商使用驱动jar包实现JDBC接口,我们只需要导入相应的数据库驱动即可用统一接口访问数据库。

JDBC-MYSQL驱动下载

https://dev.mysql.com/downloads/connector/j/
在这里插入图片描述
上面为linux版本,下面为windows版本。

下载解压之后将里面的jar包放入idea项目文件夹,右键文件夹点击add as Library。
在这里插入图片描述

JDBC使用

  1. 注册驱动
  2. 获取连接
  3. 获取Statement
  4. 执行sql
  5. 关闭连接
  		//1.注册驱动
  		Class.forName("com.mysql.cj.jdbc.Driver"); //建议写,可以没有,会通过jar包中META-INF/services自动注册
  		//从properties文件中获取user=root ,password=123。
        Properties properties = new Properties();
        properties.load(new FileReader("src/mysql.properties"));
        String url="jdbc:mysql://127.0.0.1:3306/test";
		//2.获取连接
        Connection connection = DriverManager.getConnection(url,properties);
		//Connection connection = DriverManager.getConnection(url,user,password); 也可以这样
		//3.获取Statement
        Statement statement = connection.createStatement();
        //4.执行sql
  		String sql="delete from user where name='kd'";
        boolean n = statement.execute(sql);
		//5.关闭连接
        statement.close();
        connect.close();

通过结果集查询

在这里插入图片描述

		String sql="select * from user";
        ResultSet resultSet = statement.executeQuery(sql);
        while(resultSet.next()){
            int uid = resultSet.getInt(1);
            String name = resultSet.getString(2);
            String password = resultSet.getString(3);
            Date birth = resultSet.getDate(4);
            int sal = resultSet.getInt(5);
            System.out.println(uid+name+password+birth+sal);
        }
        resultSet.close();

PreparedStatement 预处理查询

  1. 用?代替sql中的参数
  2. 有效解决sql注入问题(Statement存在sql注入问题)
  3. 效率较高
		String sql="select * from user where uid=? and name=?";
        //通过连接获取preparedStatement对象
        PreparedStatement preparedStatement = connect.prepareStatement(sql);
        int uid=2;
        String name="xiaod";
        //向?赋值
        preparedStatement.setInt(1,uid);
        preparedStatement.setString(2,name);
        ResultSet resultSet = preparedStatement.executeQuery();
        
        while (resultSet.next())
        {
            String passwd = resultSet.getString(3);
            System.out.println(passwd);
        }
        resultSet.close();

事务

connection默认是自动提交的,如要开启事务,需要关闭connection的自动提交,并在事务的末尾执行connection.commit()。

	 	Class.forName("com.mysql.cj.jdbc.Driver");
        String url="jdbc:mysql://127.0.0.1:3306/test";
        Connection connection = null;
        PreparedStatement preparedStatement=null;
        try {
            connection = DriverManager.getConnection(url,"root","root");
            connection.setAutoCommit(false);//取消自动提交,可以理解成开启事务
            String sql="insert into admin values ('kk',5)";
            String sql2="insert into admin values ('kkk',6)";
			//执行sql1
            preparedStatement= connection.prepareStatement(sql);
            preparedStatement.execute();
            Savepoint savepoint = connection.setSavepoint();//设置保存点
            //执行sql2	
            preparedStatement=connection.prepareStatement(sql2);
            preparedStatement.execute();

            connection.commit();//提交事务
        } catch (SQLException e) {        
                connection.rollback();//出错则回滚(撤销本次事务)
                //connection.rollback(Savepoint);//回滚到上次的保存点       
            throw new RuntimeException(e);
        }finally {
        		//关闭连接
                preparedStatement.close();
                connection.close();
        }

批处理

先要在url后加入?rewriteBatchedStatements=true批处理才会生效。

			String sql="insert into admin values (?,?)";
            
            preparedStatement= connection.prepareStatement(sql);
            for (int i = 0; i < 2000; i++) {
                preparedStatement.setString(1,String.valueOf(i));
                preparedStatement.setInt(2,i);
                preparedStatement.addBatch();//将sql存储到Statement batch中
            }
            preparedStatement.executeBatch();//执行batch中的所有sql       

连接池

连接池中持有若干个Connection对象,每次需要的时候就从连接池中获取,可以减少连接的开销,减少系统资源的浪费。

1.C3P0

下载:https://sourceforge.net/projects/c3p0/
下载解压后将c3p0和mchange的jar包复制到lib目录。
在这里插入图片描述
C3P0有两种配置方式:使用setXXX配置、使用xml配置文件配置
使用setXXX配置:

  //创建数据源对象
  ComboPooledDataSource dataSource = new ComboPooledDataSource();
  //配置
  dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
  dataSource.setUser("root");
  dataSource.setPassword("Njtech207209");
  dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
  //从连接池中获取连接
  Connection connection = dataSource.getConnection();
  //执行sql
  PreparedStatement preparedStatement = connection.prepareStatement("select * from user");
  ResultSet resultSet = preparedStatement.executeQuery();

使用xml配置文件配置:
在项目中src目录下创建c3p0-config.xml文件,连接池会在类目录下自动寻找c3p0-config.xml文件。
可以见到c3p0-config.xml已经配置好了连接数据库所要的信息。
c3p0-config.xml :

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
   <default-config>
      <!-- 连接数据库的4项基本参数 -->
      <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
      <property name="user">root</property>
      <property name="password">root</property>
      <!-- 如果池中数据连接不够时一次增长多少个 -->
      <property name="acquireIncrement">5</property>
      <!-- 初始化连接数 -->
      <property name="initialPoolSize">20</property>
      <!-- 最小连接受 -->
      <property name="minPoolSize">10</property>
      <!-- 最大连接数 -->
      <property name="maxPoolSize">20</property>
      <!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
      <property name="maxStatements">0</property>
      <!-- 连接池内单个连接所拥有的最大缓存statements数 -->
      <property name="maxStatementsPerConnection">5</property>
   </default-config>
</c3p0-config>

xml配置修改后的代码:

  //创建数据源对象
  ComboPooledDataSource dataSource = new ComboPooledDataSource();
  //从连接池中获取连接
  Connection connection = dataSource.getConnection();
  //执行sql
  PreparedStatement preparedStatement = connection.prepareStatement("select * from user");
  ResultSet resultSet = preparedStatement.executeQuery();

2.德鲁伊 druid

由阿里编写的连接池实现,速率高于C3P0,推荐使用。
下载地址:https://repo1.maven.org/maven2/com/alibaba/druid/
找到最新版的druid-1.2.9.jar下载即可。
druid.properties配置文件:

url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=root
driverClassName=com.mysql.cj.jdbc.Driver
# 连接池的参数

#初始化连接数
initialSize=10
#最大最大活动连接数
maxActive=20
#最大等待时间
maxWait=20000

druid采用的是创造工厂模式,用DruidDataSourceFactory.createDataSource(properties)获取数据源

 Properties properties = new Properties();
        properties.load(new FileInputStream("src/druid.properties"));
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        long begin= System.currentTimeMillis();
        //测试连接50w次的时间
        for(int i=0;i<500000;i++) {
            Connection connection = dataSource.getConnection();
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println(end-begin);

测试50w次连接耗时:
C3P0 : 1729,DRUID: 893

DBUtils工具

它是Apache组织提供的一个对JDBC进行简单封装的开源工具类,使用它能简化JDBC应用程序的开发,提高代码的可移植性和观赏性,同时也不会影响程序的性能。

下载链接:https://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi
在这里插入图片描述
DBUtils主要实现为QueryRunner对象,主要方法:update、query、execute、batch、insert等。
其中有个重要参数:ResultSetHandler接口执行处理一个结果集对象,将数据转变并处理为任何一种形式,供其他应用使用。常用实现类如下:

BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ScalarHandler:将结果集第一行的某一列放到某个对象中。(处理MySQL中的聚合函数)

具体使用:

QueryRunner queryRunner = new QueryRunner();
        //通过queryRunner将结果返回到List数组中
        String sql="select * from user";
        List<User> userList = queryRunner.query(connection,sql, new BeanListHandler<>(User.class));
        //返回单行数据
        String sql="select * from user where uid=?";
        User user = queryRunner.query(connection, sql, new BeanHandler<>(User.class),2);
        //返回单行单列对象
        String sql="select name from user where uid=1";
        Object name = queryRunner.query(connection, sql, new ScalarHandler<>());
        System.out.println(name);
        //更新
        String sql="update user set password=234 where uid=?";
        int effectRows = queryRunner.update(connection,sql,2);
        System.out.println(effectRows);
        //添加
        String sql="insert into user values(3,'kd','000','1999-03-04',2000)";
        int effectRows = queryRunner.update(connection, sql);
        System.out.println(effectRows);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

极简式看图软件 Pixea Plus for Mac

Pixea Plus for Mac介绍 简单易用&#xff1a;Pixea的用户界面非常简洁直观&#xff0c;容易上手。 图片管理&#xff1a;Pixea允许用户创建个人或业务相册&#xff0c;并提供了图片搜索、排序、过滤等多种管理功能&#xff0c;方便用户组织和查找照片。 图片编辑&#xff1…

【Java 基础篇】Java网络编程:文件下载详解

文件下载是网络应用程序中的一个常见任务&#xff0c;允许用户从远程服务器获取文件。Java提供了丰富的网络编程库&#xff0c;使文件下载变得相对简单。本文将详细介绍如何使用Java进行文件下载&#xff0c;并提供一些相关内容的解释。 什么是文件下载 文件下载是指从一个网…

Django之初入门

一&#xff09;Django简介 1.简介 Django是一个开源的Python Web框架&#xff0c;它以简洁高效的方式帮助开发者构建复杂的Web应用程序。Django采用了MVC&#xff08;Model-View-Controller&#xff09;的架构模式&#xff0c;通过强大的工具和功能&#xff0c;提供了一套完整…

最新版本 在线生成SSL证书源码 后台对接ssl证书api接口

SSL证书是保证网络安全的基本保障之一。向您介绍我们的在线生成SSL证书系统&#xff0c; 支持在线生成SSL证书系统&#xff0c;用户登录可在线申请SSL&#xff0c;后台对接ssl证书api接口。

金融行业如何利用软文营销进行品牌维护

金融行业作为强监管行业&#xff0c;与人民财产息息相关&#xff0c;因此塑造可靠的品牌形象是金融行业必须面对的课题&#xff0c;而金融行业的特性决定了它在品牌传播与建设上会受到一定的限制&#xff0c;因此金融行业想要进行品牌维护的话&#xff0c;软文营销就是非常不错…

频频刷屏朋友圈,白酒如何越来越年轻化?来聊聊白酒企业数字化

最近&#xff0c;某白酒品牌频频吸引大众眼球&#xff0c;白酒与咖啡、巧克力等联名衍生品一经推出便掀起热潮。某商品由于太过火爆&#xff0c;甚至一度售罄下架。 不得不说&#xff0c;我国拥有超大规模内需市场&#xff0c;消费潜力巨大。 当前&#xff0c;创新消费场景加…

vue 路由中 vite 与webpack 动态 导入的方法汇总

vite 动态导入路由&#xff1a; router/index.js文件 //vite 下面寻找 views 文件夹下面所有的page.js文件 let pageList import.meta.glob(../views/**/page.json, {eager: true,import: default, }); //所有的文件 const modules import.meta.glob(../views/**/**.vue);/…

el-select 下拉框全选、多选的几种方式组件

组件一、基础多选 适用性较广的基础多选&#xff0c;用 Tag 展示已选项 <template><el-select v-model"value1" multiple placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.la…

linux下特定usb设备的权限设置

文章目录 背景查找资料解决方案 背景 目前我在Ubuntu下使用一个USB热成像摄像头&#xff0c;通过调用它的sdk进行图像的采集以及获取对应像素点的温度。假设我现在的测试程序名称为MyApp。 当我用下面的命令运行时&#xff0c;程序是正常运行且能从热成像仪采集图像 sudo ./M…

上新!100%国产物料认证,米尔入门级国产核心板全志T113-i方案

自米尔国产全志T113系列的核心板发布以来&#xff0c;这款高性价比、低成本、入门级、高性能的国产核心板咨询不断&#xff0c;配套的开发板已经成交量数百套&#xff0c;深受工程师们的青睐&#xff0c;为了集齐T113全系列的产品&#xff0c;这次米尔发布了基于全志T113-i处理…

Spring学习笔记2 Spring的入门程序

Spring学习笔记1 启示录_biubiubiu0706的博客-CSDN博客 Spring官网地址:https://spring.io 进入github往下拉 用maven引入spring-context依赖 写spring的第一个程序 引入下面依赖,好比引入Spring的基本依赖 <dependency><groupId>org.springframework</groupId&…

DA5 网站用户没有补全的信息

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID …

应用在苹果应用商店该如何进行优化

众所周知&#xff0c;ASO最大化的提高应用程序在商店中的可见性&#xff0c;其目标是获得更多的下载量&#xff0c;同时它也与下载的转化率有关。 1、根据应用阶段追求不同的目标。 它可以是有机增长或转化率的提高&#xff0c;获得更多安装并降低用户获取成本&#xff0c;增加…

【Node.js】定时任务cron:

文章目录 一、文档&#xff1a;【Nodejs 插件】 二、安装与使用【1】安装【2】使用 三、cron表达式&#xff1a;{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}四、案例&#xff1a; 一、文档&#xff1a; 【说明文档】https://www.npmjs.com/package/cron 【Cron表…

Python 打印所有水仙花数

"""打印三位水仙花数介绍&#xff1a;水仙花数是指一个 n 位数&#xff0c;它的每个位上的数字的 n 次幂之和等于它本身。例如&#xff0c;153 是一个三位的水仙花数&#xff0c;因为 (1**3) (5**3) (3**3) 153。下面是一个 Python 程序&#xff0c;用于生成…

【大数据开发技术】实验04-HDFS文件创建与写入

文章目录 一、实验目标二、实验要求三、实验内容四、实验步骤 一、实验目标 熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS原理熟练掌握HDFS的API使用方法掌握单个本地文件写入到HDFS文件的方法掌握多个本地文件批量写入到HDFS文件的方法 二、实验要求 给出主要实验步骤成…

【用unity实现100个游戏之12】unity制作一个俯视角2DRPG《类星露谷物语》资源收集游戏demo

文章目录 前言加快编辑器运行速度素材(1)场景人物(2)工具 一、人物移动和动画切换二、走路灰尘粒子效果探究实现 三、树木排序设计方法一方法二 四、绘制拿工具的角色动画五、砍树实现六、存储拾取物品引入Unity 的可序列化字典类 七、实现靠近收获物品自动吸附八、树木被砍掉的…

PMP考试备考:两个月时间足够吗?

PMP&#xff08;Project Management Professional&#xff09;认证是全球范围内最受认可的项目管理专业资格之一。对于想要提升项目管理技能和职业发展的人来说&#xff0c;PMP认证是一个重要的里程碑。然而&#xff0c;很多人担心备考时间不足以充分准备PMP考试。那么&#xf…

CFimagehost私人图床本地部署结合cpolar内网穿透实现公网访问

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

安防监控/视频云存储/视频智能分析:人员打架/扭打算法识别

随着社会压力激增&#xff0c;越来越多人们性格异常暴躁&#xff0c;一旦遇到摩擦与争执就很容易引起打架斗殴行为。配置TSINGSEE青犀人员打架识别算法的主要目的&#xff0c;是提高公共场所的安全性和减少危险事件的发生。通过使用打架识别算法&#xff0c;可以及时发现并识别…