数据访问层交互

/**
* 连接工具类,用于实现数据库的连接断开以及预编译SQL语句和执行SQL命令
* 主要封装对数据库的CRUD功能的方法
*/
package ch10.util;

import java.sql.*; //导入连接数据库时所需要的相关包
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* @author baiwenhui
*
*/
public class DBUtills {
//首先定义连接字符串
//用于数据库加载驱动的命令
private static final String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
//用于加载链接地址的命令
private static final String url = "jdbc:sqlserver://localhost:1433;databaseName = DBName";
//定义连接数据库的用户名
private static final String user = "loginName";
//定义连接数据库的用户名密码
private static final String password = "password";
//声明连接数据的连接对象
private static Connection conn;
//声明连接数据库时预编译器对象
private static PreparedStatement pstmt;
//声明执行SQL命令后返回的结果及对象
private static ResultSet rs;
/**
* 根据驱动,打开数据库的连接
* @throws ClassNotFoundException
* @throws SQLException
*/
private static void getConn() throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName(driver);
//得到连接对象
conn = DriverManager.getConnection(url, user, password);
}
/**
* 关闭数据库的连接,关闭的顺序与打开数据库的顺序相反
* @throws SQLException
*/
private static void closeConn() throws SQLException {
if (rs != null ) { //如果结果集不为空
rs.close(); //关闭结果集对象
}
if (pstmt != null ) { //如果预编译对象不为空
pstmt.close(); //关闭预编译对象
}
if (conn != null && ! conn.isClosed() ) { //如果连接对象不为空
conn.close(); //关闭连接对象
}
}
/**
* 根据带参数的占位符问号的值,构建PreparedStatement对象
* @param sql
* @param objs
* @throws SQLException
*/
public static void preparedSQL(String sql,Object[] objs) throws SQLException {
//得到预编译对象
pstmt = conn.prepareStatement(sql);
if (null != objs) { //如果参数不为空
//进行遍历赋值
for (int i = 0; i < objs.length; i++) {
pstmt.setObject(i+1, objs[i]);
}
}

}
/**
* 实行对数据的C D U 功能
* @param sql 包含带有参数占位符 ? 的 SQL 语句
* @param objs 占位符具体的值
* @return 返回数据库受影响的行数
*/
public static int execSQL(String sql,Object[] objs) {
int result = -1;
try {
//得到数据库的连接
getConn();
//执行预编译SQL语句
preparedSQL(sql, objs);
//接收返回受影响的行数
result = pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
closeConn(); //关闭数据库的连接对象
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
/**
* 对数据库 C D U支持事物的操作
* @param paras Map--->key(String SQL语句) value(object[] (SQL语句的参数))
* @return 受影响的行数
*/
public static int execSQLs(Map<String, Object[]> paras) {
int rowcount = -1;
try {
//打开连接
getConn();
conn.setAutoCommit(false); //将自动提交事务修改为false
if (null != paras && paras.size()>0) { //如果SQL语句参数不为空并且大小大于 0
//进行循环遍历预编译SQL语句
for (String key : paras.keySet()) { //遍历参数
//执行SQL预编译
preparedSQL(key, paras.get(key));
rowcount += pstmt.executeUpdate(); //统计执行受影响的行数
}
//如果影响大行数大于0 则提交事务
conn.commit(); //提交事务
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
conn.rollback(); //事物回滚
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return rowcount;

}
/**
* 返回对象的集合
* @param sql 带参数占位符 ? 的SQL语句
* @param objs 占位符,具体的值
* @param rmo 行映射成对象的接口
* @return 集合List
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List getList(String sql,Object[] objs,RowMappingObject rmo) {
List lst = new ArrayList(); //实例化一个List集合
try {
getConn(); //得到连接对象
preparedSQL(sql, objs); //预编译SQL语句
rs = pstmt.executeQuery(); //接收查询返回的结果集
//通过While循环对对象进行赋值
while (rs.next()) {
lst.add(rmo.mapping(rs));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return lst;
}
/**
* 查询某一个含具体标示符的对象
* @param sql 带参数占位符 ? 的SQL语句
* @param objs 占位符,具体的值
* @param rmop 行映射成对象的接口
* @return 返回单个对象
*/
public static Object getObject(String sql,Object[] objs,RowMappingObject rmop) {
Object obj = null;
try {
getConn(); //打开数据库连接
preparedSQL(sql, objs); //预编译SQL
rs = pstmt.executeQuery(); //接收查询到的结果集
if ( rs.next()) {
obj = rmop.mapping(rs); //通过反射得到相应的对象
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
closeConn();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //关闭连接
}
return obj;
}
/**
* 通过聚合函数查询对象的个数
* @param sql 含有标示符? 的SQL语句
* @param objs 占位符 ? 具体的值
* @return 聚合函数执行的结果
*/
public static Object getObject(String sql,Object[] objs){
Object obj = null;
try {
getConn(); //打开连接
preparedSQL(sql, objs); //执行预编译
rs =pstmt.executeQuery(); //接受返回的结果集
if (rs.next()) {
obj = rs.getObject(1);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
/**
* 将数据库中的数据映射为对象
*/
package ch10.util;

import java.sql.ResultSet;
[size=small][/size][size=x-large][/size][size=xx-large][/size]
/**
* @author baiwenhui
*
*/
public interface RowMappingObject {
Object mapping(ResultSet rs);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值