0


不会吧不会吧,这博主居然用了1w+字来讲 JDBC 连接 MySQL,还花了好几个晚上写出来的

哈喽~大家好,这次我们来看看 JDBC 如何 连接 MySQL.

开头

  1. 首先如何下载安装 MySQL (链接),如何下载安装 SQLyog (链接),以及怎样下载 mysql-connector-java.jar(链接),可以看看这三位大佬的,这里操作数据库用的是 SQLyog 这款软件。
  1. 好了之后,我们用 idea 创建项目,记得要勾选 Web应用程序。

  1. 然后将 mysql-connector-java.jar 放入在 WEB - INF 里面的 lib 里面(如果没有就自己创建一个,记得要打包文件)

介绍

JDBC 的概念

  1. JDBC Java DataBase Connectivity (Java 数据连接)技术的简称,是一种可用于执行 SQL 语句的 Java API。它由一些 java 语言编写的类和接口组成;程序员通过使用 jdbc 可以方便地将 SQL 语句传送给几乎任何一种数据库。

JDBC 的功能

(1) 与数据库建立连接。
(2) 向数据库发送 SQL 语句并执行这些语句。
(3) 处理数据返回的结果。

JDBC 的常用接口和类

(1) Driver 接口:加载驱动程序。
(2) DriverManager 类:装人所需的 JDBC 驱动程序,编程时调用它的方法来创建连接。
(3) Connection 接口:编程时使用该类对象创建 Statement 对象。
(4) Statement 接口:编程时使用该类对象得到 ResultSet 对象。
(5) ResultSet 类:负责保存 Statement 执行后所产生的查询结果。

工作原理图

数据库的创建(MySQL)

右击 root@localhost 创建 db1 (注:基字符集一定要 uft8,别问为什么,本人因为这被折磨了半小时)输入名称 user

或者用 sql 语句创建

  1. CREATE DATABASE db1;
  2. USE db1;
  3. CREATE TABLE `user`(
  4. `id` INT,
  5. `name` VARCHAR(30)
  6. );
  7. INSERT INTO `user` VALUES (1,'张一'),(2,'张二'),(3,'张三'),(4,'张四'),(5,'张五');

连接 MySQL

1.注册驱动

  1. Class.forName("com.mysql.cj.jdbc.Driver");

2.获取连接

  1. Connection com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");

3.获取执行者连接

  1. Statement stat = com.createStatement();

4.执行 SQL 语句,并接受结果

  1. String sql = "SELECT * FROM user";
  2. ResultSet rs = stat.executeQuery(sql);

5.处理结果

  1. while (rs.next()){
  2. System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
  3. }

6.释放资源

  1. com.close();
  2. stat.close();
  3. com.close();

代码连接起来

  1. package com.text.jdbc;
  2. import java.sql.*;
  3. public class jbdc {
  4. public static void main(String[] args) throws Exception {
  5. Class.forName("com.mysql.cj.jdbc.Driver");
  6. Connection com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");
  7. // DriverManager 注册驱动
  8. // Connection 数据库连接对象 url(指定连接的路径 语法:“jdbc:mysql://ip地址:端口号/数据库名称”)
  9. Statement stat = com.createStatement();
  10. //执行 sql 语句的对象
  11. String sql = "SELECT * FROM user";
  12. ResultSet rs = stat.executeQuery(sql);
  13. // 执行 增删改查 (DML)语句用 int executeUpdate(Sting sql);
  14. // 执行 DQL 语句 ResultSet executeQuery(String sql);
  15. // 对象释放 void close();
  16. while (rs.next()){
  17. System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
  18. }
  19. com.close();
  20. stat.close();
  21. com.close();
  22. }
  23. }

这里有个小细节,在步骤一中,注册驱动那,如果忘了驱动名或者敲错了,可以在 lib -> mysql-connector-java.jar -> jdbc -> Driver 里面查看

点击运行,控制台读取数据库的数据,完成连接。

对 MySQL 进行增删改查

