当前位置:   article > 正文

Java | 详解 Java连接MySQL、编写JdbcUtils工具类、使用数据库连接池、使用JavaTemplate_java连接mysql工具类

java连接mysql工具类

一、连接mysql数据库

        1、启动 MySQL

                以管理员身份打开 cmd 命令行,输入 net start mysql

        2、MySQL 创建表

                创建一张 user 表,有id、name、password三个字段。

        3、导入jar包

                (1) 创建新项目,在项目下创建lib包,用于存放所需要的jar包

                 (2) 拷贝 mysql 驱动包 mysql-connector-j-8.0.31.jar 到 lib 目录下。

                        右键jar包,点击 添加为库。

         添加后 jar 包旁出现一个小三角,可以点开查看里面的内容,此时导入成功。

mysql 驱动 jar 包下载:

        官网:https://dev.mysql.com/downloads/

        CSDN:mysql-connector-j-8.0.31-Java文档类资源-CSDN文库

        4、创建类 Demo01.java

        5、注册驱动

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

        6、获取数据库连接对象

  • 方法1:
  1. private static final String URL = "jdbc:mysql://localhost:3306/db1";
  2. private static final String USER = "root";
  3. private static final String PASSWORD = "root";
  4. ... ...
  5. Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
  • 方法2:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?user=root&password=root");
  • 方法3:
  1. Properties p = new Properties();
  2. p.setProperty("user","root");
  3. p.setProperty("password","root")
  4. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", p);

【注意】需要填写3个参数,分别是数据库连接URL、用户名、密码,需要填写你自己的。

                 其中URL的构成:

  1. jdbc:mysql:// localhost:3306 / db1
  2. 协议 IP地址 端口 要连接的数据库名称

        7、获取执行SQL语句的对象

Statement stat = conn.createStatement();

        8、执行SQL语句

        增删改:executeUpdate

  1. stat.executeUpdate("insert into user value(1,'admin','root')");
  2. stat.executeUpdate("update user set name = 'sunny' where id = 1");
  3. stat.executeUpdate("delete from user where id = 1");

        查:executeQuery

  1. ResultSet rs = stat.executeQuery("select * from user");
  2. while (rs.next()){
  3. int id = rs.getInt("id");
  4. String name = rs.getString("name");
  5. String password = rs.getString("password");
  6. System.out.println("id="+id+",name="+name+",password="+password);
  7. }

         方法解析:

  • rs.next —— 判断结果集是否有下一条记录,返回boolean类型。
  • rs.getInt  —— 可以传入String或者int类型的参数,String类型的参数为数据表的对应列名,int类型的参数则为数据表的对应列数,推荐传入String类型。返回int类型的数据。
  • rs. getString  —— 可以传入String或者int类型的参数,String类型的参数为数据表的对应列名,int类型的参数则为数据表的对应列数,推荐传入String类型。返回String类型的数据。

      9、释放连接

  1. rs.close();
  2. stat.close();
  3. conn.close();

        完整代码:

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. public class Demo01 {
  6. private static final String URL = "jdbc:mysql://localhost:3306/db1";
  7. private static final String USER = "root";
  8. private static final String PASSWORD = "root";
  9. public static void main(String[] args) throws Exception {
  10. // 注册驱动
  11. Class.forName("com.mysql.cj.jdbc.Driver");
  12. // 获取数据库连接对象
  13. // 方法1
  14. Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
  15. // 方法2
  16. /*Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?user=root&password=root");*/
  17. // 方法3
  18. /*
  19. Properties p = new Properties();
  20. p.setProperty("user","root");
  21. p.setProperty("password","root")
  22. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", p);
  23. */
  24. // 获取执行SQL语句的对象
  25. Statement stat = conn.createStatement();
  26. // 执行SQL语句
  27. stat.executeUpdate("insert into user value(1,'admin','root')");
  28. stat.executeUpdate("update user set name = 'sunny' where id = 1");
  29. stat.executeUpdate("delete from user where id = 1");
  30. ResultSet rs = stat.executeQuery("select * from user");
  31. while (rs.next()) {
  32. int id = rs.getInt("id");
  33. String name = rs.getString("name");
  34. String password = rs.getString("password");
  35. System.out.println("id=" + id + ",name=" + name + ",password=" + password);
  36. }
  37. // 释放连接
  38. rs.close();
  39. stat.close();
  40. conn.close();
  41. }
  42. }

