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("用户名不能为空!");
}
}
}