一, 直接利用 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 信息的功能:
来源: http://www.bubuko.com/infodetail-2793964.html