二、编写使用工具类

        观察上面的代码我们可以发现,除了执行SQL的语句有所不同外,其他代码的格式基本上都是固定的。我们可以编写一个工具类,提供 获取数据库连接对象、关闭数据库相关资源 等相关方法。

        1、编写工具类 JdbcUtils.java

        创建 Utils 文件夹,将代码相关的工具类都放到里面。编写JdbcUtils.java,代码首先运行静态代码块类的语句,获得数据库连接对象。

  1. import java.sql.*;
  2. public class JdbcUtils {
  3. private static final String driver = "com.mysql.cj.jdbc.Driver";
  4. private static final String url = "jdbc:mysql://localhost:3306/db1";
  5. private static final String name = "root";
  6. private static final String password = "root";
  7. private static final Connection conn;
  8. static {
  9. try {
  10. Class.forName(driver);
  11. conn = DriverManager.getConnection(url, name, password);
  12. } catch (ClassNotFoundException | SQLException e) {
  13. throw new RuntimeException(e);
  14. }
  15. }
  16. /**
  17. * 获取数据库连接对象
  18. * @return 数据库连接对象
  19. */
  20. public static Connection getConnect() {
  21. return conn;
  22. }
  23. /**
  24. * 关闭数据库相关资源
  25. * @param conn 数据库连接对象
  26. * @param ps sql语句执行对象
  27. * @param rs 查询结果集
  28. */
  29. public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
  30. try {
  31. if (conn != null) conn.close();
  32. if (ps != null) ps.close();
  33. if (rs != null) rs.close();
  34. } catch (SQLException e) {
  35. throw new RuntimeException(e);
  36. }
  37. }
  38. /**
  39. * 关闭数据库相关资源
  40. * @param conn 数据库连接对象
  41. * @param ps sql语句执行对象
  42. */
  43. public static void close(Connection conn, PreparedStatement ps) {
  44. close(conn, ps, null);
  45. }
  46. /**
  47. * 关闭数据库相关资源
  48. * @param conn 数据库连接对象
  49. * @param rs 查询结果集
  50. */
  51. public static void close(Connection conn, ResultSet rs) {
  52. close(conn, null, rs);
  53. }
  54. }

        2、解耦代码

        分析工具类,可以发现关于数据库连接的相关参数,如 driver、url、user、password 等均写在代码中,程序的耦合性较高。可以将变量写在 .properties文件中,程序通过读取文件的方式获得相关信息。

        首先创建 jdbc.properties 资源包,以 “ 键=值 ” 的形式写入相关参数。

          jdbc.properties

  1. driver=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/db1
  3. name=root
  4. password=root

        JdbcUtils.java

  1. import java.io.IOException;
  2. import java.sql.*;
  3. import java.util.Properties;
  4. public class JdbcUtils {
  5. private static final String driver;
  6. private static final String url;
  7. private static final String name;
  8. private static final String password;
  9. static {
  10. try {
  11. Properties p = new Properties();
  12. p.load(JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
  13. driver = p.getProperty("driver");
  14. url = p.getProperty("url");
  15. name = p.getProperty("name");
  16. password = p.getProperty("password");
  17. Class.forName(driver);
  18. } catch (ClassNotFoundException | IOException e) {
  19. throw new RuntimeException(e);
  20. }
  21. }
  22. /**
  23. * 获取数据库连接对象
  24. * @return 数据库连接对象
  25. * @throws Exception 获取失败
  26. */
  27. public static Connection getConnect() throws Exception {
  28. return DriverManager.getConnection(url, name, password);
  29. }
  30. /**
  31. * 关闭数据库相关资源
  32. * @param conn 数据库连接对象
  33. * @param ps sql语句执行对象
  34. * @param rs 查询结果集
  35. */
  36. public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
  37. try {
  38. if (conn != null) conn.close();
  39. if (ps != null) ps.close();
  40. if (rs != null) rs.close();
  41. } catch (SQLException e) {
  42. throw new RuntimeException(e);
  43. }
  44. }
  45. /**
  46. * 关闭数据库相关资源
  47. * @param conn 数据库连接对象
  48. * @param ps sql语句执行对象
  49. */
  50. public static void close(Connection conn, PreparedStatement ps) {
  51. close(conn, ps, null);
  52. }
  53. /**
  54. * 关闭数据库相关资源
  55. * @param conn 数据库连接对象
  56. * @param rs 查询结果集
  57. */
  58. public static void close(Connection conn, ResultSet rs) {
  59. close(conn, null, rs);
  60. }
  61. }

       3、使用工具类

  1. import Utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. public class JdbcUtilsDemo {
  6. public static void main(String[] args) throws Exception {
  7. query();
  8. }
  9. public static void query() throws Exception {
  10. Connection conn = JdbcUtils.getConnect();
  11. Statement stat = conn.createStatement();
  12. ResultSet rs = stat.executeQuery("select * from user");
  13. while (rs.next()) {
  14. int id = rs.getInt("id");
  15. String name = rs.getString("name");
  16. String password = rs.getString("password");
  17. System.out.println("id=" + id + ",name=" + name + ",password=" + password);
  18. }
  19. JdbcUtils.close(conn, rs);
  20. }
  21. }