准备工作

  1. 首先我们创建好数据库(名为db1)数据表(名为student),并添加好数据 (这是我们的总表),如图:

  1. 在前面我们用 jdbc **打印出所有的数据表信息**,这里我们换一种方式,升级版
  2. 这里我们创建 controller包(里面有 StudentController 类)、dao包(里面有 StudentDao 接口、StudentDaoImpl 类)、daomian 包(里面有 Student 类)、service 包(里面有 StudentService 接口、StudentServiceImpl 类),如图,并写入代码:

StudentController 类:

  1. package com.inxzw.domain.controller;
  2. import com.inxzw.domain.domain.Student;
  3. import com.inxzw.domain.service.StudentService;
  4. import com.inxzw.domain.service.StudentServiceImpl;
  5. import org.testng.annotations.Test;
  6. import java.util.ArrayList;
  7. public class StudentController {
  8. private StudentService service = new StudentServiceImpl();
  9. @Test
  10. public void findAll(){
  11. ArrayList<Student> list = service.findAll();
  12. for (Student stu : list){
  13. System.out.println(stu);
  14. }
  15. }
  16. public void findById(){
  17. }
  18. }

** StudentDao 接口:**

  1. package com.inxzw.domain.dao;
  2. import com.inxzw.domain.domain.Student;
  3. import java.util.ArrayList;
  4. public interface StudentDao {
  5. // 查询所有学生信息
  6. public abstract ArrayList<Student> findAll();
  7. //获取id
  8. public abstract Student findById(Integer id);
  9. // 新增信息
  10. public abstract int insert(Student stu);
  11. // 修改信息
  12. public abstract int update(Student stu);
  13. // 删除信息
  14. public abstract int delete(Integer id);
  15. }
  1. **StudentDaoImpl类:**
  1. package com.inxzw.domain.dao;
  2. import com.inxzw.domain.domain.Student;
  3. import java.sql.*;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. public class StudentDaoImpl implements StudentDao{
  7. @Override
  8. public ArrayList<Student> findAll(){
  9. Connection com = null;
  10. Statement stat = null;
  11. ResultSet rs = null;
  12. ArrayList<Student> list = new ArrayList<>();
  13. try {
  14. Class.forName("com.mysql.cj.jdbc.Driver");
  15. com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");
  16. stat = com.createStatement();
  17. String sql = "SELECT * FROM student";
  18. rs = stat.executeQuery(sql);
  19. while (rs.next()){
  20. // System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
  21. Integer sid = rs.getInt("sid");
  22. String name = rs.getString("name");
  23. Integer age = rs.getInt("age");
  24. Date birthday = rs.getDate("birthday");
  25. Student stu = new Student(sid,name,age,birthday);
  26. list.add(stu);
  27. }
  28. }catch (Exception e){
  29. e.printStackTrace();
  30. }finally {
  31. if (com != null)
  32. {
  33. try {
  34. com.close();
  35. } catch (SQLException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. if (stat != null)
  40. {
  41. try {
  42. stat.close();
  43. } catch (SQLException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. if (rs != null)
  48. {
  49. try {
  50. rs.close();
  51. } catch (SQLException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  56. return list;
  57. }
  58. @Override
  59. public Student findById(Integer id) {
  60. return null;
  61. }
  62. @Override
  63. public int insert(Student stu) {
  64. return 0;
  65. }
  66. @Override
  67. public int update(Student stu) {
  68. return 0;
  69. }
  70. @Override
  71. public int delete(Integer id) {
  72. return 0;
  73. }
  74. }
  1. **Student 类:**
  1. package com.inxzw.domain.domain;
  2. import java.util.Date;
  3. public class Student {
  4. private Integer sid;
  5. private String name;
  6. private Integer age;
  7. private Date birthday;
  8. public Student(Integer sid, String name, Integer age, Date birthday) {
  9. this.sid = sid;
  10. this.name = name;
  11. this.age = age;
  12. this.birthday = birthday;
  13. }
  14. public Integer getSid() {
  15. return sid;
  16. }
  17. public void setSid(Integer sid) {
  18. this.sid = sid;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. public Integer getAge() {
  27. return age;
  28. }
  29. public void setAge(Integer age) {
  30. this.age = age;
  31. }
  32. public Date getBirthday() {
  33. return birthday;
  34. }
  35. public void setBirthday(Date birthday) {
  36. this.birthday = birthday;
  37. }
  38. @Override
  39. public String toString() {//打印
  40. return "Student{" +
  41. "sid=" + sid +
  42. ", name='" + name + '\'' +
  43. ", age=" + age +
  44. ", birthday=" + birthday +
  45. '}';
  46. }
  47. }
  1. **StudentService 接口:**
  1. package com.inxzw.domain.service;
  2. import com.inxzw.domain.domain.Student;
  3. import java.util.ArrayList;
  4. public interface StudentService {
  5. public abstract ArrayList<Student> findAll();
  6. public abstract Student findById(Integer id);
  7. public abstract int insert(String stu);
  8. public abstract int update(Student stu);
  9. public abstract int delete(Integer id);
  10. }
  1. **StudentServiceImpl 类:**
  1. package com.inxzw.domain.service;
  2. import com.inxzw.domain.dao.StudentDao;
  3. import com.inxzw.domain.dao.StudentDaoImpl;
  4. import com.inxzw.domain.domain.Student;
  5. import java.util.ArrayList;
  6. public class StudentServiceImpl implements StudentService{
  7. private StudentDao dao = new StudentDaoImpl();
  8. public ArrayList<Student> findAll(){
  9. return dao.findAll();
  10. }
  11. public Student findById(Integer id){
  12. return null;
  13. }
  14. @Override
  15. public int insert(String stu) {
  16. return 0;
  17. }
  18. @Override
  19. public int update(Student stu) {
  20. return 0;
  21. }
  22. @Override
  23. public int delete(Integer id) {
  24. return 0;
  25. }
  26. }
  1. StudentController 类(控制类) ,运行 findAll() ,记得要加 @Text ,点击运行。完成查询所有信息。

JDBC 实践操作

根据 id 获取信息

我们可以通过 id 来获取属性,eg:通过 id 为 5 来查询元组。代码如下:

StudentDaoImpl 类:

  1. public Student findById(Integer id) {
  2. Student stu = new Student();
  3. Connection com = null;
  4. Statement stat = null;
  5. ResultSet rs = null;
  6. ArrayList<Student> list = new ArrayList<>();
  7. try {
  8. Class.forName("com.mysql.cj.jdbc.Driver");
  9. com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");
  10. stat = com.createStatement();
  11. String sql = "SELECT * FROM student WHERE sid = '"+id+"' ";
  12. rs = stat.executeQuery(sql);
  13. while (rs.next()){
  14. // System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
  15. Integer sid = rs.getInt("sid");
  16. String name = rs.getString("name");
  17. Integer age = rs.getInt("age");
  18. Date birthday = rs.getDate("birthday");
  19. stu.setSid(sid);
  20. stu.setName(name);
  21. stu.setAge(age);
  22. stu.setBirthday(birthday);
  23. }
  24. }catch (Exception e){
  25. e.printStackTrace();
  26. }finally {
  27. if (com != null)
  28. {
  29. try {
  30. com.close();
  31. } catch (SQLException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. if (stat != null)
  36. {
  37. try {
  38. stat.close();
  39. } catch (SQLException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. if (rs != null)
  44. {
  45. try {
  46. rs.close();
  47. } catch (SQLException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. return stu;
  53. }
  1. **StudentServiceImpl 类:**
  1. public Student findById(Integer id){
  2. return dao.findById(id);
  3. }
  1. **StudentController 类:**
  1. public void findById(){
  2. Student stu = service.findById(4);//查询3号记录
  3. System.out.println(stu);
  4. }
  1. 点击运行,完成查询。

添加信息

StudentDaoImpl 类:

  1. @Override
  2. public int insert(Student stu) {
  3. Connection com = null;
  4. Statement stat = null;
  5. int result = 0;
  6. try {
  7. Class.forName("com.mysql.cj.jdbc.Driver");
  8. com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");
  9. stat = com.createStatement();
  10. Date d = stu.getBirthday();
  11. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  12. String birthday = sdf.format(d);
  13. String sql = "INSERT INTO student VALUES ('"+stu.getSid()+"','"+stu.getName()+"','"+stu.getAge()+"','"+birthday+"')";
  14. result = stat.executeUpdate(sql);
  15. }catch (Exception e){
  16. e.printStackTrace();
  17. }finally {
  18. if (com != null)
  19. {
  20. try {
  21. com.close();
  22. } catch (SQLException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. if (stat != null)
  27. {
  28. try {
  29. stat.close();
  30. } catch (SQLException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. return result;
  36. }

StudentServiceImpl 类:

  1. public int insert(Student stu) {
  2. return dao.insert(stu);
  3. }
  1. **StudentController 类:**
  1. public void insert(){
  2. Student stu = new Student(9, "张九", 29, new Date());
  3. int result = service.insert(stu);
  4. if (result != 0){
  5. System.out.println("添加成功");
  6. }else {
  7. System.out.println("添加失败");
  8. }
  9. }
  1. 点击运行,显示出添加成功,我们用 findAll() 来查看表信息,完成添加。

修改信息

StudentDaoImpl 类:

  1. public int update(Student stu) {
  2. Connection com = null;
  3. Statement stat = null;
  4. int result = 0;
  5. try {
  6. Class.forName("com.mysql.cj.jdbc.Driver");
  7. com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");
  8. stat = com.createStatement();
  9. Date d = stu.getBirthday();
  10. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  11. String birthday = sdf.format(d);
  12. String sql = "UPDATE student SET sid = '"+stu.getSid()+"', name = '"+stu.getName()+"', age = '"+stu.getAge()+"',birthday = '"+birthday+"' WHERE sid = '"+stu.getSid()+"'";
  13. result = stat.executeUpdate(sql);
  14. }catch (Exception e){
  15. e.printStackTrace();
  16. }finally {
  17. if (com != null)
  18. {
  19. try {
  20. com.close();
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. if (stat != null)
  26. {
  27. try {
  28. stat.close();
  29. } catch (SQLException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. return result;
  35. }

StudentServiceImpl 类:

  1. public int update(Student stu) {
  2. return dao.update(stu);
  3. }

StudentController 类:

  1. @Test
  2. public void update(){
  3. Student stu = service.findById(5);
  4. stu.setName("张五点五");
  5. int result = service.update(stu);
  6. if (result != 0){
  7. System.out.println("修改成功");
  8. }else {
  9. System.out.println("修改失败");
  10. }
  11. }
  1. 点击运行,显示出修改成功,我们用 findAll() 来查看表信息,完成修改。

删除信息

StudentDaoImpl 类:

  1. public int delete(Integer id) {
  2. Connection com = null;
  3. Statement stat = null;
  4. int result = 0;
  5. try {
  6. Class.forName("com.mysql.cj.jdbc.Driver");
  7. com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");
  8. stat = com.createStatement();
  9. String sql = "DELETE FROM student WHERE sid = '"+id+"'";
  10. result = stat.executeUpdate(sql);
  11. }catch (Exception e){
  12. e.printStackTrace();
  13. }finally {
  14. if (com != null)
  15. {
  16. try {
  17. com.close();
  18. } catch (SQLException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. if (stat != null)
  23. {
  24. try {
  25. stat.close();
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
  31. return result;
  32. }

StudentServiceImpl 类:

  1. public int delete(Integer id) {
  2. return dao.delete(id);
  3. }

StudentController 类:

  1. @Test
  2. public void delete(){
  3. int result = service.delete(5);
  4. if (result != 0){
  5. System.out.println("删除成功");
  6. }else {
  7. System.out.println("删除失败");
  8. }
  9. }
  1. 点击运行,显示出删除成功,我们用 findAll() 来查看表信息,完成删除(我们删除了张五点五那一行信息)。

代码优化

  1. 在这里我们完成了对数据表进行了增删改查操作,最后来看 StudentDaoImpl 类中发现我们已经写了 300 多行代码,而且我们还写了,非常多的重复代码,效率非常的底,所以为了减少代码量,这里我们需要优化。

  1. 我们创建一个新的包名叫 utils ,新建类 JDBCutils,然后创建配置文件 config.properties

  1. JDBCutils 类里面:“构造私有方法、声明所需要的配置变量、注册驱动、获取数据库连接方法、释放资源方法” ,代码如下:
  1. private JDBCutils(){}
  2. // 声明所需要的配置变量
  3. private static String driverClass;
  4. private static String url;
  5. private static String username;
  6. private static String password;
  7. private static Connection con;
  8. //提供静态代码块,读取配置文件信息为变量赋值,注册驱动
  9. static {
  10. try {
  11. InputStream is = JDBCutils.class.getClassLoader().getResourceAsStream("config.properties");
  12. Properties prop = new Properties();
  13. prop.load(is);
  14. driverClass = prop.getProperty("driverClass");
  15. url = prop.getProperty("url");
  16. username = prop.getProperty("username");
  17. password = prop.getProperty("password");
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. // 获取数据库连接方法
  23. public static Connection getConecction(){
  24. try {
  25. con = DriverManager.getConnection(url,username,password);
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }
  29. return con;
  30. }
  31. //释放资源方法
  32. public static void close(Connection con, Statement stat, ResultSet rs){
  33. if (con != null){
  34. try {
  35. con.close();
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. if (stat != null){
  41. try {
  42. stat.close();
  43. } catch (SQLException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. public static void close(Connection con, Statement stat){
  49. if (con != null){
  50. try {
  51. con.close();
  52. } catch (SQLException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. }

** config.properties :**

  1. driverClass = com.mysql.cj.jdbc.Driver
  2. url = jdbc:mysql://10.16.158.90:3306/db1
  3. username = root
  4. password = 123456

我们已经创建好了准备工作,下面来看看 findAll() 是如何优化的

首先,这两步是可以替换掉的

之前:

  1. Class.forName("com.mysql.cj.jdbc.Driver");
  2. com = DriverManager.getConnection("jdbc:mysql://10.16.158.90:3306/db1", "root", "123456");

** 之后:**

  1. com = JDBCutils.getConecction();

之前:

  1. if (com != null)
  2. {
  3. try {
  4. com.close();
  5. } catch (SQLException e) {
  6. e.printStackTrace();
  7. }
  8. }
  9. if (stat != null)
  10. {
  11. try {
  12. stat.close();
  13. } catch (SQLException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. if (rs != null)
  18. {
  19. try {
  20. rs.close();
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }
  24. }

** 之后:**

  1. JDBCutils.close(com, stat, rs);

现在看是不是感觉很爽?是不是省去了很多代码?点击运行,看看是否能跑起来。

ok,运行没问题,优化成功。

然后,findById()、insert()、update()、delete() 方法操作都一样,这里就不一一显示了。

小结:大家在 **StudentDaoImpl **类中有一个小细节,在 DriverManager.getConnection 中设置(“jdbc:mysql://ip地址:端口号/数据库名称”)ip 地址这里,在换地方写代码时,一定要记得改,我debug 了一小时才发现,我一直在想为什么上午下午在图书馆里面有用,晚上在寝室就没用了?血淋淋的痛啊~ 亲们,一定要记得改!

(求关注)持续更新中……


本文转载自: https://blog.csdn.net/aasd23/article/details/124218870
版权归原作者 一个名叫追的程序猿 所有, 如有侵权,请联系我们删除。

“不会吧不会吧,这博主居然用了1w+字来讲 JDBC 连接 MySQL,还花了好几个晚上写出来的”的评论:

还没有评论