JDBC(Java DataBase Connectivity),一般用在传统的JSP/Servlet开发模式下,直接进行数据库的连接和操作。在使用JDBC进行数据操作时,一般先引入数据库驱动的jar包,然后创建一个数据库连接类提供数据库驱动的加载、数据库连接参数配置、连接对象的获取以及连接对象的关闭操作。代码如下:
package jdbcUtils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcUtil {
//定义MySQL数据库驱动程序
public static final String DBDRIVER = "com.mysql.jdbc.Driver";
//定义MySQL的数据库连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/data1";
//MySQL数据库连接用户名
public static final String USER = "root";
//MySQL数据库连接密码
public static final String PASSWORD = "123456";
static{
try{
Class.forName(DBDRIVER);
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(DBURL,USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//关闭数据库连接
public static void close(ResultSet rs,Statement st,Connection conn){
try {
if(rs!=null){rs.close();};
if(st!=null){st.close();};
if(conn!=null){conn.close();};
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement st,Connection conn){
close(null,st,conn);
}
}
在代码中,数据库驱动程序名称、数据库连接地址、数据库账号及密码都是硬编码到程序中的,需要修改时,要修改源码并重新编译,扩展性比较差。在日常开发中如果更换数据库所在服务器导致数据库连接地址发生变化、数据库管理员修改数据库密码,更换数据库类型等情况,都需要对源码进行修改,再重新编译、打包和上线。而且在每一个操作数据库的类中,都需要引入数据库连接(如上jdbcUtil数据库连接类),然后获取数据库连接,等操作完毕再关闭数据库连接,会造成数据库频繁连接、开启和关闭,影响数据库的性能。
当JDBC在操作SQL语句时如下:
public boolean add(Student student){
boolean flag = false;
Connection conn = null;
PreparedStatement pst = null;
try {
conn = JdbcUtil.getConnection();
String sql = "insert into student (id,name ,sex,classname) values (?,?,?,?)";
pst = conn.prepareStatement(sql);
pst.setInt(1, student.getId());
pst.setString(2, student.getName());
pst.setString(3, student.getSex());
pst.setString(4, student.getClassname());
int rows = pst.executeUpdate();
if(rows>0){flag=true;};
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.close(pst, conn);
}
return flag;
}
在如上代码中,sql语句及preparedStatement设置的占位符语句,以及占位符对应的参数都是硬编码到代码中的。如果修改sql语句或者插入的参数,就要修改源码,然后重新编译、打包和上线。同样在查找语句中,查找得到的结果集在遍历数据时,使用“getString”、“getInt”等方法的参数都是对应的表字段名称,若数据库表字段名称发生变化时则要修改其参数,然后重新编译、打包和上线,不利于系统的维护和扩展;
解决方案:连接参数、sql语句的硬编码,将sql语句配置在xml或其他非Java的配置文件中,这样即使sql发生变化,也不需要重新编译Java文件;数据库的频繁连接和断开,使用数据库连接池来管理数据的连接;查询结果集取数据的硬编码,采用一种机制将查询出的结果集自动映射为java对象,无需手动设置;当然最简单的解决方案还是使用框架来进行开发^_^