什么是JDBC?

Java语言访问数据库的一种规范,是一套API。

JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。

JDBC库中所包含的API任务通常与数据库使用:

•连接到数据库

•创建SQL或MySQL语句

•在数据库中执行SQL或MySQL查询

•查看和修改记录

使用JDBC的主要API:

  • DriverManager 驱动程序,为数据库连接提供支持。
  • Connection 连接某一指定的数据库
  • Statement 执行sql语句,获取查询方法,有两个子接口(CallableStatement, PreparedStatement)
  • ResultSet 对结果集进行处理

execute、executeQuery和executeUpdate之间的区别?

方法executeQuery:
用于产生单个结果集(ResultSet)的语句。 这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。

方法executeUpdate:
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

方法execute:
可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。

导入jdbc jar包

jdbc jar包官方下载地址

封装连接数据库的类

public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/mss?useSSL=true";private static final String NAME = "root";private static final String PASSWORD = "911587154";private static Connection conn = null;// 静态代码块(将加载驱动、连接数据库放入静态块中)static {try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection(URL, "root", "911587154");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static Connection getConnection() {return conn;}
}

增删改查(CURE)操作

package test;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class DBDataAction {/***  输入数据表的完整数据进行添加* @param name* @param sex* @param age* @param date*/public void addData(String name, int sex, int age, Date date) {Connection conn = DBUtil.getConnection();String sql = "insert into user(name,sex,age,birthday)  values(?,?,?,?)";PreparedStatement psmt = null;// 预编译sql语句try {psmt = conn.prepareStatement(sql);// 先对应SQL语句,给SQL语句传递参数psmt.setString(1, name);psmt.setInt(2, sex);psmt.setInt(3, age);psmt.setDate(4, new java.sql.Date(date.getTime()));psmt.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (psmt != null) {try {psmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/*** 根据列名和参数删除指定的数据库* @param column* @param parm*/public void deleteData(String column, String parm) {Connection conn = DBUtil.getConnection();String sql = "delete from user where " + column + "=?";PreparedStatement psmt = null;// 预编译sql语句try {psmt = conn.prepareStatement(sql);// 先对应SQL语句,给SQL语句传递参数psmt.setString(1, parm);psmt.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (psmt != null) {try {psmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/*** 修改一条记录全部的数据* @param name* @param sex* @param date* @param age* @param id*/public void updateData(String name, int sex, Date date, int age, int id) {Connection conn = DBUtil.getConnection();String sql = "update user set name=?,sex=?,birthday=?,age=?  where id=?";PreparedStatement psmt = null;// 预编译sql语句try {psmt = conn.prepareStatement(sql);// 先对应SQL语句,给SQL语句传递参数psmt.setString(1, name);psmt.setInt(2, sex);psmt.setDate(3, new java.sql.Date(date.getTime()));psmt.setInt(4, age);psmt.setInt(5, id);psmt.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (psmt != null) {try {psmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/*** 使用频率最高的操作,使用了特殊方法增加了查询的灵活性* @param params*/public void queryData(List<Map<String, Object>> params) {Connection conn = DBUtil.getConnection();StringBuffer sb = new StringBuffer();sb.append("select * from user where 1=1 ");// 注意where 1=1 的小技巧if (params != null && params.size() > 0) {// 先判断集合是否为空// 遍历集合for (int i = 0; i < params.size(); i++) {Map<String, Object> map = params.get(i);sb.append("and " + map.get("name") + " " + map.get("rela") + " " + map.get("value") + " ");// 查询什么?关系是什么?以及值是什么,我们都可以通过参数传进来。}}//System.out.println(sb.toString());PreparedStatement psmt = null;ResultSet rs = null;// 预编译sql语句try {psmt = conn.prepareStatement(sb.toString());rs = psmt.executeQuery();while (rs.next()) {rs.getInt("id");rs.getString("name");rs.getInt("age");rs.getInt("sex");rs.getDate("birthday");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (rs != null) {rs.close();}if (psmt != null) {psmt.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {//删// new DBDataAction().deleteData("id","1");//增//new DBDataAction().addData("mss", 1, 13, new Date());//改//new DBDataAction().updateData("dsf", 0, new Date(), 34, 1);//查List<Map<String, Object>> parms=new ArrayList<>();Map<String, Object> parm=new HashMap<>();parm.put("name", "name");parm.put("rela", "=");parm.put("value", "'shanshui'");//注意加上单引号,因为这个变量是字符串的形式parms.add(parm);parm=new HashMap<>();parm.put("name", "age");parm.put("rela", "=");parm.put("value", "15");//注意加上单引号,因为这个变量是字符串的形式parms.add(parm);new DBDataAction().queryData(parms);}
}

prepareStatement这个方法会将SQL语句加载到驱动程序conn集成程序中,但是并不直接执行而是当它调用execute()方法的时候才真正执行。
上面SQL中的参数用?表示,相当于占位符,然后在对参数进行赋值。
当真正执行时,这些参数会加载在SQL语句中,把SQL语句拼接完整才去执行。这样就会减少对数据库的操作

这个查询的亮点在于:使用get(List < Map< String,Object>> params) 和 where 1=1;

jdbc传参数过多的时候:用List< Map< String,Object>> params双泛型作为参数.

我们查询的每一个条件都是一个键值对。键值对的数据结构就是Map。
然后是因为查询的条件可能是多个,数量不确定,所以用List 比较好,所以就会是List< Map < key,value>>这样的数据结构了。

上面使用where 1=1的原因主要是下面的语句直接就跟着一个and。SQL语句后面需要跟着where,但不确定where后面是否有语句,就要加上1=1,保证语法不会出错。

一般用于构造动态SQL语句,”SELECT … FROM … WHERE 1=1 “+动态构造条件子句。

在使用JDBC时要及时释放资源,一般在静态代码块中写连接数据库(Connection )的操作,然后Connection 就一直放在内存中,不要关闭,当使用Statement 执行sql语句和ResultSet 对结果集进行处理时要释放,一般从小到大先close ResultSet 在close Statement 。、

事务管理

关于事务是什么我就不说了,网上有很多介绍,简单的说就是定义一系列的数据库操作,其中有一个失败全部的操作都取消。这里我简单讲一下他如何使用:

public class DBDataAction {/***  输入数据表的完整数据进行添加* @param name* @param sex* @param age* @param date* @throws SQLException */public void addData(Connection conn,String name, int sex, int age, Date date) throws SQLException {String sql = "insert into user(name,sex,age,birthday)  values(?,?,?,?)";PreparedStatement psmt = null;// 预编译sql语句psmt = conn.prepareStatement(sql);// 先对应SQL语句,给SQL语句传递参数psmt.setString(1, name);psmt.setInt(2, sex);psmt.setInt(3, age);psmt.setDate(4, new java.sql.Date(date.getTime()));psmt.executeUpdate();}/*** 修改一条记录全部的数据* @param name* @param sex* @param date* @param age* @param id* @throws SQLException */public void updateData(Connection conn,String name, int sex, Date date, int age, int id) throws SQLException {String sql = "update user set name=?,sex=?,birthday=?,age=?  where id=?";PreparedStatement psmt = null;// 预编译sql语句psmt = conn.prepareStatement(sql);// 先对应SQL语句,给SQL语句传递参数psmt.setString(1, name);psmt.setInt(2, sex);psmt.setDate(3, new java.sql.Date(date.getTime()));psmt.setInt(4, age);psmt.setInt(5, id);psmt.executeUpdate();}public static void main(String[] args) {Connection conn=ConnectionFactory.getConnection();try {//数据库不自动提交conn.setAutoCommit(false);new DBDataAction().addData(conn,"mss", 1, 13, new Date());new DBDataAction().updateData(conn,"dsf", 0, new Date(), 34, 1);    //提交事务conn.commit();} catch (SQLException e) {// TODO Auto-generated catch blocktry {//回滚事务conn.rollback();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}e.printStackTrace();}}
}

JDBC之mysql入门相关推荐

  1. mysql桥梁表_以JDBC为桥梁入门MySQL数据库基础

    MySQL入门代码,以JDBC为桥梁 1.[代码][Java]代码 /* * 张泽旺编写,SYSU * 2015-4-28 */ import java.sql.Connection; import ...

  2. idea修改完jdbc文件后没有更新_JDBC+MySQL入门案例

    前言 hello我是bigsai(微信可以搜索一下哦),今天咱们进行JDBC+MySQL实战,非常适合初入门的小伙伴打开新的世界.实现一个增删改查(curd)的例子.先点赞再观看.帅哥靓女养成好习惯! ...

  3. JDBC+MySQL入门增删改查案例

    目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...

  4. Java新手入门200例124之用JDBC连接Mysql数据库

    文章目录 作者简介 引言 导航 热门专栏推荐 一.创建web项目 二.加入Mysql驱动 三.编写查询代码 四.测试查询代码 五.编写插入代码 六.编写修改代码 七.编写删除代码 小结 导航 热门专栏 ...

  5. 基于Servlet+JDBC+Bootstrap+MySQL+AJAX权限管理系统项目实战教程

    项目简介 权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新对系统的权限进行设计,以满足不同系统用户的需求,将会浪费我们不少宝贵时间,所以花时间来设计一个相对通用的权限系统是很有意 ...

  6. JDBC概念快速入门工具类Util的写法

    JDBC概念&快速入门&工具类Util的写法 概念 Java Database Connectivity Java 数据库连接,用Java语言操作数据库 JDBC本质:官方定义的一套操 ...

  7. HTML+CSS+JS+MYSQL入门总结:

    HTML+CSS+JS+MYSQL入门总结: HTML: 概念:最基础的网页开发语言--->Hyper Text Markup Language超文本标记语言 *超文本:用超链接的方法,将各种不 ...

  8. [转载]Tomcat+Mysql入门实例 滚动横幅广告

    Tomcat+Mysql入门实例 滚动横幅广告 创建自己的基于 Java 的滚动横幅广告 站长注:以前做过这个例子,不过好象是mysql4.012+tomcat 4 ,现在这两个软件都升级了,而且我自 ...

  9. Android下使用JDBC连接Mysql实现创建账号

    毕设选到了一个Android应用的选题,自学了一个多月开始动手,大概就是一个家政app,要能发布需求等等. 既然有这方面的需求,就肯定需要实现数据同步,网上教学视频里一般都是教的SQLite,那玩意是 ...

最新文章

  1. 二值网络--XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
  2. 48.结构体位域获取内存模型
  3. STM32 进阶教程 12 - M4的硬件乘法器使用
  4. android excel 筛选功能,Android实现Excel表格展示数据
  5. java学到什么程度才有用处_如何自学Java?Java学到什么程度才可以找工作?
  6. vue点击按钮上传图片_关于javascript:Vue-点击按钮提交表单
  7. k2p 官方固件_继斐讯K2P之后,红米AC2100也将成一代路由器神机?
  8. apache apr介绍
  9. 用fiddler解决跨域访问
  10. 推流中转服务器,视频推流服务器EasyRTMPLive拉转推过程当中遇到复杂目的地址解决方法?...
  11. 用 Markdown 写作(一)——添加文章页内导航
  12. 推荐Android中两个很好用的banner,可无限轮播,可使用第三方图片加载框架加载网络图...
  13. MyBatis分页插件PageHelper
  14. OFD文件怎么编辑修改?
  15. 如何从技术上实现「朋友圈@微信官方头像添加圣诞帽」?
  16. mongodb for mac安装
  17. LaTeX 表格标题位置无法移动的问题
  18. 店铺如何提升流量,抢占先机
  19. poj 1637 Sightseeing tour 混合欧拉图判定
  20. JS实现百度地图搜索悬浮窗功能

热门文章

  1. 作为Java开发程序员,中科创达java应届生薪资
  2. 干货 | NLP算法岗大厂面试经验与路线图分享
  3. 苹果cmsv10仿韩剧TV网电脑加手机高端模板免费下载
  4. AJAX框架衣柜内部结构,衣柜内部结构图以及内部功能细分 超详细
  5. CK-FR08-E01与恩基士PLC配置指南
  6. 马云励志演讲:要相信80后、90后创业
  7. nacos适配达梦、人大金仓数据库
  8. Learning Tone Curves for Local Image Enhancement
  9. 微服务SpringCloud的平台架构及原理分析
  10. Android 多语言支持