dao层和service层分别是充当什么角色的,举个简单例子,小的在此谢了。

dao层和service层分别是充当什么角色的,举个简单例子,小的在此谢了。,第1张

dao完成连接数据库修改删除添加等的实现细节,例如sql语句是怎么写的,怎么把对象放入数据库的

service层是面向功能的,一个个功能模块比如说银行登记并完成一次存款,UI要把请求给service层,然后service曾将这一个case分解成许多步骤调用底层的实现完成这次存款,dao就是下面那层

dao就是把数据存起来,之所以service的方法会有雷同只不过是因为service得需求不是很复杂不用再service里面完成太多包装或者处理过程可以直接调用dao的方法就完成的请求处理例如就要save一个对象,而这个对象是封装好的,dao里面有个方法专门save封装好的对象于是service的方法就仅仅调用一下就o了,函数签名自然很像了

service不能直接接触持久层,而dao是持久层或者直接访问持久层

有的时候只是为了分层清楚,为了将来scale up的时候方便我们才把service和dao分开,其实没必要分开的

package s2jsp.bysj.dao//此类所在包的名称

import java.sql.Connection//导入Connection类

import java.sql.PreparedStatement//导入PreparedStatement类

import java.sql.ResultSet//导入ResultSet类

import java.util.ArrayList//导入ArrayList类

import java.util.List//导入List类

import s2jsp.bysj.entity.Users//导入Users实体类

public class UserDao extends BaseDao { //UserDao类继承了BaseDao类

private Connection conn//声明私有变量:Connection对象

private PreparedStatement pstmt//声明私有变量:PreparedStatement对象

private ResultSet rs//声明私有变量:ResultSet数据集对象

/**

* 根据用户名和密码,查找相关用户信息

* @return Users类的对象:用户对象

*@userName 用户名

*@password 用户密码

*/

public Users findUsers(String userName, String password) {

Users user = null//声明实体类Users对象

String sql = "select * from users where userName=? and password=? "//定义sql变量,此变量用来代替执行的SQL语句

try { //将会发生异常的代码放在了try{}catch{}块中

conn = this.getConn()//初始化了Connection对象:conn,getConn()方法是继承自BaseDao的方法

pstmt = conn.prepareStatement(sql)//初始化PreparedStatement对象:pstmt

pstmt.setString(1, userName)//为SQL语句中的参数1设置值

pstmt.setString(2, password)//为SQL语句中的参数2设置值

rs = pstmt.executeQuery()//用PreparedStatement的对象的executeQuery()方法初始化ResultSet对象:rs

if (rs.next()) { //如果ResultSet的next()方法返回true,则说明目标数据库中的下一行有数据

user = new Users()//初始化Users实体类,此类准备用来初始化其域

user.setUserID(rs.getInt("userID"))//用数据库中的值初始化Users实体类中的UserID字段

user.setUserName(userName)//用数据库中的值初始化Users实体类中的UserName字段

user.setPassword(password)//用数据库中的值初始化Users实体类中的Password字段

user.setStatus(rs.getInt("status"))//用数据库中的值初始化Users实体类中的Status字段

}

} catch (Exception e) { //catch内使用了Exception异常根类的printStackTrace()方法:表示将错误信息打印在堆栈上

e.printStackTrace()

} finally { //finally块中的语句表示始终要执行的语句,并且在try语句块后执行

this.closeAll(conn, pstmt, rs)//try语句块中执行完毕或发生异常则使用closeAll()关闭所有使用到的数据库连接对象,此处省略this也可以,conn是Connection对象,pstmt是PreparedStatement对象,rs是ResultSet对象

}

return user//此方法最后返回Users实体类的对象,注:如果方法定义有返回值则一定要加此关键字

}

/**

* 判断数据库中当前用户名是否存在

* @param userName 用户名

* @return 存在返回true,否则返回false

*/

public boolean findUsers(String userName){ //此方法用来查找传入的用户是否存在,返回一个布尔类型的值,true表示存在,false表示不存在

String sql = "select * from users where userName=? "//定义SQL语句并放入sql变量中,这样的好处是简化了代码的长度和复用的便利

try {

conn = this.getConn()//用BaseDao类的getConn()方法初始化Connection对象:conn

pstmt = conn.prepareStatement(sql)//用Connection对象的prepareStatement()方法初始化PreparedStatement对象:pstmt

pstmt.setString(1, userName)//设置SQL语句参数1的值:userName

rs = pstmt.executeQuery()//使用PreparedStatement对象的executeQuery()方法初始化ResultSet对象:rs

if (rs.next()) { //如果数据库中有记录则返回true,此时方法停止

return true

}

} catch (Exception e) {

e.printStackTrace()//将错误信息打印到控制台

} finally {

this.closeAll(conn, pstmt, rs)//关闭所有使用到的数据库连接对象,此处可省略this关键字

}

return false//最后的返回值可以是任意布尔类型的值

}

/**

* 添加用户信息

* @param userName

* @param password

* @return *** 作数据库影响行数

*/

public int insertUser(String userName, String password,int status) { //插入一个用户的方法,此方法类的参数跟数据库中强制不为空的列是一一对应的

String sql = "insert into users values(?,?,?) "//定义SQL语句

String[] params = new String[] { userName, password ,status+""}//定义字符串数组用来存放传入的参数,因为传入的参数可能不止一个所以定义一个字符串数组来存放,困了余下的代码都差不多所以我简单写了

return this.executeSQL(sql, params)

}

/**

* 查找所有的注册用户信息

* @return 用户列表

*/

public List selectAllUser(){

List list=new ArrayList()//实例化一个ArrayList对象,因为ArrayList是List对象的子类

String sql = "select * from users "

try {

conn = this.getConn()

pstmt = conn.prepareStatement(sql)

rs = pstmt.executeQuery()

while(rs.next()) {

Users user = new Users()

user.setUserID(rs.getInt("userID"))

user.setUserName(rs.getString("userName"))

user.setPassword(rs.getString("password"))

user.setStatus(rs.getInt("status"))

list.add(user)

}

} catch (Exception e) {

e.printStackTrace()

} finally {

this.closeAll(conn, pstmt, rs)

}

return list//此方法返回一个List对象

}

/**

* 根据用户ID,进行删除 *** 作

* @param userID

* @return 执行SQL语句所影响的数据库行数

*/

public int deleteUserByID(String userID){

String sql="delete from users where userID = ? "//?号表示占位符号此处要用一个变量表示

String[] param = new String[]{ userID }

return this.executeSQL(sql, param)

}

}

