如何通过java操作数据库

  • Java DataBase Connectivity
    • 在Java中用来规范如何访问关系型数据库,由各大数据库厂商去实现它
    • 属于JavaSE的一部分

image.png

下载MySQL的JDBC实现 (jar, 驱动包)

image.png

JDBC使用步骤

① 将Driver(驱动程序)注册到DriverManger(驱动程序管理者)
② 利用DriverManager创建Connection(数据库连接)
③ 利用Connection创建Statement(语句)
④ 利用Statement执行SQL语句
⑤ 关闭资源(关闭Statement、Connection等)
image.png
image.png

JDBC细节

  • MySQL的url格式是
    • jdbc : mysql : // IP地址:端口号/数据库名
    • 比如 jdbc : mysql://localhost:3306/xmg

image.png

JDBC版本

  • 从JDBC4.0开始,显式注册驱动程序是可选的
  • 我们只需要将供应商的Jar放在类路径中,然后DriverManager就可以自动检测并加载驱动程序
  • JDBC版本

    • JDBC4.0包含在Java SE 6中
    • JDBC4.1包含在Java SE 7中
    • JDBC4.2包含在Java SE 8中
    • JDBC4.3包含在Java SE 9中

      Statement的常用API

  • ResultSet executeQuery(String sql)

    • 执行DQL语句
  • int executeUpdate(String sql)

    • 执行DML、DDL语句
    • 如果是DML语句,返回值代表影响的记录数量;如果数据库没有任何返回值,通常返回0

      ResultSet的常用API

  • boolean next ( )

    • 让游标指向下一行,如果指向的这行有数据,就返回true,否则,返回false
  • XX getXX( int columnIndex)、 XX getXX( String columnLabel)

    • 获取当前行(游标指向的那行)某一列的数据
    • columnIndex的数据从1开始

      PreparedStatement

  • PreparedStatement接口继承自Statement接口

  • 建议使用PreparedStatement替代Statement
  • PreparedStatement的优点
    • 可以防止SQL注入
    • 执行速度比Statement快
    • 支持批量处理

数据库连接池

  • 数据库连接池,可以提高访问数据库的性能,负责创建、分配、管理和释放数据库连接
  • 基本思想
    • 在初始化时,创建一定数量的数据库连接对象存储在内存中
    • 当需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已创建的空闲连接对象
    • 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用
    • 当连接的空闲时间已经超过最大空闲时间时,将会释放掉该连接
    • 可以通过设置参数来控制初始连接数、连接的上下限以及每个连接的最大使用次数、最大空闲时间
    • 可以通过自身的管理机制来监视数据库连接的数量、使用情况
  • Java中常见的开源的数据库连接池

    • C3P0、Proxool、DBCP、BoneCP、Druid等

      Druid

  • 产自阿里巴巴,项目地址: https://github.com/alibaba/druid/

  • jar包下载: https://mvnrepository.com/artifact/com.alibaba/druid ```java import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.Properties;

public class Dbs { private static DataSource ds; static { try (InputStream is = Dbs.class.getClassLoader().getResourceAsStream(“druid.properties”)) { Properties properties = new Properties(); properties.load(is); ds = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } }

  1. /**
  2. * 执行DDL、DML语句
  3. */
  4. public static int update(String sql, Object ...args) {
  5. try {
  6. Connection conn = ds.getConnection();
  7. // 从数据库获取所有的客户数据
  8. try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
  9. // 设置参数
  10. for (int i = 0; i < args.length; i++) {
  11. pstmt.setObject(i + 1, args[i]);
  12. }
  13. // 执行
  14. return pstmt.executeUpdate();
  15. }
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. return 0;
  19. }
  20. }
  21. public static <T> List<T> query(String sql, RowMapper<T> mapper, Object ...args) {
  22. if (mapper == null) return null;
  23. try {
  24. Connection conn = ds.getConnection();
  25. // 从数据库获取所有的客户数据
  26. try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
  27. // 设置参数
  28. for (int i = 0; i < args.length; i++) {
  29. pstmt.setObject(i + 1, args[i]);
  30. }
  31. // 执行
  32. List<T> array = new ArrayList<>();
  33. try (ResultSet rs = pstmt.executeQuery()) {
  34. for (int row = 0; rs.next(); row++) {
  35. array.add(mapper.map(rs, row));
  36. }
  37. }
  38. return array;
  39. }
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. return null;
  43. }
  44. }
  45. /**
  46. * 用来执行每一行数据的映射(rs -> bean)
  47. * @param <T>
  48. */
  49. public interface RowMapper<T> {
  50. T map(ResultSet rs, int row) throws Exception;
  51. }

}

  1. - druid.properties
  2. ```java
  3. driverClassName=com.mysql.jdbc.Driver
  4. url=jdbc:mysql://localhost:3306/项目名
  5. username=root
  6. password=root
  7. initialSize=5
  8. maxActive=10
  9. maxWait=5000

Spring JDBC

  • Spring JDBC框架可以帮助开发者节省大量开发工作,自动去处理一些低级细节,比如:
    • 异常处理、打开和关闭资源(Connection、Statement、ResultSet)
  • 需要的jar包

    • spring-jdbc
    • spring-beans
    • spring-core
    • spring-tx
    • spring-jcl

      核心类:JdbcTemplate

  • 构造方法

    • public JdbcTemplate ( DataSource dataSource)
  • 执行DDL、DML语句
    • int update(String sql, Object… args)
  • 执行DQL语句
    • List query(String sql, RowMapper rowMapper, Object… args)
    • T queryForObject(String sql, RowMapper rowMapper, Object… args) ```java import com.alibaba.druid.pool.DruidDataSourceFactory; import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource; import java.io.InputStream; import java.util.Properties;

public class Dbs { private static JdbcTemplate tpl; static { try (InputStream is = Dbs.class.getClassLoader().getResourceAsStream(“druid.properties”)) { Properties properties = new Properties(); properties.load(is); DataSource ds = DruidDataSourceFactory.createDataSource(properties); tpl = new JdbcTemplate(ds); } catch (Exception e) { e.printStackTrace(); } }

  1. public static JdbcTemplate getTpl() {
  2. return tpl;
  3. }

}

  1. - druid.properties
  2. ```java
  3. driverClassName=com.mysql.jdbc.Driver
  4. url=jdbc:mysql://localhost:3306/项目名
  5. username=root
  6. password=root
  7. initialSize=5
  8. maxActive=10
  9. maxWait=5000