JDBC的概念

  JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

JDBC的使用流程

导入jar包

  1、下载有关数据库的jar包(下载地址:http://central.maven.org/maven2/mysql/mysql-connector-java/)

  2、导入jar包,在Build Path里配置环境

    Build Path-->Add JARs

加载驱动

  1. // 加载驱动程序:Class.forName(driverClass)
  2.  
  3. // 加载mysql驱动:
  4. Class.forName("com.mysql.jdbc.Driver");
  5. Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0版本以后的mysql驱动
  6.  
  7. // 加载oracle驱动:
  8. Class.forName("oracle.jdbc.driver.OracleDriver");

获取数据库连接对象

  1. String url = "jdbc:mysql://localhost:3306/test";
  2. String user = "root";
  3. String password = "123456";
  4. Connection conn = DriverManager.getConnection(url, user, password);

  参数含义:

    url: 表示要连接的数据地址

    user: 数据库的用户名

    password: 数据库的密码

  作用:

    连接到指定的数据库并返回连接对象。

创建sql命令对象(编译和发送sql命令给数据库)

  1. Statement stmt = conn.createStatement();

创建sql命令

  1. String sql = "insert into user values(13,'王13','wang13')";

指定sql命令,获得返回结果

  1. int i = stmt.executeUpdate(sql);
    ResultSet rs = stmt.executeQuery(sql)

  增删改 时调用 stmt.executeUpdate(sql)方法。返回值为 int类型。大于等于 1 时表示成功,为 0 时表示失败。  

  查询 调用 stmt.executeQuery(sql)方法。返回ResultSet 类型,表示一个结果集。

  ResultSet对象是基于指针进行数据存储的,类似枚举。不便于数据的针对性的获取。可将数据转换到ArrayList中进行存储。

关闭资源

  1. stmt.close();
  2. conn.close();

  关闭之前打开的资源。需要抛出异常。

对数据的增删改查

增加 (insert)

  1. // 声明jdbc变量
  2. Connection conn = null;
  3. Statement stmt = null;
  4. // 声明jdbc参数
  5. String driver = "com.mysql.cj.jdbc.Driver";
  6. String url = "jdbc:mysql://localhost:3306/test";
  7. String user = "root";
  8. String password = "123456";
  9. try {
  10. // 1 加载驱动类
  11. Class.forName(driver);
  12. // 2.获取数据库连接对象(连接指定数据库)
  13. conn = DriverManager.getConnection(url, user, password);
  14. // 3.创建sql命令对象(编译和发送sql命令给数据库)
  15. stmt = conn.createStatement();
  16. // 4.创建sql命令
  17. String sql = "insert into user values(13,'王13','wang13')";
  18. // 5.指定sql命令
  19. int i = stmt.executeUpdate(sql);
  20. System.out.println("执行结果:" + i);
  21. } catch (ClassNotFoundException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. } catch (SQLException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. } finally {
  28. // 6.关闭资源
  29. try {
  30. stmt.close();
  31. conn.close();
  32. } catch (SQLException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. }

修改 (update)

  1. // 声明jdbc变量
  2. Connection conn = null;
  3. Statement stmt = null;
  4.  
  5. // 声明jdbc参数
  6. String driver = "com.mysql.cj.jdbc.Driver";
  7. String url = "jdbc:mysql://localhost:3306/test";
  8. String user = "root";
  9. String password = "123456";
  10.  
  11. try {
  12. // 1 加载驱动类
  13. Class.forName(driver);
  14.  
  15. // 2.获取数据库连接对象(连接指定数据库)
  16. conn = DriverManager.getConnection(url, user, password);
  17.  
  18. // 3.创建sql命令对象(编译和发送sql命令给数据库)
  19. stmt = conn.createStatement();
  20.  
  21. // 4.创建sql命令
  22. String sql = "update user set username='王update' where id=13";
  23.  
  24. // 5.指定sql命令
  25. int i = stmt.executeUpdate(sql);
  26. System.out.println("执行结果:" + i);
  27.  
  28. } catch (ClassNotFoundException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. } catch (SQLException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. } finally {
  35. // 6.关闭资源
  36. try {
  37. stmt.close();
  38. conn.close();
  39. } catch (SQLException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }

删除 (delete)

  1. // 声明jdbc变量
  2. Connection conn = null;
  3. Statement stmt = null;
  4.  
  5. // 声明jdbc参数
  6. String driver = "com.mysql.cj.jdbc.Driver";
  7. String url = "jdbc:mysql://localhost:3306/test";
  8. String user = "root";
  9. String password = "123456";
  10.  
  11. try {
  12. // 1 加载驱动类
  13. Class.forName(driver);
  14.  
  15. // 2.获取数据库连接对象(连接指定数据库)
  16. conn = DriverManager.getConnection(url, user, password);
  17.  
  18. // 3.创建sql命令对象(编译和发送sql命令给数据库)
  19. stmt = conn.createStatement();
  20.  
  21. // 4.创建sql命令
  22. String sql = "delete from user where id=11";
  23.  
  24. // 5.指定sql命令
  25. int i = stmt.executeUpdate(sql);
  26. System.out.println("执行结果:" + i);
  27.  
  28. } catch (ClassNotFoundException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. } catch (SQLException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. } finally {
  35. // 6.关闭资源
  36. try {
  37. stmt.close();
  38. conn.close();
  39. } catch (SQLException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }

查询(select)

  1. // 声明jdbc变量
  2. Connection conn = null;
  3. Statement stmt = null;
  4. // 声明jdbc参数
  5. String driver = "com.mysql.cj.jdbc.Driver";
  6. String url = "jdbc:mysql://localhost:3306/test";
  7. String user = "root";
  8. String password = "123456";
  9. try {
  10. // 1 加载驱动类
  11. Class.forName(driver);
  12. // 2.获取数据库连接对象(连接指定数据库)
  13. conn = DriverManager.getConnection(url, user, password);
  14. // 3.创建sql命令对象(编译和发送sql命令给数据库)
  15. stmt = conn.createStatement();
  16. // 4.创建sql命令
  17. String sql = "select * from user";
  18. // 5.指定sql命令
  19. ResultSet rs = stmt.executeQuery(sql);
  20. while (rs.next()) {
  21. System.out.println(rs.getInt(1) + " " + rs.getString("username") + " " + rs.getString(3));
  22. }
  23. } catch (ClassNotFoundException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. } catch (SQLException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } finally {
  30. // 6.关闭资源
  31. try {
  32. stmt.close();
  33. conn.close();
  34. } catch (SQLException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }

  

JDBC的事务管理

  事务:一个事件的完成需要几个子操作的联合完成。只要有一个子操作执行失败,则数据回滚到原始状态,都成功则提交数据。

  JDBC默认为自动提交事务。进行增删改操作时应将其设置为手动提交。

  1. conn.setAutoCommit(false);

  默认值为true,自动提交。 false 为手动提交。

  使用try catch进行SQL命令执行提交和回滚。

  1. try {
  2. conn.commit();
  3. } catch (SQLException e) {
  4. conn.rollback();
  5. e.printStackTrace();
  6. }

  try 中使用 conn.commit() 进行数据提交,若报错则在 catch 中使用 conn.rollback() 进行事务回滚。

使用PreparedStatement对象进行数据库操作

PreparedStatement对象与Statement对象的比较

  Statement对象进行数据库操作时可能会出现 sql 注入的风险。

  preparedStatement对象在sql语句中使用占位符,可以防止sql注入。可以预编译,批量执行同一条SQL语句时效率远大于Statement对象。

  1. // statement对象执行sql语句
  2. Statement stmt = conn.createStatement();
  3. String sql = "insert into user values(13,'王13','wang13')";
  4. int i = stmt.executeUpdate(sql);
  5.  
  6. // preparedStatement对象执行sql语句
  7. String sql = "insert into user values(?,?,?)";
  8. PraparedStatement ps = conn.prepareStatement(sql);
  9. ps.setInt(1, 15);
  10. ps.setString(2, "王15");
  11. ps.setString(3, "123456");
  12. int i = ps.executeUpdate();

优化封装代码

  1. driver=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/test
  3. user=root
  4. password=123456

db.properties

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9. import java.util.Properties;
  10.  
  11. public class JUtil {
  12. private static String driver;
  13. private static String url;
  14. private static String user;
  15. private static String password;
  16.  
  17. static {
  18. // 创建properties对象获取属性文件的内容
  19. Properties p = new Properties();
  20. // 获取属性文件的读取对象流
  21. InputStream is = JUtil.class.getResourceAsStream("/db.properties");
  22. try {
  23. // 加载属性配置文件
  24. p.load(is);
  25. // 获取jdbc参数
  26. driver = p.getProperty("driver");
  27. url = p.getProperty("url");
  28. user = p.getProperty("user");
  29. password = p.getProperty("password");
  30. // 加载驱动
  31. Class.forName(driver);
  32. } catch (IOException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. } catch (ClassNotFoundException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. // 获取Connection对象
  42. public static Connection getConn() {
  43. Connection conn = null;
  44. try {
  45. conn = DriverManager.getConnection(url, user, password);
  46. } catch (SQLException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. }
  50. return conn;
  51. }
  52.  
  53. // 获取PreparedStatement对象
  54. public static PreparedStatement getPre(Connection conn,String sql) {
  55. PreparedStatement ps = null;
  56. try {
  57. ps = conn.prepareStatement(sql);
  58. } catch (SQLException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62. return ps;
  63. }
  64.  
  65. // 关闭资源
  66. public static void closeAll(Statement stmt,Connection conn) {
  67. try {
  68. stmt.close();
  69. } catch (SQLException e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. }
  73. try {
  74. conn.close();
  75. } catch (SQLException e) {
  76. // TODO Auto-generated catch block
  77. e.printStackTrace();
  78. }
  79. }
  80. }

工具类Jutil

  1. /**
  2. * 封装DML
  3. * @param sql sql语句
  4. * @param objs 参数数组
  5. * @return i 大于等于 1 时执行成功,等于 0 时执行失败。
  6. */
  7. private int executeDML(String sql,Object ... objs) {
  8. Connection conn = null;
  9. PreparedStatement ps = null;
  10. int i= 0;
  11. try {
  12. // 创建连接对象
  13. conn = JUtil.getConn();
  14. // 手动提交事物
  15. conn.setAutoCommit(false);
  16. // 获得sql语句及参数
  17. ps = JUtil.getPre(conn, sql);
  18. // 给占位符赋值
  19. for(int j = 0; j < objs.length; j++) {
  20. ps.setObject(j+1, objs[j]);
  21. }
  22. // 执行sql命令
  23. i = ps.executeUpdate();
  24. // 提交
  25. conn.commit();
  26. } catch (SQLException e) {
  27. try {
  28. // 回滚
  29. conn.rollback();
  30. } catch (SQLException e1) {
  31. e1.printStackTrace();
  32. }
  33. } finally {
  34. JUtil.closeAll(ps, conn);
  35. }
  36. return i;
  37. }

封装DML(增删改)

  1. /**
  2. * 增加
  3. * @param id
  4. * @param name
  5. * @param pwd
  6. * @return i 大于等于 1 时执行成功,等于 0 时执行失败。
  7. */
  8. public int insert(int id,String name,String pwd) {
  9. String sql = "insert into user values(?,?,?)";
  10. int i = executeDML(sql,id,name,pwd);
  11. return i;
  12. }

insert增加

  1. /**
  2. * 修改
  3. * @param id
  4. * @param name
  5. * @param pwd
  6. * @return i 大于等于 1 时执行成功,等于 0 时执行失败。
  7. */
  8. public int update(int id,String name,String pwd) {
  9. String sql = "update user set username=? where id=?";
  10. int i = executeDML(sql,name,id);
  11. return i;
  12. }

update修改

  1. /**
  2. * 删除
  3. * @param id
  4. * @param name
  5. * @param pwd
  6. * @return i 大于等于 1 时执行成功,等于 0 时执行失败。
  7. */
  8. public int delete(int id,String name,String pwd) {
  9. String sql = "delete from user where id=?";
  10. int i = executeDML(sql, id);
  11. return i;
  12. }

delete删除

  1. /**
  2. * 查询
  3. * @return
  4. */
  5. public List<User> select() {
  6. Connection conn = JUtil.getConn();
  7. String sql = "select * from user";
  8. PreparedStatement ps = JUtil.getPre(conn, sql);
  9. List<User> us = new ArrayList<User>();
  10. try {
  11. ResultSet rs = ps.executeQuery();
  12. while(rs.next()) {
  13. User u = new User();
  14. u.setId(rs.getInt(1));
  15. u.setName(rs.getString(2));
  16. u.setPwd(rs.getString(3));
  17. us.add(u);
  18. }
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. } finally {
  22. JUtil.closeAll(ps, conn);
  23. }
  24. return us;
  25. }

select查询

常见的JDBC错误

  1.   ClassNotFoundException:

    驱动类未找到

  2.   java.sql.SQLException: No suitable driver found for :mysql://localhost:3306/test

    URL错误
  3.   No database selected
             未找到数据库

  4.  Access denied for user 'root1'@'localhost' (using password: YES)

用户名或密码错误

  5.  java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
             sql语句错误

  6.   java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '13' for key 'PRIMARY'
           主键冲突

学习笔记—JDBC的更多相关文章

  1. Java学习笔记——JDBC读取properties属性文件

    Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件. 文件的内容是格式是"键=值"(key-valu ...

  2. Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作

    必须的准备工作 一.MySQL的安装.可以参考博文: http://blog.csdn.net/jueblog/article/details/9499245 二.下载 jdbc 驱动.可以从在官网上 ...

  3. Java学习笔记--JDBC数据库的使用

    参考  hu_shengyang的专栏 : http://blog.csdn.net/hu_shengyang/article/details/6290029 一. JDBC API中提供的常用数据库 ...

  4. JAVA学习笔记 -- JDBC及其应用

    一个.准备工作 1.开放SQL Server服务与支持TCP/IP  进一步确认TCPport watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk ...

  5. Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用

    预编译 SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 预编译的优点 1.PreparedStatement是预编译的,对于批量处理 ...

  6. JMeter学习笔记--JDBC测试计划-连接Mysql

    1.首先要下载jar包,mysql-connector-java-5.1.7-bin.jar 放到Jmeter的lib文件下ext下 2.添加JDBC Connection Configuration ...

  7. 学习笔记-JDBC连接数据库操作的步骤

    前言 这里我就以JDBC连接数据库操作查询的步骤作以演示,有不到之处敬请批评指正! 一.jdbc连接简要步骤 1.加载驱动器. 2.创建connection对象. 3.创建Statement对象. 4 ...

  8. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 用node探究http缓存

    用node搞web服务和直接用tomcat.Apache做服务器不太一样, 很多工作都需要自己做.缓存策略也要自己选择,虽然有像koa-static,express.static这些东西可以用来管理静 ...

  2. SpringBoot框架与MyBatis集成,连接Mysql数据库

    SpringBoot是一种用来简化新Spring应用初始搭建及开发过程的框架,它使用特定方式来进行配置,使得开发人员不再需要定义样板化的配置.MyBatis是一个支持普通SQL查询.存储和高级映射的持 ...

  3. Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章

    前言 事情的起因是由于一段简单的数据库连接代码引起,这段代码从语法上看,是没有任何问题:但是就是莫名其妙的报错了,这段代码极其简单,就是打开数据库连接,读取一条记录,然后立即更新到数据库中.但是,惨痛 ...

  4. windows代码,传入文件名,遍历此目录下所有文件.

    #include <windows.h> #include <vector> using namespace std; BOOL IterAtorFileSaveFile(IN ...

  5. 你用.NET开发APP时,在云平台打包APP要填个“包名”的含义

    ios 在ios平台,包名有它专有的名词:bundle ID.bundle ID可以翻译成包ID,也可以叫APP ID或者应用ID,他是每一个ios应用的全球唯一标识,只要bundle id不变,无论 ...

  6. .net mvc前台如何接收和解析后台的字典类型的数据

    很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是没有找到. 今天想记录一下这样一个小的需求的做法.先说一下我 ...

  7. 程序员如何巧用Excel提高工作效率

    作为一名程序员,我们可能很少使用Excel,但是公司的一些职能部门,比如HR,财务等,使用Excel真的是太熟练了,以至于一些系统开发出来,导入和导出功能是使用最频繁的,哈哈. 其实在程序开发的过程中 ...

  8. JQuery --- 第二期 (jQuery属性操作)

    个人学习笔记 1.JQuery的内容选择器 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  9. Ubuntu16 FTP的安装,基本配置与权限控制

    1.ftp与sftp 大致了解下: ftp是一个文件传输协议,linux环境需要它才能支持文件的传输与查看,它的默认端口是21. sftp是加密/解密的文件传输协议,因为它每次传输都有加密解密的步骤, ...

  10. 基于PT的ipv6 ripng配置

    在Cisco路由器上配置RIPng 如图规划(本人学号后三位056) 路由器配置(以R1为例) R1(配置接口地址) Router(config)#int fastEthernet 0/0 Route ...