Java JDBC连接和使用详解_javajdbc连接_sunnyday0426的博客-程序员资料

技术标签: Java  JDBC  事务  

1.1 概述

这篇文章主要介绍了Java JDBC以及连接和使用详细介绍的相关资料,需要的同学可以参考下

1.1.1 JDBC

JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基JDBC规范对应的api包。

JDBC(Java DataBase Connectivity)Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的在这里插入图片描述
JDBCJava程序员来说是API,对实现与数据库连接的服务提供商来说是接口模型。它为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。应用程序与数据库交换数据时,通过使用Java.Sql包应用程序使用JDBC APIJava.Sql包的接口由JDBC驱动程序厂商实现,它为一个或多个数据库管理系统接口提供基于`Java``的包容器。

小结Java程序只是调用了JDBC的接口,用来操作数据库,真正执行的是驱动jar包中的实现类。很像Java当中接口和类的关系Java之接口默认方法的定义和使用。

1.1.2 JDBC的优点

  • 使用的驱动不同,即可连接不同的数据库
  • 使用同一套操作来操作不同的数据库
  • 如果每一个数据库Java都制订一套连接方式,那么当不同的数据库更新的时候,Java也需要更新自己的代码,而使用JDBC,使用同一套代码来操作,使用不同的驱动程序(驱动程序由数据库厂商提供)来连接,这使得可以连接不同的数据库。

1.2 JDBC工作流程

JDBC提供的主要功能是:

1)建立数据库连接;
2)向数据库发送SQL语句;
3)处理数据库返回的结果

  • 1、加载驱动程序 Class.forName(driver)JDBC只定义接口,具体实现由各个数据库厂商负责。程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分
  • 2、获取数据库连接,getconnection()调用driverconnect()方法,返回一个实现了Connection接口的对象
  • 3、创建语句对象,利用connection创建的statement执行sql语句。
    Statement / PreparedStatement / CallableStatement
  • 4、提交执行语句对象获取返回的结果集
  • 5、遍历访问结果集
  • 6、关闭

1.2.1 事务

以银行转账为例,张三转给李四100元,执行事务后,如果运行出错将不会提交数据到数据库:
在这里插入图片描述
在这里插入图片描述

1.2.1.1 设置事务管理

连接对象setAutoCommit(boolean)【当参数为true时,代表允许自动提交(事务管理是关闭的,每一条命令都会自动提交);当为false时,代表不允许自动提交,命令会在执行commit之后再统一提交(开启事务管理的)】

提交事务:连接对象commit()

回滚事务:连接对象rollback()

1.3 JDBC使用案例

1.3.1 加载驱动

Class.from("com.mysql.jdbc.Driver");

1.3.2 创建连接

//导包使用 java.sql.*;
String jdbc="jdbc:mysql://localhost:3306/student?user=root&password=&characterEncoding=utf-8";//student是表名
Connection conn = DriverManager.getConnection(jdbc);

注意 数据库打开之后一定要记得关

conn.close();

1.3.3 执行SQL语句(创建表,插入,删除,更新)

使用Statemant

Statemant st = conn.createStatemant();
 int row = st.executeUpdate(sql语句);//不能做查询操作。

使用PrepareStatement
可以使用?占位符来代替你需要传递的参数

String sql = "insert into " + TABLENAME
+ "(name,subject,score) values(?,?,?)";
PrepareStatement pt = conn.prepareStatement(sql);
 //给每一位占位符设置值,下标从1开始
 pt.setString(1,score.getName());
 pt.setString(2.score.getSubject());
pt.setDouble(3,score.getScore());
 //使用无参的方法
pt.executeUpdate();

1.3.4 查询操作

static List<Score> queryScore(Connection pconn, Score pScore)
      throws SQLException {
    
    ArrayList<Score> mlist = new ArrayList<>();
    String sql = "select * from " + TABLENAME + " where name = ?";
    PreparedStatement ps = pconn.prepareStatement(sql);
    ps.setString(1, pScore.getName());
    ResultSet rs = ps.executeQuery();
 
    while (rs.next()) {
    
      // 这里可以通过rs获取所有结果
      String subject = rs.getString("subject");
      int id = rs.getInt("id");
      double score = rs.getDouble("score");
      mlist.add(new Score(id, pScore.getName(), subject, score));
    }
    return mlist;
  }

1.3.5 完整示例小程序

//建立数据库连接类
public class DAO {
    
 
  // 放问数据库的链接地址
  static String jdbc = "jdbc:mysql://localhost:3306/student?user=root&password=&characterEncoding=utf-8";
 
  // 打开链接
  public static Connection connection() {
    
    // 使用JDBC的步骤
    // 1. 加载JDBC驱动
    try {
    
      // 类的全名 包名+类名
      Class.forName("com.mysql.jdbc.Driver");
      // 2. 连接数据库
      Connection conn = DriverManager.getConnection(jdbc);
      return conn;
    } catch (Exception e) {
    
      System.out.println("驱动加载失败");
      return null;
    }
  }
}
 
------------------------------------------------------------------------------------- 
//分数实体类
public class Score {
    
  String name;
  String id;
  String subject;
  double score;
}
------------------------------------------------------------------------------------- 
//测试类
public class Test {
    
  public static String TABLENAME = "score";
 
 //测试主方法
  public static void main(String[] args) {
    
    try {
    
      Connection conn = DAO.connection();
      if (conn != null) {
    
        System.out.println("链接上了");
        List<Score> list = queryScoreByName(conn, "王五"); //queryAllScore(conn);
        for (Score score : list) {
    
          System.out.println(score);
        }
        conn.close();
      } else {
    
        System.out.println("链接失败 ");
      }
    } catch (SQLException e) {
    
      e.printStackTrace();
    }
  }
 
  // 创建一张表
  public static boolean createTable(Connection conn) {
    
    // 开始执行sql语句
    String sql = "create table "
        + TABLENAME
        + "(id integer primary key auto_increment,name varchar(3) not null,subject varchar(20) not null,score double)";
    // 要执行一条语句,需要一个执行的类 Statement
    try {
    
      Statement st = conn.createStatement();
      int result = st.executeUpdate(sql);
      System.out.println(result);
      if (result != -1)
        return true;
    } catch (SQLException e) {
    
      e.printStackTrace();
    }
    return false;
  }
 
  // 添加一条记录
  public static boolean addScore(Connection conn, Score score)
      throws SQLException {
    
    String sql = "insert into " + TABLENAME
        + "(name,subject,score) values('" + score.getName() + "','"
        + score.getSubject() + "'," + score.getScore() + ")";
    System.out.println(sql);
    Statement st = conn.createStatement();
    int row = st.executeUpdate(sql);
    if (row > 0)
      return true;
    return false;
  }
 
  // 添加一条记录2
  public static boolean addScore2(Connection conn, Score score)
      throws SQLException {
    
    // 占位符?来代替需要设置的参数
    String sql = "insert into " + TABLENAME
        + "(name,subject,score) values(?,?,?)";
    PreparedStatement ps = conn.prepareStatement(sql);
    // 必须给定?所代表的值
    ps.setString(1, score.getName());
    ps.setString(2, score.getSubject());
    ps.setDouble(3, score.getScore());
    // 调用无参的方法
    int row = ps.executeUpdate();
    if (row > 0)
      return true;
    return false;
  }
 
  public static boolean deleteScore(Connection conn, Score score)
      throws SQLException {
    
    String sql = "delete from " + TABLENAME + " where name=? and subject=?";
    // 创建PrepareStatement
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, score.getName());
    ps.setString(2, score.getSubject());
    // 执行
    int row = ps.executeUpdate();
    System.out.println(row);
    if (row > 0)
      return true;
    return false;
  }
 
  public static boolean updateScore(Connection conn, Score score)
      throws SQLException {
    
    // 修改 score人他的科目的成绩
    String sql = "update " + TABLENAME
        + " set score=? where name=? and subject=?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setDouble(1, score.getScore());
    ps.setString(2, score.getName());
    ps.setString(3, score.getSubject());
    int row = ps.executeUpdate();
    System.out.println(row);
    if (row > 0)
      return true;
    return false;
  }
 
  public static List<Score> queryAllScore(Connection conn)
      throws SQLException {
    
    String sql = "select * from " + TABLENAME;
    // 开始查询
    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery(sql);
    List<Score> list = new ArrayList<Score>();
    while (rs.next()) {
    
      // 这里可以通过rs获取所有结果
      String id = rs.getString("id");
      String name = rs.getString("name");
      String subject = rs.getString("subject");
      double score = rs.getDouble("score");
      list.add(new Score(name, id, subject, score));
    }
    // 结束
    return list;
  }
 
  public static List<Score> queryScoreByName(Connection conn, String name)
      throws SQLException {
    
    String sql = "select * from " + TABLENAME + " where name=?";
    PreparedStatement pt = conn.prepareStatement(sql);
    pt.setString(1, name);
    ResultSet rs = pt.executeQuery();
    List<Score> list = new ArrayList<>();
    while (rs.next()) {
    
      String subject = rs.getString("subject");
      String id = rs.getString("id");
      double score = rs.getDouble("score");
      list.add(new Score(name, id, subject, score));
    }
    return list;
  }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42039228/article/details/123438786

智能推荐

salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见_lceBear的博客-程序员资料

项目中,审批操作无处不在。配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个。当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随便的取一个审批人了,有以下方式针对不同的场景可以获取到当前记录的最终审批人以及审批意见。邮件内容使用以下几种方式实现:  1.代码里面实现邮件发送  2.email template(te...

bzoj 3743 [ Coci 2015 ] Kamp —— 树形DP_aodan5477的博客-程序员资料

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的最长路,就可以得到答案,可以DP;然而写着写着写不下去了,不会求向上最小值和最长路;于是看看TJ,原来要再记录一个次长路!然而写挫了,写不下去了...#includ...

java direct memory_Java VM.maxDirectMemory方法代码示例_长佑的博客-程序员资料

import sun.misc.VM; //导入方法依赖的package包/类static void reserveMemory(long size, int cap) {if (!memoryLimitSet &amp;&amp; VM.isBooted()) {maxMemory = VM.maxDirectMemory();memoryLimitSet = true;}// optimist...

单片机-bmp280大气压强与温度传感器使用详解_bmp280 电流大_zhangyl000的博客-程序员资料

单片机 BMP280大气压强与温度传感器使用详解 转载:https://blog.csdn.net/sunshinebooming/article/details/79637822最近实习中一个项目要用到多种传感器,其中就包括BMP280模块,但是发现网上有用的资料非常少,...

go - cron定时任务_robfig/cron 每10秒_zzsan的博客-程序员资料

本文重点gin结合cron实现定时任务定时任务cron执行不成功?定时任务原理(todo, 有时间再补充)gin结合cron实现定时任务传送门cron代码库cron文档V3cron文档简单示例话不多说, 先上一个最简单, 开箱即用的例子相关依赖 go get github.com/robfig/cron/[email protected]示例代码package mainimport ( "fmt" "github.com/gin-gonic/gin" "github.com/rob

Python使用pdfminer解析PDF_pdfminer3k读取出来怎么分段落_shao824714565的博客-程序员资料

因为爬虫爬到的字段不是很全,需要去解析PDF来获取一部分字段,于是就有了这篇博客一.环境配置因为之前的工程是在py2的基础上,本次打算使用py3,于是自己先把py3的环境配置好,个人比较喜欢anaconda,因为内置了很多需要的第三方包,在装一些其他包的时候难免会用到一些依赖包,而anaconda中恰好自带了一部分。(win,mac,linux都有,需要的自行下载安装),安装anacond...

随便推点

前端实现H5制作海报_weixin_30585437的博客-程序员资料

基本介绍最终实现的需求是:将海报模版与自己上传的照片进行合成并且贴上二维码,生成可长按保存的海报。海报H5的基本功能:接入微信SDK上传照片、拍照裁剪图片将海报模板、二维码、上传的照片合成海报长按保存图片方案选择方案一: 采用第三方的裁剪库PhotoClip,和canvas的drawImage进行合成方案二: 采用第三方的裁剪库PhotoClip,和html2ca...

外贸网店开源系统大全,首选zencart!_外贸 开源系统 有哪些_大鹏的世界的博客-程序员资料

对于一个外贸企业选择一个优秀的外贸建站程序在网站建设过程中尤为重要,为支持广大外贸网商们实现“赚发达国家的工资,在国内消费”,我把国外最优秀的外贸网店程序全部公布出来供大家选择。它们总的特点是网站全英文,符合外国人浏览,优化好,对英文主流搜索引擎友好,后台管理方便,支持多语言多货币切换。国外优秀外贸网店程序总汇:   1、OsCommerce http://www.oscommer

第一个Qt程序 Helloworld_qt helloworld代码_matrixant的博客-程序员资料

最近学qt,准备写一系列的博客,边学边写 作为学习的记录与总结,也可以给同样学习qt的同学多一个参考。(虽然我语言组织比较烂–)作为一名C系程序猿,学习过程中第一个程序当然就是Helloworld啦。那么我们来看一下在Qt中的Helloworld是什么样的吧。 顺便说一下,我是在ubuntu下学习qt的,qt版本为5.5,qt creator作为IDE。 如果你是在win下学习,还是建议不

Error 和 Exception 的区别?_error和exception_任重而道远丶的博客-程序员资料

Error 和 Exception 的区别?Error 和 Exception 都是Throwable的子类, 在java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型.1,Exception 和 Error体现了java平台设计者对不同异常情况的分类, Exception是程序正常运行中,可以预料的意外情况,可以被捕获,进行相应的处理.2.Error 是指正常情况下,不大可能出现的情况,绝大部分的Error 都会导致程序处于非正常的,不可恢复的状态, 不需要捕.

EditText属性详解_壹叁零壹的博客-程序员资料

1,EditText基本属性【常用属性】EditText继承关系:View-->TextView-->EditText。 android:layout_gravity="center_vertical"  //在父控件中放置位置android:gravity="center" //内容在当前控件中的位置center/bottom/center_horizontal/ce

Java中几种列表的简单介绍_BestZhao的博客-程序员资料

java中列表的简单介绍与迭代器Collection类中有多种容器类型:List 以特定的顺序保存元素Set 元素不能重复Queue 链表,只能从一端插入对象,从另一端取出 遵循先进先出原则Map 键值对插入List中有两种类型的列表:ArrayList:随机访问快,插入删除慢LinkedList:插入删除快,但是随机访问慢。还添加了作为栈、队列、双端列表的方法,可以直接作为栈来使用,

推荐文章

热门文章

相关标签