/**
* 连接工具类,用于实现数据库的连接断开以及预编译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][size=x-large][size=xx-large][/size]
/**
* @author baiwenhui
*
*/
public interface RowMappingObject {
Object mapping(ResultSet rs);
}
分享到:
相关推荐
在IT行业中,数据访问层(DAL)是软件架构中的一个重要组成部分,主要负责处理与数据库的交互,实现数据的存取操作。C#作为.NET框架的主要编程语言,提供了丰富的工具和库来构建高效的数据访问层。本示例"数据库管理...
BLL与数据访问层和表现层交互,处理从UI层传递过来的请求,并将处理结果返回给UI层。BLL的目的是将复杂的业务逻辑与用户界面和数据存储分离,以实现更高的灵活性。 数据访问层(DAL)专注于与数据库的交互,负责...
数据访问层(Data Access Layer,DAL)是软件架构中的一个重要组成部分,主要负责处理应用程序与数据库之间的交互。在.NET环境中,创建高效、可复用的数据访问层对于任何项目都是至关重要的。"最好的数据访问层源码...
数据访问层(DAL)是软件开发中的一个重要组成部分,主要用于处理应用程序与数据库之间的交互。本说明书旨在详细阐述数据访问层的设计背景、目标、技术架构、实现方法以及相关规则,以指导开发人员规范地进行数据库...
数据访问层负责与数据库进行交互,实现数据的增删改查等操作。这一层通常包含了大量的 CRUD(Create, Read, Update, Delete)操作。 ### 三、使用 Codesmith 生成数据访问层 #### 1. 安装 Codesmith 首先,你需要...
**数据访问层**是负责与数据库进行交互的软件层,它承担着处理所有与数据存储相关的任务。在大多数情况下,数据访问层会隐藏底层数据库的复杂性,使业务逻辑层能够专注于核心业务逻辑而不是数据访问细节。以下是数据...
服务层实现ITestService接口定义了用户服务,TestService类实现了该接口,并通过依赖注入与数据访问层交互。 Web控制器HomeController处理首页和错误页面,TestController处理用户数据的获取请求。 依赖注入在...
它的主要职责是处理业务规则、验证用户输入、执行复杂的业务操作,并与数据访问层交互。在VB.NET中,我们通常会创建一个独立的项目或者类库来封装这些功能。 1. **业务逻辑设计**:在中间层,我们需要为每个业务...
因此,数据库水平扩展成为了关键的解决方案,而实现这一目标的软件,即为本文研究的对象:数据访问层中间件。 本篇文章的关键词包括:数据库中间件、分库分表、读写分离、限流以及MySQL。这些关键词指向了分布式...
在示例中,UserService类代表了业务逻辑层,它包含AddUser方法,该方法创建UserManager对象来与数据访问层交互,完成用户添加操作。BLL的存在使得表示层可以独立于具体的数据存储方式变化,只需关注业务逻辑。 3. ...
业务逻辑层与数据访问层交互,但不直接与表示层交互,起到了解耦的作用。 3. **数据访问层**:此层专注于数据的存取,通常使用ADO.NET、Entity Framework或其他ORM工具与数据库进行交互。在这个实例中,数据访问层...
BLL层不直接操作数据库,而是通过接口与数据访问层交互。它封装了复杂的业务逻辑,使得UI层可以简单地调用这些方法,而无需关心具体的实现细节。此外,BLL层还可以进行数据验证和异常处理,提高系统的健壮性。 3. ...
3. 数据访问层(Data Access Layer):该层负责与数据库或其他数据存储进行交互,实现数据的读取、写入、更新和删除等操作。数据访问层抽象了数据存储的细节,为业务逻辑层提供了一种统一的数据接口,使得系统对...
3. **BLL**:业务逻辑层,负责处理业务规则和数据验证,与表示层和数据访问层交互。 4. **Model**:模型层,定义了业务对象的数据结构和行为,是业务逻辑层和数据访问层之间的桥梁。 5. **DALFactory**:数据访问层...
BLL与数据访问层交互,获取或存储数据,同时与表现层通信,传递处理结果。在.NET中,可以通过类库项目来组织和实现BLL。 3. 数据访问层(Data Access Layer, DAL) 数据访问层负责与数据库进行交互,包括读取、...
表示层调用业务逻辑层的服务,业务逻辑层再与数据访问层交互以完成数据操作。这种分层设计使得开发人员可以专注于各自领域的任务,提高团队协作效率。 在实际开发中,层的划分可能更加细致,例如添加服务层、模型层...
业务逻辑层与数据访问层交互,获取或更新数据。 3. 数据访问层(Data Access Layer): 数据访问层是与数据库交互的部分,负责数据的存取操作。在ASP.NET中,可以使用ADO.NET、Entity Framework或其他ORM框架来...
业务逻辑层与数据访问层交互,调用DAO方法来获取或更新数据,同时也可以与表现层交互,接收用户的请求并返回处理结果。 3. 模型层(DBMad.Models.cst): 模型层是用来封装数据结构和业务实体的,它为其他层提供...
“Domo”可能代表“Domain Objects”,这部分内容可能包含了领域模型的示例,这些模型是业务逻辑层的核心,它们封装了业务规则和状态,并与数据访问层交互。 “Component”目录很可能包含了 IndyDB 组件的源代码...
业务逻辑层会验证用户输入,如检查库存、计算价格等,然后与数据访问层交互,更新数据库中的商品信息和订单状态。数据访问层则负责与数据库的通信,确保数据的正确存储和检索。 总的来说,“三层架构”是一种有效的...