在软件开发中,通常采用MVC模式,将视图和业务逻辑分开,业务逻辑层主要完成各种业务逻辑操作,如果业务逻辑设计到数据库访问,则将对数据库的操作封装在最底层。业务逻辑层可以通过继承或构造的方式实现数据库访问的透明性。在JAVA中对数据库的访问通常采用JDBC驱动来访问底层数据库,对于不同的数据库具有不同的JDBC驱动,相应的JDBC驱动可以到各种数据库的官网下载。那么在JAVA中如果实现对数据库的访问呢?接下来通过对mysql数据的访问操作例子来介绍jdbc数据访问操作的实现:
定义一个DatabaseHelper类:
public class DatabaseHelper {
private static final String DRIVER_STRING = "com.mysql.jdbc.Driver";
private static final String IP_STRING = "192.168.44.128";
private static final String USER_STRING = "root";
private static final String PASSWORD_S_STRING = "pwd";
private static final String DATABASE_NAME_STRING = "database_name";
private static final int PORT = 3306;
private Connection connection;
/**
* 采用单例模式获取数据库连接
* single object
* @return
*/
protected Connection getDefaultConnection(){
if (connection == null) {
connection = getConnection(getConnectionURL(IP_STRING, PORT, DATABASE_NAME_STRING),USER_STRING,PASSWORD_S_STRING);
}
return connection;
}
/**
* get PreparedStatement
* @param sql
* @return
*/
protected PreparedStatement getPreparedStatement(String sql) {
if (getDefaultConnection() != null) {
try {
return getDefaultConnection().prepareStatement(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
/**
* 组合数据库连接字符串
* @param databaseName
* @return
*/
protected String getConnectionURL(String ip,int port,String databaseName){
StringBuilder sBuilder = new StringBuilder();
return sBuilder.append("jdbc:mysql://").append(ip).append(":").append(String.valueOf(port))
.append("/").append(databaseName).toString();
}
/**
* close connection
*/
protected void close(){
try {
if (!connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
假设数据库中有一张表student,根据数据库表字段,编写相应的java bean
public class Student {
private String name;
private String six;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSix() {
return six;
}
public void setSix(String six) {
this.six = six;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
编写一个StudentDao类,继承DatabaseHelper,在该类中即可实现对数据库表的增删改查等操作:
public class StudentDao extends DatabaseHelper {
private PreparedStatement statement;
private ResultSet resultSet;
public List<Student > getDataSet(){
String sql = "select * from student";
List<Student > list = null;
try {
statement = getPreparedStatement(sql);
resultSet = statement.executeQuery();
if (resultSet != null) {
list = new ArrayList<Student >();
while(resultSet.next()){
Student student = new Student ();
student.setName(resultSet.getString("NAME"));
student.setSix(resultSet.getString("SIX"));
student.setAge(resultSet.getInt("AGE"));
list.add(student);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
这里只简单实现了对表的查询操作,通过这种方式就屏蔽了对数据库的直接操作,将对数据库的直接访问封装在父类中实现,业务逻辑之类关心的只是如何编写Sql语句,并将结果集返回,对于视图层,则直接调用该层的业务逻辑类,这样对于视类看到的只是函数调用,而看不到对数据库的操作。这种方式增强了软件的可移植性和可维护性,当换一种数据库时,我们只要修改DatabaseHelper类中的数据库连接配置信息即可。当数据库表结构变化时,我们也只需要修改业务逻辑层。