SpringBoot与Mybatis整合(3)

Service层的实现

(1)Service层的配置:
Service层的作用:整合复杂业务逻辑,如dao层的增删改查,service层即将这些增删改查整合到一起。

在config下创建service包,如:
在这里插入图片描述
而后,在其中创建事务管理配置类,如:

package com.example.mybatistest.config.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

import javax.sql.DataSource;

@Configuration
//Configuration在于告诉spring这是一个配置类
@EnableTransactionManagement
//EnableTransactionManagement表示开启事务管理
//使用EnableTransactionManagement后,需要继承接口TransactionManagementConfigurer,实现其中的annotationDrivenTransactionManager方法
public class TransactionManagementConfiguration implements TransactionManagementConfigurer {

    @Autowired
    private DataSource dataSource;
    //Transaction需要一个成员变量dataSource,需要有dataSource才能进行事务的控制
    //dataSource为我们之前在DataSourceConfiguration中配置的DataSource,注入即可

    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}

(2)Service层接口的实现:
创建service包,并在service包中创建对应接口,如:
在这里插入图片描述
然后,编写接口方法,基本与dao层保持一致,贴出代码如下:

package com.example.mybatistest.service;

import com.example.mybatistest.entity.User;

import java.util.List;

public interface UserService {
    /**
     * 获取用户列表
     * @return
     */
    List<User> getUserList();

    /**
     * 根据用户名获取用户信息
     * @param userName
     * @return
     */
    User getUserByName(String userName);

    /**
     * 添加用户信息
     * @param user
     * @return
     */
    boolean addUser(User user);

    /**
     * 修改用户信息
     * @param user
     * @return
     */
    boolean modifyUser(User user);

    /**
     * 删除用户信息
     * @param userName
     * @return
     */
    boolean deleteUser(String userName);
}

接着,在service包下创建impl包,并于其中编写接口的实现类,如:
在这里插入图片描述
此处贴出实现类代码:

package com.example.mybatistest.service.impl;

import com.example.mybatistest.dao.UserDao;
import com.example.mybatistest.entity.User;
import com.example.mybatistest.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

//通过Service注解告诉Spring这是一个Bean
@Service
public class UserServiceImpl implements UserService {
    //实现依赖于先前定义的Dao接口,因此加入先前定义的UserDao作为它的属性
    @Autowired
    private UserDao userDao;

    @Override
    public List<User> getUserList() {
        return userDao.queryUser();
    }

    @Override
    public User getUserByName(String userName) {
        return userDao.queryUserByName(userName);
    }

    //像增、删、查这类涉及的步骤复杂一些的,就需要用Transactional注解,用事务控制起来
    //像下列代码中的抛出异常,当异常被抛出时,事务就会回滚
    @Transactional
    @Override
    public boolean addUser(User user) {
        //业务逻辑尽量加在Service层里
        //判断空值,通过非空判断则进行插入操作
        if(user.getUsername() != null && !"".equals(user.getUsername())){
            //插入用户信息,成功返回true,失败直接抛出异常
            try {
                //effectedNum:影响的行数
                int effectedNum = userDao.insertUser(user);
                if(effectedNum > 0){
                    return true;
                } else{
                  throw new RuntimeException("插入用户信息失败");
                }
            }catch (Exception e){
                throw new RuntimeException("插入用户信息失败" + e.getMessage());
            }
        } else {//不通过非空判断直接抛出异常
            throw new RuntimeException("用户信息不能为空!");
        }
    }

    @Override
    public boolean modifyUser(User user) {
        //空值判断
        if (user.getUsername() != null && !"".equals(user.getUsername())){
            try {
                int effectNum = userDao.updateUser(user);
                if(effectNum > 0){
                    return true;
                }else{
                    throw new RuntimeException("更新用户信息失败!");
                }
            }catch (Exception e){
                throw new RuntimeException("更新用户信息失败:" + e.getMessage());
            }
        }else{
            throw new RuntimeException("用户信息不能为空!");
        }
    }

    @Override
    public boolean deleteUser(String userName) {
        if(userName != null && !"".equals(userName)){
            try {
                int effectNum = userDao.deleteUser(userName);
                if (effectNum > 0){
                    return true;
                }else{
                    throw new RuntimeException("删除用户信息失败!");
                }
            }catch (Exception e){
                throw new RuntimeException("删除用户信息失败:" + e.getMessage());
            }
        }else{
            throw new RuntimeException("用户名不能为空!");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值