//PreaparedStatement和Statement比较而言,PreparedStatement更适合于做修改插入的 *** 作,应为此类是预编译的类,他的执行效率要高于Statement类。而普通的查询则使用Statement就可以了。

//ResultSet是结果集的意思,他用来存放从数据库中读取到的所有数据,他用next()方法来确定下一行是否还有数据,用返回的布尔类型值类表示。使用ResultSet对象的getXX(index)方法获取程序从数据库中读取到的值,index为参数位置,从1开始,1对应数据中第一个字段。

//Connection是连接的意思,他的PreparedStatement和createStatement分别用来初始化PreaparedStatement对象和Statement对象。为SQL语句中的参数赋值用PreparedStatement对象的setXX(index,值)方法,参数位置从1开始递增。

//List是一个接口,ArrayList是实现了List接口的类,也可以其为List的子类,所以List lst=new ArrayList()是一种编译时多态的表现,是完全允许的。其返回的是ArrayList子类的对象。ArrayList一般用来对数据的遍历查询,而LinkedList则比较擅长于增删改,他们都是集合,在此处用来存放实体类的对象。

//try{}catch{}finally{}就不用我多说了吧!用来捕捉容易发生异常的代码段,一些抛出异常的类是要求强制捕捉的,如果不捕捉编辑器会报告一个错误。finally{}块中的代码是无论代码执行正确与否则都会执行,此处用来对数据库连接对象执行关闭 *** 作。

//其实我也是一个初学者,说了这么多也许还有很多没说到的地方,当然这段代码如果要解释完全是要牵扯到很多Java知识,应为篇幅和个人精力和知识量有限,先说到这儿了,各位也请多多包涵,多多指正吧!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11808987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存