Spring 学习其三:数据库编程

Posted jikio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 学习其三:数据库编程相关的知识,希望对你有一定的参考价值。

一、直接利用 JDBC 进行数据库编程

虽然有 Spring 和 MyBatis 等数据持久化的利器在手,但还是有必要去了解下传统的 JDBC 开发方式。无论哪种框架,其本质都是在传统的 JDBC 方式上进行了封装。

package JdbcTest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcTest {

    public static void main(String[] args) {
        EmployeeModel employee = null;    
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://192.168.52.129:3306/employees?serverTimezone=UTC", "root", "Root123#");
            ps =con.prepareStatement("select emp_no,first_name,last_name from employees where emp_no = ?");
            ps.setInt(1, 10001);
            rs = ps.executeQuery();
            while(rs.next()) {
                employee = new EmployeeModel();
                employee.setEmpNo(rs.getInt(1));
                employee.setFirstName(rs.getString(2));
                employee.setLastName(rs.getString(3));
            }
        } catch (ClassNotFoundException e) {
            System.out.println("class not found");
            } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                if(!(rs == null) && !rs.isClosed()) {
                    rs.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(!(ps == null) && ps.isClosed()) {
                    ps.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                if(con !=null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(employee);
    }

}

这段代码的恼人的地方在于数据库资源的使用和销毁,这些代码被大串的 try-catch 语句包裹。Spring 则为我们进行了一次包装,将这些烦人的 try-catch 语句交给 Spring 去处理。

二、为 Spring 创建第三方数据库连接池

Spring 本身也有自己的数据类,但是过于简单,在绝大多数的项目中,我们都希望能够用数据连接池的方式去管理连接。常用的第三方连接池是 DBCP2。

在配置 DBCP2 之前,现在 properties 文件里存好数据库连接所需的信息:

database.driver = com.mysql.cj.jdbc.Driver
database.url = jdbc:mysql://192.168.52.129:3306/employees?serverTimezone=UTC
database.username = root
database.password = Root123#
database.maxtotal = 255
database.maxidle = 3
database.maxwaitmillis = 10000

maxtoal 值最大连接数,maxidle 为最大等待连接数量(超出这个数量的连接资源会被释放),maxwaitmillis 为最大等待毫秒数

然后再 spring-cfg.xml 里引入该 peoperties 文件并且建立一个连接池对象:

<bean id = "dataSource" class = "org.apache.commons.dbcp2.BasicDataSource">
      <property name = "driverClassName" value = "${database.driver}"/>
      <property name="url" value="${database.url}"/>
      <property name="username" value="${database.username}"/>
      <property name="password" value="${database.password}"/>
      <property name="maxTotal" value="${database.maxtotal}"/>
      <property name="maxIdle" value="${database.maxidle}"/>
      <property name="maxWaitMillis" value="${database.maxwaitmillis}"/>
    </bean>

而包装传统 jdbc 的 Spring 的类为 JdbcTemple ,我们也配置下:

<bean id="jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate">
      <property name = "dataSource" ref = "dataSource"/>
    </bean>

然后使用 JdbcTemplate 来完成上面的获取 employee 信息的功能:

 

以上是关于Spring 学习其三:数据库编程的主要内容,如果未能解决你的问题,请参考以下文章

所谓并发编程,所谓有其三

所谓并发编程,所谓有其三

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

985大学的高材生只会写代码片段,丢人吗?

985高校的高材生只会写代码片段,丢人吗?

985大学的高材生只会写代码片段,丢人吗?