三、使用数据库连接池

        数据库连接池是存储数据库连接对象的容器,你可以想象成一个已经提前 装好数个连接对象的池子。当你需要 连接对象 时,可以直接从池子获取,用完归还即可。这样当程序在运行的时候,不用自己去创建数据库连接对象,从而提高了运行效率。常用的JDBC连接池有C3P0、Druid。

        1、简单的数据库连接池

        编写一个简陋的 数据库连接池,用于理解原理。

  1. import Utils.JdbcUtils;
  2. import java.sql.Connection;
  3. import java.util.LinkedList;
  4. public class SimpleConnectPool {
  5. private static LinkedList<Connection> pool = new LinkedList<>();
  6. static {
  7. try {
  8. for (int i = 1; i <= 5; i++) {
  9. // 获取数据库连接对象
  10. Connection conn = JdbcUtils.getConnect();
  11. // 将连接对象放到 pool 中
  12. pool.add(conn);
  13. }
  14. } catch (Exception e) {
  15. System.out.println("数据库连接池初始化失败!");
  16. }
  17. }
  18. // 提供 获取数据库连接对象 的方法(pool删除)
  19. public static synchronized Connection getConnect(){
  20. if(pool.size() > 0){
  21. return pool.removeFirst();
  22. }
  23. throw new RuntimeException("数据库连接池中 对象已用完");
  24. }
  25. // 提供 归还数据库连接对象 的方法(pool添加)
  26. public static void close(Connection conn){
  27. pool.addLast(conn);
  28. }
  29. }

        使用该连接池

  1. import java.sql.Connection;
  2. public class SimpleConnectPoolDemo {
  3. public static void main(String[] args) {
  4. for (int i = 1; i <= 6; i++) {
  5. Connection conn = SimpleConnectPool.getConnect();
  6. System.out.printf("第" + i + "次获取:" + conn+"\n");
  7. if (i == 3) {
  8. SimpleConnectPool.close(conn);
  9. System.out.printf("第" + i + "次归还:" + conn+"\n");
  10. }
  11. }
  12. }
  13. }

        2、使用 C3P0 数据库连接池

        步骤:

                (1)导入jar包。导入方式和mysql驱动包的导入一样,注意这次除了要导入一个jar包外,还需要导入一个 xml 配置文件,即如下2个文件。        

C3P0下载:c3p0-0.9.5.2-Java文档类资源-CSDN文库                 

                (2)编写 c3p0-config.xml 配置文件。打开 c3p0-config.xml ,将里面与数据库连接相关的4个参数修改为自己的。C3P0会根据这个配置文件中的参数连接你的mysql数据库。

