昨天刚刚看了JDBC的连接,因为毕设的后端需要用数据库,想试一下如果使用spring里面的容器来管理JDBC会是怎样的效果,也算是对之前的spring学习一个小应用。
首先在lib文件夹下放上spring和JDBC需要的包:
顺带贴上项目文件的结构,其中Add文件用于添加,Delete用于删除,getConnection用于建立JDBC连接:
首先编写建立连接的程序,这个小实验的关键,是让JDBC的关键对象与spring的容器结合,我的设想是因为增删改查都是需要用到connection对象,所以可以将这个对象作为bean,通过注入其他bean的方式,来实现容器的管理,所以获取连接的代码就可以写成下面的样子:
package com.getJDBC;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class getConnection {
Connection conn;
public void getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/db_database10?serverTimezone=GMT%2B8";
String username = "root";
String password = "04050907";
conn = DriverManager.getConnection(url,username,password);
System.out.println("getting successfully!");
}
public void get() throws ClassNotFoundException, SQLException {
}
}
这个连接类是其余类的基础,实例化这个类,再注入到其它的bean里面。
在此基础上就可以编写ADD类了,先上代码:
package com.getJDBC;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Add {
private getConnection con;
public void setConn(getConnection conn) {
this.con=conn;
}
public void addBook() throws SQLException, ClassNotFoundException {
String sql = "insert into tb_books(name,price,bookCount,author) values(?,?,?,?)";
con.getConnection();
PreparedStatement ps = con.conn.prepareStatement(sql);
ps.setString(1, "缘之空");
ps.setInt(2,24);
ps.setInt(3,23);
ps.setString(4,"轻之文库");
int row = ps.executeUpdate();
ps.close();
con.conn.close();
System.out.println("Add successfully!");
}
}
编写好注入需要的setter方法,之后就可以写添加信息的方法了,这个方法是按照JDBC的要求直接写的。编写完成后一直报错,顺了半天,发现错误在于注入的对象,整个的逻辑是连接对象注入到添加对象,但是一开始我们的连接对象里面的JDBC连接就是个对象,并不是一个一般的变量,所以不能够直接初始化,相当于必须调用一遍连接对象的getConnection方法才能给这个对象初始化,修改了这一点整个程序就可以运行了。删除的代码和这个类似,直接贴代码:
package com.getJDBC;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Delete {
private getConnection con;
public void setConn(getConnection conn) {
this.con=conn;
}
public void deleteBook() throws SQLException, ClassNotFoundException {
String sql="delete from tb_books where name=?";
con.getConnection();
PreparedStatement ps=con.conn.prepareStatement(sql);
ps.setString(1,"缘之空" );
ps.executeUpdate();
ps.close();
con.conn.close();
System.out.println("Delete successfully!");
}
}
对应的配置文件applicationContext.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 由 Spring容器创建该类的实例对象 -->
<bean id="conn" class="com.getJDBC.getConnection" />
<bean id="add" class="com.getJDBC.Add" >
<property name="Conn" ref="conn"/>
</bean>
<bean id="del" class="com.getJDBC.Delete" >
<property name="Conn" ref="conn"/>
</bean>
</beans>
之后利用JUnit编写测试代码,首先创建对应的数据库,数据库初试状态如下:
添加的测试代码如下:
package com.getJDBC;
import java.sql.SQLException;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
class test {
@Test
void test() throws ClassNotFoundException, SQLException{
// 定义Spring配置文件的路径
String xmlPath = "com/getJDBC/applicationContext.xml";
// 初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
Add add = (Add) applicationContext.getBean("add");
add.addBook();
}
}
运行后控制台信息和数据库内变化如下,图书信息已经成功添加到数据库中:
之后再使用删除的junit程序,代码如下:
package com.getJDBC;
import java.sql.SQLException;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
class test {
@Test
void test() throws ClassNotFoundException, SQLException{
// 定义Spring配置文件的路径
String xmlPath = "com/getJDBC/applicationContext.xml";
// 初始化Spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
Delete del = (Delete) applicationContext.getBean("del");
del.deleteBook();
}
}
运行结果和数据库的变化如下,刚才添加的图书信息已经被成功删除:
至此,这个利用spring和JDBC结合的小实验算是成功了,但是spring本身就提供了用于访问数据库的接口,采用这种办法虽然可行,但是有些多余,也算是对前面spring知识的小应用,明天继续开spring的JDBC操作。