精华内容
下载资源
问答
  • 这段时间在看JavaWeb的视频时候,产生了一个疑惑,为什么Dao层和Service层要写接口和实现类? 这里是引用 接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,可以将其理解成一种规范.如果项目中,Dao层或Service层...

    这段时间在看JavaWeb的视频时候,产生了一个疑惑,为什么Dao层和Service层要写接口和实现类?

    接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,可以将其理解成一种规范.如果项目中,Dao层或Service层只需要一种实现,那么直接编写实现类可以减少代码量与复杂度,如果项目中Dao层或Service层需要有多个实现类,使用接口可以实现解耦,例如Dao层可以使用JDBC或者MyBatis,而不需要修改Service层的代码

    展开全文
  • DAO接口实现类

    千次阅读 2019-11-18 21:22:32
    DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录。 1 package chapter13; 2 import java.util.*; 3 public interface User...

    DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录。

    1 package chapter13;
    2 import java.util.*;
    3 public interface UserDAO {
    4     public void insert(User user) throws Exception;
    5     public void update(User user) throws Exception;
    6     public void delete(int userid) throws Exception;
    7     public User queryById(int userid) throws Exception;
    8     public List<User> queryAll() throws Exception;
    9 }

    DAO实现类实现了DAO接口,并且实现了接口中定义的所有方法。

      1 package chapter13;
      2 
      3 import java.util.*;
      4 import java.sql.*;
      5 import java.sql.Date;
      6 
      7 public class UserDAOImpl implements UserDAO {
      8 
      9     @Override
     10     public void insert(User user) throws Exception {
     11         // TODO Auto-generated method stub
     12         String sql="insert into user(username,password) values(?,?)";
     13         PreparedStatement preparedStatement=null;
     14         DataBaseConnection dbc=null;
     15         try{
     16             dbc=new DataBaseConnection();
     17             preparedStatement=dbc.getConnection().prepareStatement(sql);
     18             preparedStatement.setString(1, user.getUserName());
     19             preparedStatement.setString(2, user.getPassword());
     20             preparedStatement.executeUpdate();
     21             preparedStatement.close();
     22         }
     23         catch(Exception e){
     24             throw new Exception("操作出现异常");
     25         }finally {
     26             dbc.close();
     27         }
     28 
     29     }
     30 
     31     @Override
     32     public void update(User user) throws Exception {
     33         // TODO Auto-generated method stub
     34         String sql="update user set username=?,password=? where userid=?";
     35         PreparedStatement preparedStatement=null;
     36         DataBaseConnection dbc=null;
     37         try{
     38             dbc=new DataBaseConnection();
     39             preparedStatement=dbc.getConnection().prepareStatement(sql);
     40             preparedStatement.setString(1, user.getUserName());
     41             preparedStatement.setString(2, user.getPassword());
     42             preparedStatement.setInt(3, user.getUserId());
     43             preparedStatement.executeUpdate();
     44             preparedStatement.close();
     45         }
     46         catch(Exception e){
     47             throw new Exception("操作出现异常");
     48         }finally {
     49             dbc.close();
     50         }
     51     }
     52 
     53     @Override
     54     public void delete(int userid) throws Exception {
     55         // TODO Auto-generated method stub
     56         String sql="delete from user where userid=?";
     57         PreparedStatement preparedStatement=null;
     58         DataBaseConnection dbc=null;
     59         try{
     60             dbc=new DataBaseConnection();
     61             preparedStatement=dbc.getConnection().prepareStatement(sql);
     62             preparedStatement.setInt(1, userid);
     63             preparedStatement.executeUpdate();
     64             preparedStatement.close();
     65         }
     66         catch(Exception e){
     67             throw new Exception("操作出现异常");
     68         }finally {
     69             dbc.close();
     70         }
     71     }
     72 
     73     @Override
     74     public User queryById(int userid) throws Exception {
     75         // TODO Auto-generated method stub
     76         User user=null;
     77         String sql="select * from user where userid=?";
     78         PreparedStatement preparedStatement=null;
     79         DataBaseConnection dataBaseConnection=null;
     80         try{
     81             dataBaseConnection=new DataBaseConnection();
     82             preparedStatement=dataBaseConnection.getConnection().prepareStatement(sql);
     83             ResultSet rSet=preparedStatement.executeQuery();
     84             if(rSet.next()){
     85                 user=new User();
     86                 user.setUserId(rSet.getInt(1));
     87                 user.setUserName(rSet.getString(2));
     88                 user.setPassword(rSet.getString(3));
     89             }
     90             rSet.close();
     91             preparedStatement.close();
     92         }
     93         catch(Exception e){
     94             throw new Exception("操作出现异常");
     95         }finally {
     96             dataBaseConnection.close();
     97         }
     98         return user;
     99     }
    100 
    101     @Override
    102     public List<User> queryAll() throws Exception {
    103         // TODO Auto-generated method stub
    104         List<User> all=new ArrayList<User>();
    105         String sql="select * from user";
    106         PreparedStatement preparedStatement=null;
    107         DataBaseConnection dataBaseConnection=null;
    108         try{
    109             dataBaseConnection=new DataBaseConnection();
    110             preparedStatement=dataBaseConnection.getConnection().prepareStatement(sql);
    111             ResultSet rSet=preparedStatement.executeQuery();
    112             if(rSet.next()){
    113                 User user=new User();
    114                 user=new User();
    115                 user.setUserId(rSet.getInt(1));
    116                 user.setUserName(rSet.getString(2));
    117                 user.setPassword(rSet.getString(3));
    118                 all.add(user);
    119             }
    120             rSet.close();
    121             preparedStatement.close();
    122         }
    123         catch(Exception e){
    124             throw new Exception("操作出现异常");
    125         }finally {
    126             dataBaseConnection.close();
    127         }
    128         return all;
    129     }
    130 
    131 }

     

    展开全文
  • 为什么dao层和service层要写接口和实现类

    万次阅读 多人点赞 2019-05-11 15:23:16
    举个例子,用DAO接口,那么持久用Hibernate,还是用iBatis,还是 JDBC,随时可以替换,不用修改业务Service的代码。 不用接口的话,假如修改了dao中的代码,因为service引用了dao中的,那么也要改变service...

    为什么要用Service接口?是让表示层不依赖于业务层的具体实现。为什么要用DAO接口?是让业务层不依赖于持久层的具体实现。举个例子,用DAO接口,那么持久层用Hibernate,还是用iBatis,还是 JDBC,随时可以替换,不用修改业务层Service类的代码。
    不用接口的话,假如修改了dao中的代码,因为service引用了dao中的类,那么也要改变service里面的代码,改完之后要重新编译运行,当项目比较大的时候,编译和运行很浪费时间的,而且会产生一些意外,本来只要编译dao中的代码,现在不光要编译dao中的代码,还要编译service。因为你不用接口,间接着action里的代码也要改,因为action中引用了service中的类,到最后,就变成了,牵一发而动全身。
    为什么要写Imp实现类呢,是因为后期维护的时候如果要修改功能只需要修改实现类里面的那个代码,而不需要修改其他包的代码。

    展开全文
  • 对于BoardDaoCuisineDao的处理接口和实现类,除了定义自己的特有方法外,其他基本功能的CRUD方法都一样,只是操作的实体对象不一样。为了代码的复用,简化代码,我们可以将公共的CRUD方法提取到BaseDao中,只需要...

    紧接着上次无线点餐项目的文档,我们进行Dao层抽取。

    6.Dao接口以及实现类代码抽取

    对于BoardDaoCuisineDao的处理接口和实现类,除了定义自己的特有方法外,其他基本功能的CRUD方法都一样,只是操作的实体对象不一样。为了代码的复用,简化代码,我们可以将公共的CRUD方法提取到BaseDao中,只需要实现接口即可。

    同理不同的实现类,实现CRUD相同的业务逻辑的时除了操作的实体不同,其他都是相同的所以我们可以把相同的业务逻辑实现,抽取出来,放到BaseSericeImpl其他的业务逻辑实现继承BaseSericeImpl即可

    抽取原理图如下:

     

    6.1 BaseDao的代码为:

    /**

     * 通用BaseDao数据操作接口

     * 

     * @author Leo.Chen

     * 

     * @param <T>

     */

    public interface BaseDao<T> {

    /**

     * 保存一个对象

     * 

     * @param t

     */

    public void save(T t);

     

    /**

     * 删除一个对象

     * 

     * @param id

     */

    public void delete(int id);

     

    /**

     * 删除一个对象

     * 

     * @param t

     */

    public void update(T t);

     

    /**

     * 查询所有

     * 

     * @return

     */

    public List<T> queryAll();

    }

    6.2 BaseDaoImpl代码为:

    我们在没有使用框架Hibernate的情况下,使用JDBC技术来操作数据库时候需要自己手写SQL语句,因此为了避免dao代码的复杂性,不适用反射技术,因此我们只是把各个模块公共的代码抽取到BaseDaoImpl中,该类还是抽象的,让其子类具体再实现。

    因此通用的BaseServiceImpl实现类代码如下:

    /**

     * 通用Dao接口实现类

     * @author Leo.Chen

     * @param <T>

     */

    public abstract class BaseDaoImpl<T> implements BaseDao<T> {

    protected QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource());

    }

    6.3 BoardDao接口的代码为:

    /**

     * 餐桌管理持久化数据操作接口

     * @author Leo.Chen

     */

    public interface BoardDao extends BaseDao<Board> {

    }

    6.4 BoardDaoImpl实现类的代码为:

    public class BoardDaoImpl extends BaseDaoImpl<Board> implements BaseDao<Board>, BoardDao {

     

    @Override

    public void save(Board board) {

    // 建立sql语句

    String excuteSql = "insert into t_board(bName,isBook,bookTime) values (?,?,?)";

    // 封装参数

    Object[] param = { board.getbName(), board.getIsBook(), board.getBookTime() };

    try {

    // 执行sql语句

    runner.update(excuteSql, param);

    catch (SQLException e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

     

    @Override

    public void delete(int id) {

    String excuteSql = "delete from t_board where bid=?";

    try {

    runner.update(excuteSql, id);

    catch (SQLException e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

     

    @Override

    public void update(Board board) {

    String excuteSql = "update t_board b set b.bname=?, b.isBook=?, b.bookTime=? where b.bid=?";

    Object[] param = { board.getbName(), board.getIsBook(), board.getBookTime(), board.getBid()};

    try {

    runner.update(excuteSql, param);

    catch (SQLException e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

     

    @Override

    public List<Board> queryAll() {

    String sql = "select * from t_board";

    List<Board> resultList = null;

    try {

    resultList = runner.query(sql, new BeanListHandler<Board>(Board.class));

    catch (SQLException e) {

    e.printStackTrace();

    resultList = new ArrayList<Board>();

    }

    return resultList;

    }

    }

    6.5 CuisineDao接口的代码为:

    public interface CuisineDao extends BaseDao<Cuisine> {

    /**

     * 根据菜系名称模糊查询

     * @param cid

     * @return

     */

    public List<Cuisine> queryByName(String name);

    }

    6.6 CuisineDaoImpl实现类代码为:

    public class CuisineDaoImpl extends BaseDaoImpl<Cuisine> implements CuisineDao {

    @Override

    public void save(Cuisine cuisine) {

    try {

    String sql = "insert into t_cuisine (name) values(?)";

    runner.update(sql, cuisine.getName());

    catch (SQLException e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

     

    @Override

    public void delete(int id) {

    try {

    String sql = "delete from t_cuisine where cid=?";

    runner.update(sql, id);

    catch (SQLException e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

     

    @Override

    public void update(Cuisine cuisine) {

    try {

    String sql = "update t_cuisine c set c.name=? where c.cid=?";

    runner.update(sql, cuisine.getName(), cuisine.getCid());

    catch (SQLException e) {

    e.printStackTrace();

    throw new RuntimeException(e);

    }

    }

         @Override

    public List<Cuisine> queryAll() {

    String sql = "select * from t_cuisine";

    List<Cuisine> resultList = null;

    try {

    resultList = runner.query(sql, new BeanListHandler<Cuisine>(Cuisine.class));

    catch (SQLException e) {

    e.printStackTrace();

    resultList = new ArrayList<Cuisine>();

    }

    return resultList;

    }

     

     

    @Override

    public List<Cuisine> queryByName(String name) {

    List<Cuisine> resultList = null;

    try {

    String sql = "select * from t_cuisine where name like '%"+name+"%'";

    resultList = runner.query(sql, new BeanListHandler<Cuisine>(Cuisine.class));

    catch (SQLException e) {

    e.printStackTrace();

    resultList = new ArrayList<Cuisine>();

    }

    return resultList;

    }

    }

    7.餐桌和菜系的Service实现

    Service中同样的采取Dao中的抽取设计,将公共的Service方法抽取到BaseService中。在BaseService接口中抽取公共的调用DaoCRUD方法,其他接口只需要继承即可。

    Service的抽取原理图:

     

    7.1BaseService代码如下:

    /**

     * 通用Service接口

     * @author Leo.Chen

     * @param <T>

     */

    public interface BaseService<T> {

    /**

     * 保存对象

     * 

     * @param t

     */

    public void save(T t);

     

    /**

     * 删除对象

     * 

     * @param id

     */

    public void delete(int id);

     

    /**

     * 更新对象

     * 

     * @param t

     */

    public void update(T t);

     

    /**

     * 获取所有

     * 

     * @return

     */

    public List<T> queryAll();

    }

    7.2BaseServiceImpl代码如下:

    /**

     * 通用Service实现类

     * 

     * @author Leo.Chen

     * 

     * @param <T>

     */

    public abstract class BaseServiceImpl<T> implements BaseService<T> {

    /**

     * 将所有操作数据库的Dao对象在BaseServiceImpl中实例化,自身模块的Service只需要继承该类即可

     */

    protected BoardDao boardDao = BeanFactoryUtil.getInstance().createBean(BoardDao.class);

    protected CuisineDao cuisineDao = BeanFactoryUtil.getInstance().createBean(CuisineDao.class);

    }

    7.3餐桌Service实现

    BoardService接口代码如下:

    public interface BoardService extends BaseService<Board> {

    }

    BoardServiceImpl接口代码如下:

    public class BoardServiceImpl extends BaseServiceImpl<Board> implements

    BoardService {

     

    @Override

    public void save(Board t) {

    boardDao.save(t);

    }

     

    @Override

    public void delete(int id) {

    boardDao.delete(id);

    }

     

    @Override

    public void update(Board t) {

    boardDao.update(t);

    }

     

    @Override

    public List<Board> queryAll() {

    List<Board> boards = boardDao.queryAll();

    if (boards.size() != 0) {

    return boards;

    }

    return null;

    }

    }

    7.4菜系Service实现

    CuisineService接口代码如下:

    public interface CuisineService extends BaseService<Cuisine> {

    /**

     * 根据名称查询菜系

     * @param name

     * @return

     */

    public List<Cuisine> queryByName(String name);

    }

     

    CuisineServiceImpl实现类代码如下:

    public class CuisineServiceImpl extends BaseServiceImpl<Cuisine> implements CuisineService{

     

    @Override

    public void save(Cuisine t) {

    cuisineDao.save(t);

    }

     

    @Override

    public void delete(int id) {

    cuisineDao.delete(id);

    }

     

    @Override

    public void update(Cuisine t) {

    cuisineDao.update(t);

    }

     

    @Override

    public List<Cuisine> queryAll() {

    List<Cuisine> cuisines = cuisineDao.queryAll();

    if (cuisines.size() != 0) {

    return cuisines;

    }

    return null;

    }

     

    @Override

    public List<Cuisine> queryByName(String name) {

    List<Cuisine> cuisines = cuisineDao.queryByName(name);

    if (cuisines.size() != 0) {

    return cuisines;

    }

    return null;

    }

    }



    展开全文
  • Spring整合Mybatis笔记,鉴于网上的资料鱼龙混杂,查看到的部分资料甚至把我带进沟里了,特此自己动手记录笔记: 首先我们知道常规的Mybatis使用基础需要定义一个Mybatis配置文件,一个...对应的实体如下: pac...
  • MyBatis - DAO接口不需要实现类分析

    千次阅读 2018-11-26 14:56:36
    相信大家在刚开始学习mybatis注解方式,或者spring+mybatis注解方式的时候,一定会有一个疑问,为什么mybatis的dao接口只需要一个接口,不需要实现类,就可以正常使用,笔者最开始的时候也会有这种疑问,当时在网上...
  • Dao层接口实现优化

    千次阅读 2018-09-27 16:16:49
    Dao层接口实现优化(针对CRUD) 如果一个项目中有多个实体类(domian包下面有多个类,例如学生,老师,用户,部门等),那么对应的dao下面也会有多个对应的接口多个实现类。考虑如何优化抽取dao层对应的接口和实现...
  • 另外还要明白的是一个调用关系,service→dao→数据库访问,实际上我们所要的业务功能是在service中实现的,但是如果不通过dao,直接进行一个业务功能的实现类的编写,我们的service功能就数据
  • Dao实现类

    2012-12-20 11:28:56
    定义一个DAo接口类,z再建一个IMPL实现类,实现接口类的所有方法
  • 基于springdata JPA的dao层接口实现

    千次阅读 2019-07-07 16:35:48
    基于springdata JPA的dao层接口实现以及分页 1、【举例】 只需要继承 JpaRepository<实体,主键类型> package com.tmall.tmallspringboot.dao; import com.tmall.tmallspringboot.pojo.Category; import ...
  • 参考mybatis入门基础(二)----原始dao的开发mapper代理开发 ...其实也就是通过接口名与mapper的id绑定在一起,通过SQL去写实现类,返回数据。 转载于:https://www.cnblogs.com/yncx/p/7680990.html...
  • 配置文件spring.xml <!-- spring的核心配置 --> ...-- 加载连接池配置数据 --> ...-- 自动生成dao层实现 --> ...spring+mybatis使用...这样抛弃Dao实现类的写法: 具有更好的可扩展性,提高了灵活度。
  • 结论:@Service注解是标注在实现类上的,因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。(@Repository 同理可得)...
  • 团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层实现类,所以,习惯性的还是写了个实现类。于是遇到错误了。 找不到那个方法。问...
  • springboot中springjdbcpringdata操作数据最主要的差别在dao层。其他的几乎没变。 步骤一:导入springboot的依赖数据库连接的依赖: <!-- mvc,aop的依赖包。SpringBoot导进来的所有包都是通过这个依赖导进来...
  • 如果我的接口是这样定义public interface UserModelDao extends PagingAndSortingRepository, String>, JpaSpecificationExecutor<UserModel>{} ,那么如果我想添加实现类来拓展方法等的话,会出现有很多继承接口中...
  • Java之JDBC连接数据库实现增删改查(2018 使用Dao层实现) 实体:User.java 接口类:IUserDao.java 实现接口类:UserDaoImpl.java 使用Junit4测试增删改查:UserDaoTest.java
  • 步骤一:导入springboot的依赖数据库连接的依赖: <!-- mvc,aop的依赖包。SpringBoot导进来的所有包都是通过这个依赖导进来的,体现maven的依赖性 --> <dependency> <groupId>org.spring...
  • DAO层接口,为什么能操作数据库

    万次阅读 多人点赞 2018-11-09 20:14:22
    public interface TestDAO { Test selectById(Integer id); } 一、问题:  如上代码所示,为什么调用TestMapper的selectById... 接口当然是不能直接调用方法的,那么接口实现类呢?应该是mybatis框架,自动...
  • 然后我们需要有个dao层接口,并使用spring的注解@Repository(高版本好像注解都不需要了) @Repository public class UserDao { User getUser(String userId); } 这样我们就可以使用mybatis了,但是一方面我们会乐...
  • 数据dao):封装了对数据库的访问细节,数据操作; 注意三的关系:web依赖业务,业务依赖数据 二、不说多少,直接上代码,注意我标了一些注意点,是我容易犯错的地方,大家也要多注意。 连接数据库 ...
  • 关于Dao层和service层的接口问题

    千次阅读 2018-03-19 01:20:05
    而我们的service中业务实现类和接口在绝大多数的业务场景中都是一一对应的,没有接口是有多个公共实现类的,那么我们的接口设计有什么意义呢?我现在只能想到一下几个缺点:1. 维护繁琐。如果实现类的方法需要做...
  • 这次碰到这个问题费了... 我配置的是spring+springMVC+mybatis框架,开始也是借鉴别人的代码,看到人家dao层不用写实现类就能直接映射mapper里的方法,我也想试试,可是一直报错,org.springframework.beans.factory....
  • dao层书写具体实现类的时候会将dao层功能抽取到接口中,然后去实现该接口,实现具体方法,书写具体功能代码。 抽取如图:   但是这种抽取不是很友好,由图可以看出,每个实现类中都要书写共同的增删改查...
  • 浅谈对java框架设计中service层、dao层和service实现类作用的理解以及好处
  • Hibernate的dao接口实现类

    千次阅读 2016-06-04 21:49:32
    整体结构: 整体结构,Eclipse+jdk1.7+Hibernate3.6.0。...首先看看实体: 都是一些getset方法,实体对应的是数据库里面的一张表,字段要数据库的字段对应,名字可以不数据库里面的字段对应(要在映
  • 在学习框架中,很困惑为什么要用到接口感觉有点多余,于是查了一下 感觉这个老哥总结的非常到位 建议详细了解 详解!!!!
  • dao层动态代理实现demo

    2016-06-07 08:57:42
    spring+mybatis dao层使用动态代理实现org.mybatis.spring.mapper.MapperScannerConfigurer设置属性指定dao接口以及sqlSessionFactory 或SqlSessionTemplate

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,194
精华内容 43,677
关键字:

dao层接口和实现类