【注意】该配置文件需放在 src 目录下。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <c3p0-config>
  3. <default-config>
  4. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
  5. <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1</property>
  6. <property name="user">root</property>
  7. <property name="password">root</property>
  8. <property name="initialPoolSize">5</property>
  9. <property name="maxPoolSize">10</property>
  10. <property name="checkoutTimeout">3000</property>
  11. </default-config>
  12. <named-config name="otherc3p0">
  13. </named-config>
  14. </c3p0-config>

                (3)创建 C3P0Demo1 类,编写相关代码。

  1. import com.mchange.v2.c3p0.ComboPooledDataSource;
  2. import javax.sql.DataSource;
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. public class C3P0Demo1 {
  6. public static void main(String[] args) throws SQLException {
  7. // 创建数据库连接池对象
  8. DataSource dataSource = new ComboPooledDataSource();
  9. // 获取数据库连接对象
  10. Connection conn = dataSource.getConnection();
  11. System.out.println(conn);
  12. // 归还连接
  13. conn.close();
  14. }
  15. }

                (4)你也可以不编写 c3p0-config.xml 配置文件,直接在代码中设置数据库连接相关参数。创建 C3P0Demo2 类,编写相关代码。

  1. import com.mchange.v2.c3p0.ComboPooledDataSource;
  2. import java.beans.PropertyVetoException;
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. public class C3P0Demo2 {
  6. public static void main(String[] args) throws PropertyVetoException, SQLException {
  7. // 创建数据库连接池对象
  8. ComboPooledDataSource dataSource = new ComboPooledDataSource();
  9. // 配置参数信息
  10. dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
  11. dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db1");
  12. dataSource.setUser("root");
  13. dataSource.setPassword("root");
  14. // 获取数据库连接对象
  15. Connection conn = dataSource.getConnection();
  16. System.out.println(conn);
  17. // 归还连接
  18. conn.close();
  19. }
  20. }

        3、使用 Druid 数据库连接池

        (1)导入jar包。导入方式和mysql驱动包的导入一样,注意这次除了要导入一个jar包外,还需要导入一个 properties 配置文件,即如下2个文件。        

 Druid下载:druid-1.0.9-Java文档类资源-CSDN文库

        (2)编写 druid.properties 配置文件。打开 druid.properties ,将里面与数据库连接相关的参数修改为自己的。Druid会根据这个配置文件中的参数连接你的mysql数据库。

【注意】该配置文件需放在 src 目录下。

  1. driverClassName=com.mysql.cj.jdbc.Driver
  2. url=jdbc:mysql://localhost:3306/db1
  3. username=root
  4. password=root
  5. initialSize=5
  6. maxActive=10
  7. maxWait=3000
  8. filters=stat
  9. timeBetweenEvictionRunsMillis=60000
  10. minEvictableIdleTimeMillis=300000
  11. validationQuery=SELECT 1
  12. testWhileIdle=true
  13. testOnBorrow=false
  14. testOnReturn=false
  15. poolPreparedStatements=false
  16. maxPoolPreparedStatementPerConnectionSize=200

        (3)创建 DruidDemo1 类,编写相关代码。

  1. import com.alibaba.druid.pool.DruidDataSourceFactory;
  2. import javax.sql.DataSource;
  3. import java.sql.Connection;
  4. import java.util.Properties;
  5. public class DruidDemo1 {
  6. public static void main(String[] args) throws Exception {
  7. // 创建数据库连接池对象
  8. Properties p = new Properties();
  9. p.load(DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties"));
  10. DataSource dataSource = DruidDataSourceFactory.createDataSource(p);
  11. // 获取数据库连接对象
  12. Connection conn = dataSource.getConnection();
  13. System.out.println(conn);
  14. // 归还连接
  15. conn.close();
  16. }
  17. }

        (4)同样的,你也可以不编写 druid.properties 配置文件,直接在代码中设置数据库连接相关参数。创建 DruidDemo2 类,编写相关代码。

  1. import com.alibaba.druid.pool.DruidDataSource;
  2. import java.sql.Connection;
  3. public class DruidDemo2 {
  4. public static void main(String[] args) throws Exception {
  5. // 创建数据库连接池对象
  6. DruidDataSource dataSource = new DruidDataSource();
  7. // 配置参数信息
  8. dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
  9. dataSource.setUrl("jdbc:mysql://localhost:3306/db1");
  10. dataSource.setUsername("root");
  11. dataSource.setPassword("root");
  12. // 获取数据库连接对象
  13. Connection conn = dataSource.getConnection();
  14. System.out.println(conn);
  15. // 归还连接
  16. conn.close();
  17. }
  18. }

         4、编写 Druid 工具类

        当然,你可以像上面的 JdbcUtils 一样编写 Druid 的工具类。工具类代码放在 Utils 目录下。我这里使用的是编写配置文件的方式,配置文件不用改变。

  1. package Utils;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import javax.sql.DataSource;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.util.Properties;
  9. public class DruidUtils {
  10. public static DataSource dataSource;
  11. static {
  12. try {
  13. Properties p = new Properties();
  14. p.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
  15. dataSource = DruidDataSourceFactory.createDataSource(p);
  16. } catch (Exception e) {
  17. throw new RuntimeException(e);
  18. }
  19. }
  20. // 获取数据库连接池对象的方法
  21. public static DataSource getDataSource() {
  22. return dataSource;
  23. }
  24. // 获取数据库连接对象的方法
  25. public static Connection getConnection() throws Exception {
  26. return dataSource.getConnection();
  27. }
  28. // 归还数据库连接对象的方法
  29. public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
  30. try {
  31. // 归还数据库连接对象
  32. if (conn != null) conn.close();
  33. // 释放sql语句执行对象
  34. if (ps != null) ps.close();
  35. // 释放查询结果集
  36. if (rs != null) rs.close();
  37. } catch (SQLException e) {
  38. throw new RuntimeException(e);
  39. }
  40. }
  41. }

        使用:

  1. package Pool;
  2. import Utils.DruidUtils;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. public class DruidUtilsDemo3 {
  7. public static void main(String[] args) throws Exception {
  8. // 获取数据库连接对象
  9. Connection conn = DruidUtils.getConnection();
  10. // 获取执行sql语句执行对象
  11. PreparedStatement ps = conn.prepareStatement("select * from user");
  12. // 执行sql语句,获得结果集
  13. ResultSet rs = ps.executeQuery();
  14. // 解析结果集
  15. while (rs.next()) {
  16. int id = rs.getInt("id");
  17. String name = rs.getString("name");
  18. String password = rs.getString("password");
  19. System.out.println("id=" + id + ",name=" + name + ",password=" + password);
  20. }
  21. // 归还连接,释放sql语句执行对象、结果集
  22. DruidUtils.close(conn,ps,rs);
  23. }
  24. }

