1、JDBC概述

a、Java DataBase Connectivity Java 数据库连接技术
b、顾名思义:就是用过java语言操作数据库,操作表中的数据
c、是官方定义的一套操作所有关系型数据库的规则(接口)
1、在java中想要访问数据库只能通过JDBC
2、JDBC是java访问数据的基础,其他数据访问技术都是对JDBC的封装(hb,mb)
3、JDBC是为了访问不同的数据库,提供了一种同一的访问方式
4、JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,接口的实现由各大厂商来实现
实现步骤:

  1. 1. 导入驱动jar mysql-connector-java-5.1.37-bin.jar
  2. 1.复制mysql-connector-java-5.1.37-bin.jar到项目的lib目录下
  3. 2.右键-->Add As Library
  4. 2. 注册驱动(安装驱动)
  5. 3. 获取数据库连接对象 Connection
  6. 4. 定义sql
  7. 5. 获取执行sql语句的对象 Statement
  8. 6. 执行sql,接受返回结果
  9. 7. 处理结果
  10. 8. 释放资源

2、JDBC api介绍

DriverManager:

注册驱动:

  1. 使用registerDriver注册驱动
  2. static void registerDriver(Driver driver);
  3. registerDriver(new Driver());
  4. 使用反射注册驱动
  5. Class.forName("com.mysql.jdbc.Driver");

获取数据库连接:

  1. static Connection getConnection(String url,String user,String password)
  2. url:
  3. 指定连接的路径
  4. jdbc:mysql://localhost:3306/数据库名称
  5. 若是连接本地则可简写:jdbc:mysql:///数据库名
  6. user
  7. 用户名
  8. password
  9. 密码

Connection:

获取sql语句执行对象和事务管理对象
1、点一个Statement对象,用于将SQL语句发送到数据库
2、点一个PreparedStatement,用于将参数化的SQL语句发送到数据库
事务管理:
1、点一个setAutoCommit(false)设置成手动提交
2、点一个commit()提交事务
3、点一个rollback()回滚事务

Statement:

用于执行静态SQL语句并返回其生成的结果的对象
1、点一个execute(sql),可执行任意的sql语句
2、点一个executeUpdate(sql),执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句
3、点一个executeQuery(sql),执行DQL(select)语句

ResultSet:

表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
1、点一个next(),将光标向前移一位,返回值为true代表有数据,false代表没数据
2、点一个getXxx(i),若i是整数则代表获取该列的值,若是字符串,则获取该字符串命名的列的值
3、点一个getObject(列名),根据列名获取所有列的类型的值

3、CRUD操作

编写步骤:

  1. 1、注册驱动
  2. 2、建立连接
  3. 3、编写sql
  4. 4、获取sql执行对象
  5. 5、执行sql对象并返回结果
  6. 6、处理结果
  7. 7、释放资源

添加数据:

  1. public class JDBCInsert {
  2. public static void main(String[] args) throws Exception {
  3. // 1.注册驱动
  4. Class.forName("com.mysql.jdbc.Driver");
  5. // 2.建立连接
  6. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
  7. // 3.编写sql(在java编写sql 结尾;可以省略)
  8. String sql = "insert into account values(4,'lucy',1000)";
  9. // 4.获取sql执行对象
  10. Statement statement = connection.createStatement();
  11. // 5.执行sql并返回结果
  12. int i = statement.executeUpdate(sql);
  13. // 6.处理结果
  14. System.out.println(i);
  15. // 7.释放资源
  16. statement.close();
  17. connection.close();
  18. }
  19. }

修改数据:

  1. public class JDBCUpdate {
  2. public static void main(String[] args) throws Exception {
  3. // 1.注册驱动
  4. Class.forName("com.mysql.jdbc.Driver");
  5. // 2.建立连接
  6. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
  7. // 3.编写sql
  8. String sql = "update account set name = '松岛枫' where id = 4";
  9. // 4.获取sql执行对象
  10. Statement statement = connection.createStatement();
  11. // 5.执行sql并返回结果
  12. int i = statement.executeUpdate(sql);
  13. // 6.处理结果
  14. if (i>0) {
  15. System.out.println("修改成功");
  16. }else{
  17. System.out.println("修改失败");
  18. }
  19. // 7.释放资源
  20. statement.close();
  21. connection.close();
  22. }
  23. }

