分层模式是一种常见的架构模式,今天我就分享一下,最底层的数据访问层,访问Oracle数据库并进行增删改查的代码!
要实现访问Oracle数据库,需要加载一个ojdbc.jar包,下载这个jar包后,将其放入项目的目录里,然后build path就行了。
下面就直接分享代码了!
import java.sql.*;
import java.util.List;
public abstract class BaseDao {
private final static String DBDriver="oracle.jdbc.OracleDriver"; **//驱动路径,就是刚导入的jar包**
private final static String DBURL="jdbc:oracle:thin:@localhost:1521:orcl";
**//@前面的照写,后面的localhost代表本地服务器,1521为Oracle数据库的端口号,orcl是数据库安装时设置的数据库名.**
private final static String DBUser="root"; //数据库名称
private final static String DBPasswd="123456"; //密码
public static Connection conn = null;
public ResultSet rs = null;
public PreparedStatement pst;
/加载驱动、创建链接
public static Connection getConnection(){
try {
Class.forName(DBDriver);
conn = DriverManager.getConnection(DBURL,DBUser,DBPasswd);
} catch (Exception e) {
e.printStackTrace();
}
if(conn == null)
{
System.out.print("Line:27 数据库连接失败!");
}
return conn;
}
/查询
public ResultSet doQuery(String sql)
{
return doQuery(sql , new Object[]{});
}
public ResultSet doQuery(String sql , Object[] param){
//sql需要编写后传入,sql可以带参数,带参的地方用?代替,第二个参数是需要传入的参数数组
conn = BaseDao.getConnection();
try {
pst = conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
for(int i=0 ; i<param.length ; i++)
{
try {
pst.setObject(i+1, param[i]);
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
rs = pst.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
更新
public int doUpdate(String sql){
return doUpdate(sql , new Object[]{});
}
public int doUpdate(String sql , Object[] param){
//sql需要编写后传入,sql可以带参数,带参的地方用?代替,第二个参数是需要传入的参数数组
int result = 0;
conn = BaseDao.getConnection();
try {
pst = conn.prepareStatement(sql);
} catch (SQLException e1) {
e1.printStackTrace();
}
for(int i=0 ; i<param.length ; i++)
{
try {
pst.setObject(i+1, param[i]);
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
result = pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
插入
public int doInsert(String sql)
{
return doUpdate(sql);
}
public int doInsert(String sql , Object[] param)
{
return doUpdate(sql , param);
}
//删除
public int doDelete(String sql)
{
return doUpdate(sql);
}
public int doDelete(String sql , Object[] param)
//sql需要编写后传入,sql可以带参数,带参的地方用?代替,第二个参数是需要传入的参数数组
{
return doUpdate(sql , param);
}
//关闭连接
public void closeConnection(){
if(rs!=null)
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pst!=null)
{
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null)
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//对结果集进行处理
public abstract <T> List<T> resultSetToList(ResultSet ret);
}
这里查询、修改、更新、删除都重写了两个方法,一个带参的,一个不带参,增加了代码的灵活性,不过也使代码臃肿了,你们可以自行简化。需要注意的是,查询返回的是ResutSet结果集,其他三个操作都基于更新,返回的是int类型影响的行数,在业务逻辑层应用相对应的变量接收返回值!