四、使用JavaTemplate

        JavaTemplate是由Spring框架对JDBC进行封装的基于ORM思想工具类,他可以帮助我们简化代码。

        1.ORM 对象关系映射思想(Object Relational Mapping)

        以我们浏览网站为例,当我们向网站的服务器发送请求(例如登录操作),服务器会收到我们请求相关的信息(例如登录的用户名、密码)。ORM的思想是先将这些信息封装到一个名为user的类中,这个类中的字段比如id,name,password等,会和数据库中表的列名一一对应。通过JDBC的解封装、反射等技术,将数据传递给数据库以及返回给服务器。 

        2、简单使用

        (1)导入jar包。需要导入5个包,包名如下:

 JavaTemplate下载:JdbcTemplate-Java文档类资源-CSDN文库

        (2)创建 User 类,类中的字段 和 你的数据库里面的表 一一对应。这段代码推荐使用工具自动生成,尽量不要自己写。

  1. public class User {
  2. private int id;
  3. private String name;
  4. private String password;
  5. public User() {
  6. }
  7. public User(int id, String name, String password) {
  8. this.id = id;
  9. this.name = name;
  10. this.password = password;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public void setPassword(String password) {
  19. this.password = password;
  20. }
  21. public int getId() {
  22. return id;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public String getPassword() {
  28. return password;
  29. }
  30. @Override
  31. public String toString() {
  32. return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}';
  33. }
  34. }

【注意】不要忘记无参构造!不要忘记漏了setXXX()、getXXX()方法

        (3)创建 JdbcTemplateDemo 类,编写相关代码

        (4)创建数据库连接池对象(C3P0或者Druid)

                C3P0:

DataSource dataSource = new ComboPooledDataSource();

                Druid:

  1. Properties p = new Properties();
  2. p.load(JdbcTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
  3. DataSource dataSource = DruidDataSourceFactory.createDataSource(p);

        (5)创建JdbcTemplate对象,将数据库连接池对象封装到JdbcTemplate对象

                方式1:通过JdbcTemplate的有参构造赋值

JdbcTemplate jt = new JdbcTemplate(dataSource);

                方式2:通过JdbcTemplate的setDataSource方法赋值

  1. JdbcTemplate jt = new JdbcTemplate();
  2. jt.setDataSource(dataSource);

         (6)执行 sql 语句

                增删改:

  1. User user = new User(1,"admin","1234");
  2. jt.update("insert into user value (?,?,?)",user.getId(),user.getName(),user.getPassword());
  3. jt.update("update user set name = ? where id = ?", user.getName(), user.getId());
  4. jt.update("delete from user where id = ?", user.getId());

                查:

  •  查询一条数据
  1. int id = 1; // 仅为简单示范
  2. User user = jt.queryForObject("select * from user where id = ?",new BeanPropertyRowMapper<>(User.class),id);
  3. System.out.println(user);
  • 查询多条记录
  1. List<User> users = jt.query("select * from user", new BeanPropertyRowMapper<>(User.class));
  2. for (User a : users) System.out.println(a);
  • 查询一个数据 : 查询 id=1 的 name 值
  1. int id = 1; // 仅为简单示范
  2. String name = jt.queryForObject("select name from user where id = ?", String.class, id);
  3. System.out.println(name);
  • 查询一个数据 : 查询表中有多少条记录
  1. int count = jt.queryForObject("select count(*) from user",int.class);
  2. System.out.println(count);

         (7)所有代码:

  1. import com.mchange.v2.c3p0.ComboPooledDataSource;
  2. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import javax.sql.DataSource;
  5. import java.util.List;
  6. public class JdbcTemplateDemo {
  7. public static void main(String[] args) throws Exception {
  8. // 1.创建数据库连接池对象
  9. /* C3P0 */
  10. DataSource dataSource = new ComboPooledDataSource();
  11. /* Druid */
  12. /*
  13. Properties p = new Properties();
  14. p.load(JdbcTemplateDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
  15. DataSource dataSource = DruidDataSourceFactory.createDataSource(p);
  16. */
  17. // 2.创建 JdbcTemplate 对象,将数据库连接池封装到 JdbcTemplate 对象
  18. /* 方法一 : 提供有参构造赋值 */
  19. // JdbcTemplate jt = new JdbcTemplate(dataSource);
  20. /* 方法二 : 通过setDataSource赋值 */
  21. JdbcTemplate jt = new JdbcTemplate();
  22. jt.setDataSource(dataSource);
  23. // 3.执行 sql 语句
  24. /* 增删改 */
  25. User user1 = new User(1,"admin","1234"); // 仅为简单示范
  26. jt.update("insert into user value (?,?,?)", user1.getId(), user1.getName(),user1.getPassword());
  27. jt.update("update user set name = ? where id = ?", user1.getName(), user1.getId());
  28. jt.update("delete from user where id = ?", user1.getId());
  29. /* 查 */
  30. // 查询一条数据
  31. int id = 1; // 仅为简单示范
  32. User user2 = jt.queryForObject("select * from user where id = ?",new BeanPropertyRowMapper<>(User.class),id);
  33. System.out.println(user2);
  34. // 查询多条记录
  35. List<User> users = jt.query("select * from user", new BeanPropertyRowMapper<>(User.class));
  36. for (User a : users) System.out.println(a);
  37. // 查询一个数据 : 查询 id=1 的 name 值
  38. String name = jt.queryForObject("select name from user where id = ?", String.class, 1);
  39. System.out.println(name);
  40. // 查询一个数据 : 查询表中有多少条记录
  41. int count = jt.queryForObject("select count(*) from user",int.class);
  42. System.out.println(count);
  43. }
  44. }
  1. public class User {
  2. private int id;
  3. private String name;
  4. private String password;
  5. public User() {
  6. }
  7. public User(int id, String name, String password) {
  8. this.id = id;
  9. this.name = name;
  10. this.password = password;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public void setPassword(String password) {
  19. this.password = password;
  20. }
  21. public int getId() {
  22. return id;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public String getPassword() {
  28. return password;
  29. }
  30. @Override
  31. public String toString() {
  32. return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}';
  33. }
  34. }

        3、实际项目中的使用

        项目结构:

         (1)UserDao类

  1. import java.util.List;
  2. public interface UserDao {
  3. // 添加用户
  4. void add(User user);
  5. // 修改用户
  6. void update(User user);
  7. // 删除用户
  8. void delete(int id);
  9. // 查询所有
  10. List<User> findAll();
  11. // 查询一条数据
  12. User findById(int id);
  13. }

        (2)UserDaoImpl 类

  1. import Utils.DruidUtils;
  2. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  3. import org.springframework.jdbc.core.JdbcTemplate;
  4. import java.util.List;
  5. public class UserDaoImpl implements UserDao {
  6. // 创建 JdbcTemplate 对象
  7. private final JdbcTemplate jt = new JdbcTemplate(DruidUtils.getDataSource());
  8. @Override
  9. public void add(User user) {
  10. jt.update("insert into user values(?,?,?)", user.getId(), user.getName(), user.getPassword());
  11. }
  12. @Override
  13. public void update(User user) {
  14. jt.update("update user set name = ?,password = ? where id = ?", user.getName(), user.getPassword(), user.getId());
  15. }
  16. @Override
  17. public void delete(int id) {
  18. jt.update("delete from user where id = ?", id);
  19. }
  20. @Override
  21. public List<User> findAll() {
  22. List<User> users = jt.query("select * from user", new BeanPropertyRowMapper<>(User.class));
  23. return users;
  24. }
  25. @Override
  26. public User findById(int id) {
  27. User user = jt.queryForObject("select * from user where id = ?", new BeanPropertyRowMapper<>(User.class), id);
  28. return user;
  29. }
  30. }

        (3)User 类

  1. import java.io.Serializable;
  2. public class User implements Serializable {
  3. private int id;
  4. private String name;
  5. private String password;
  6. public User() {
  7. }
  8. public User(int id, String name, String password) {
  9. this.id = id;
  10. this.name = name;
  11. this.password = password;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public void setPassword(String password) {
  20. this.password = password;
  21. }
  22. public int getId() {
  23. return id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public String getPassword() {
  29. return password;
  30. }
  31. @Override
  32. public String toString() {
  33. return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}';
  34. }
  35. }

        (4)DruidUtils 类

  1. import com.alibaba.druid.pool.DruidDataSourceFactory;
  2. import javax.sql.DataSource;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.util.Properties;
  8. public class DruidUtils {
  9. public static DataSource dataSource;
  10. static {
  11. try {
  12. Properties p = new Properties();
  13. p.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
  14. dataSource = DruidDataSourceFactory.createDataSource(p);
  15. } catch (Exception e) {
  16. throw new RuntimeException(e);
  17. }
  18. }
  19. // 获取数据库连接池对象的方法
  20. public static DataSource getDataSource() {
  21. return dataSource;
  22. }
  23. // 获取数据库连接对象的方法
  24. public static Connection getConnection() throws Exception {
  25. return dataSource.getConnection();
  26. }
  27. // 归还数据库连接对象的方法
  28. public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
  29. try {
  30. // 归还数据库连接对象
  31. if (conn != null) conn.close();
  32. // 释放sql语句执行对象
  33. if (ps != null) ps.close();
  34. // 释放查询结果集
  35. if (rs != null) rs.close();
  36. } catch (SQLException e) {
  37. throw new RuntimeException(e);
  38. }
  39. }
  40. }

        (5)UserTest 类

  1. import org.junit.Test;
  2. import java.util.List;
  3. public class UserTest {
  4. // 创建 Dao 对象
  5. private final UserDao userDao = new UserDaoImpl();
  6. @Test
  7. public void add() {
  8. User user = new User(1, "ketty", "eee");
  9. userDao.add(user);
  10. }
  11. @Test
  12. public void update() {
  13. User user = new User(1, "hello", "root");
  14. userDao.update(user);
  15. }
  16. @Test
  17. public void delete() {
  18. userDao.delete(1);
  19. }
  20. @Test
  21. public void findAll() {
  22. List<User> users = userDao.findAll();
  23. for (User a : users) {
  24. System.out.println(a);
  25. }
  26. }
  27. @Test
  28. public void findById() {
  29. User user = userDao.findById(1);
  30. System.out.println(user);
  31. }

        UserTest 类中使用了 JUnit 的 @Test ,以便更快进行测试。你也可以在main方法中进行测试。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1002448
推荐阅读
相关标签
  

闽ICP备14008679号