删除数据:

  1. public class JDBCDelete {
  2. public static void main(String[] args) throws Exception {
  3. // 1.注册驱动
  4. Class.forName("com.mysql.jdbc.Driver");
  5. // 2.建立连接
  6. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
  7. // 3.编写sql
  8. String sql = "delete from account where id = 4";
  9. // 4.获取sql执行对象
  10. Statement statement = connection.createStatement();
  11. // 5.执行sql并返回结果
  12. int i = statement.executeUpdate(sql);
  13. // 6.处理结果
  14. if (i>0) {
  15. System.out.println("修改成功");
  16. }else{
  17. System.out.println("修改失败");
  18. }
  19. // 7.释放资源
  20. statement.close();
  21. connection.close();
  22. }
  23. }

查询数据:

  1. package com.smiledog.domain;
  2. public class Account {
  3. private int id;
  4. private String name;
  5. private Double money;
  6. // 有参无参构造....
  7. // get和set方法....
  8. // toString()...
  9. }
  10. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  11. public class JDBCQuery{
  12. public static void main(String[] args) throwes Exception{
  13. ArrayList<Account> list = new ArrayList<>();
  14. // 1.注册驱动
  15. Class.forName("com.mysql.jdbc.Driver");
  16. // 2.建立连接
  17. Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day23", "root", "root");
  18. // 3.编写sql
  19. String sql = "select * from account";
  20. // 4.获取sql执行对象
  21. Statement statement = connection.createStatement();
  22. // 5.执行sql并返回结果
  23. ResultSet resultSet = statement.executeQuery(sql);
  24. // 6.处理结果
  25. Account account = null;
  26. while (resultSet.next()) {
  27. // 获取数据
  28. int id = resultSet.getInt("id");
  29. String name = resultSet.getString("name");
  30. double money = resultSet.getDouble("money");
  31. account = new Account();
  32. account.setId(id);
  33. account.setName(name);
  34. account.setMoney(money);
  35. list.add(account);
  36. }
  37. // 7.释放资源
  38. resultSet.close();
  39. statement.close();
  40. connection.close();
  41. // 遍历集合代码省略............
  42. }
  43. }

4、JDBC工具类编写

工具类呢,就是把一些重复的代码提取出来,能提取多少提取多少,整合到一个类里边,合理的编排,定义方法供外界调用。
不改变的代码可以提取,一致变得代码也可以提取,把一些一直改变的数据整合到一个集合里,改动代码只需要改动集合里的代码就行了,比如(properties集合)
JDBC工具类:

  1. package com.smiledog.jdbc.demo.Util;
  2. /*
  3. @ClassName Util
  4. @Author SmILeDog
  5. @Date 2021/5/20
  6. @Time 14:44
  7. */
  8. import java.io.InputStream;
  9. import java.sql.*;
  10. import java.util.Properties;
  11. public class JDBCUtil {
  12. private JDBCUtil() {
  13. }
  14. private static Connection conn; //数据库连接对象
  15. private static Statement stat = null; //sql执行对象
  16. private static String driver = null; //驱动对象
  17. private static String url = null; //数据库连接信息
  18. private static String user = null; //数据库用户名
  19. private static String password = null; //数据库用户名密码
  20. private static String sql = null; //待执行的增删改的sql语句
  21. private static String querysql = null; //待执行的查询sql语句
  22. static{
  23. try {
  24. //读取配置文件
  25. Properties pro = new Properties();
  26. //方法一:直接读取配置文件
  27. // pro.load(new FileReader("day01_jdbc\\src\\jdbc.properties"));
  28. // 方法一:使用类加载器,进行读取配置文件
  29. InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
  30. //方法三:java提供的专门获取jdbc配置文件的类
  31. //ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
  32. pro.load(is); //读取配置文件
  33. driver = pro.getProperty("driverName"); //读取驱动
  34. url = pro.getProperty("url"); //读取url
  35. user = pro.getProperty("user"); //读取同户名
  36. password = pro.getProperty("password"); //读取密码
  37. sql = pro.getProperty("sql"); //读取增删改的sql语句
  38. querysql = pro.getProperty("querysql"); //读取查询的sql语句
  39. Class.forName(driver); //注册驱动
  40. conn = DriverManager.getConnection(url, user, password); //获取数据库连接对象
  41. //想想,没必要再搞这个了,上边获取到conn了,直接可以在那边获取就
  42. //stat = conn.createStatement(); //获取sql语句执行对象
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. public static Connection getConnection(){
  48. return conn;
  49. }
  50. //获取sql执行对象
  51. //public static Statement getStatement(){
  52. // return stat;
  53. //}
  54. //获取增删改sql执行语句
  55. public static String getSql(){
  56. return sql;
  57. }
  58. //获取查询的sql执行语句
  59. public static String getQuerySql(){
  60. return querysql;
  61. }
  62. //获取释放资源
  63. public static void getClose(Connection conn, Statement stat, ResultSet res){
  64. if(stat != null){
  65. try {
  66. stat.close();
  67. } catch (SQLException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. if(conn != null){
  72. try {
  73. conn.close();
  74. } catch (SQLException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. if(res != null){
  79. try {
  80. res.close();
  81. } catch (SQLException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. }
  87. ~~~~~~~~~~~~~~jdbc.properties~~~~~~~~~~~~~~~~~
  88. driverName=com.mysql.jdbc.Driver
  89. url=jdbc:mysql://localhost:3306/库名?characterEncoding=utf-8
  90. user=root
  91. password=1234
  92. sql=s增删改sql语句;
  93. querysql=查询语句;

5、事务操作

一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
使用Connection对象来管理事务
1、开启事务
点一个setAutoCommit()事务,设置为false,即开始事务
注意:在执行sql之前开启事务
2、提交事务
点一个commit(),提交事务
注意:当所有的sql语句都执行完提交事务
3、回滚事务
点一个rollback(),回滚事务
注意:在catch中回滚事务
JDBC事务演示:

  1. public class JDBCTX{
  2. public static void mian(String[] args){
  3. Connection connection = null;
  4. Statement statement = null;
  5. try {
  6. // 1.获取连接【JdbcUtils工具类】
  7. connection = JdbcUitls.getConnection();
  8. // 2.开启事务
  9. connection.setAutoCommit(false);
  10. tatement = connection.createStatement();
  11. // 3.罗志祥扣钱
  12. // 机器故障
  13. // 4.蝴蝶姐加钱
  14. // 5.提交事务
  15. connection.commit();
  16. } catch (Exception e) {
  17. try {
  18. // 6.回滚事务
  19. connection.rollback();
  20. } catch (SQLException e1) {
  21. e1.printStackTrace();
  22. }
  23. } finally {
  24. // 7.释放资源
  25. JdbcUitls.close(statement, connection);
  26. }
  27. }
  28. }

6、用户登录案例

案例需求:
1、通过键盘录入用户名和密码
2、判断用户是否登录成功
数据准备:

  1. CREATE TABLE USER(
  2. id INT PRIMARY KEY AUTO_INCREMENT, -- 主键ID
  3. username VARCHAR(32), -- 用户名
  4. PASSWORD VARCHAR(32) -- 密码
  5. );
  6. -- 添加数据
  7. INSERT INTO USER VALUES(NULL,'zhangsan','123');
  8. INSERT INTO USER VALUES(NULL,'lisi','234');

代码实现:

  1. package com.smiledog.jdbc.test;
  2. /*
  3. @ClassName LoginTest
  4. @Author SmILeDog
  5. @Date 2021/5/20
  6. @Time 19:21
  7. */
  8. import com.smiledog.jdbc.test.Util.JDBCUtil;
  9. import java.sql.Connection;
  10. import java.sql.ResultSet;
  11. import java.sql.SQLException;
  12. import java.sql.Statement;
  13. import java.util.Scanner;
  14. public class LoginTest {
  15. public static void main(String[] args) throws SQLException {
  16. boolean b = false;
  17. Scanner sc = new Scanner(System.in);
  18. System.out.println("请输入用户名:");
  19. String uname = sc.nextLine();
  20. System.out.println("请输入密码:");
  21. String pwd = sc.nextLine();
  22. Connection conn = JDBCUtil.getConnection();
  23. Statement stat = conn.createStatement();
  24. ResultSet res = stat.executeQuery(JDBCUtil.getQuerySql());
  25. while (res.next()) {
  26. String username = res.getString("username");
  27. String password = res.getString("password");
  28. if (username.equals(uname) && password.equals(pwd)){
  29. b = true;
  30. }
  31. }
  32. if (b){
  33. System.out.println("登录成功!");
  34. }else{
  35. System.out.println("用户名或密码错误!");
  36. }
  37. JDBCUtil.getClose(conn,stat,res);
  38. }
  39. }