学习目标
MP高级应用
1.引入service CRUD接口IService->ServiceImpl
2.实现分页的方法
3.生成逆向工程的方法
MVC整体框架搭建
今日所学
更新项目目录
主要在于实现了service业务层的接口以及实现类
集合
单列集合Collection和双列集合Map
单列集合包括List和Set
List的实现:ArrayList Vector LinkedList
Set的实现:HashSet
可变参数
…表示可变参数,本质上就是数组
在Java中,可变参数(Varargs)是一种特殊的语法,允许方法接受可变数量的参数。本质上,可变参数在方法内部被当作数组来处理。通过可变参数,可以更灵活地定义方法,而无需提前确定参数的数量。
public class VarargsExample {
public static void printNumbers(int... numbers) {
for (int number : numbers) {
System.out.print(number + " ");
}
System.out.println();
}
public static void main(String[] args) {
printNumbers(1, 2, 3); // 可以传入任意数量的参数
printNumbers(4, 5, 6, 7, 8);
}
}
在上面的示例中,printNumbers
方法使用可变参数int... numbers
来接受一个或多个整数参数。在调用printNumbers
方法时,可以传入任意数量的整数参数,编译器会将这些参数封装成一个数组。
因此,虽然在方法定义中使用了可变参数的语法,但在方法内部,实际上是将传入的参数作为数组来处理的。这样,可变参数为我们提供了一种更加灵活和方便的方法参数传递方式。
datetime类型和date类型
在Java中,有两个主要的日期时间类型:java.util.Date
和java.time.LocalDateTime
。这两种类型在处理日期和时间方面有一些区别:
-
java.util.Date:
java.util.Date
是Java早期用于表示日期和时间的类,自JDK 1.0就存在。- 它表示特定的时间戳,精确到毫秒级别。
java.util.Date
类中的大多数方法已被标记为过时,因为它存在一些问题,例如不是线程安全的,不提供时区支持等。- 通常不建议在新代码中使用
java.util.Date
,而是推荐使用java.time
包中的新日期时间API。
-
java.time.LocalDateTime:
java.time.LocalDateTime
是Java 8引入的日期时间API的一部分,位于java.time
包中。- 它提供了更加全面和灵活的日期时间操作功能,包括更好的时区支持、不可变性、线程安全等特性。
LocalDateTime
表示日期和时间,但不包含时区信息。LocalDateTime
类提供了丰富的方法来处理日期和时间,例如日期加减、格式化、比较等。
在使用日期时间操作时,推荐优先选择java.time.LocalDateTime
,因为它提供了更好的设计和功能,同时解决了java.util.Date
存在的一些问题。如果需要考虑时区信息,还可以使用java.time.ZonedDateTime
或其他相关类。
MP引入Service业务层
MP封装Iservice接口,并在该接口中定义了大量的API
我们不直接使用Mapper,间接使用
在声明自定义接口的同时,并继承IService接口
相对于Mapper优势:增加了更多方法:saveOrUpdate(),list(),page()…
1.声明业务接口
public interface UserService extends IService<User> {
...
}
2.声明业务接口的实现类
@Service
@Transactional(rollbackFor = Throwable.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
...
}
3.操作的测试
@SpringBootTest(classes = MainApp.class)
@RunWith(SpringRunner.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testSave(){
User user = new User();
user.setName("杨瑞");
user.setPhone("155");
user.setPwd("123456");
boolean save = userService.save(user);
}
@Test
public void testSaveOrUpadate(){
// getById: 通过id(必须是主键)查询
// getOne: 当结果只有一条
// list: 当结果有多条
// User byId = userService.getById(1);
User byId = new User();
byId.setName("张学友");
boolean save = userService.saveOrUpdate(byId);
}
}
控制器对业务层的调用
1.在控制器中注入service
@RequestMapping("/user")
@Slf4j
@Api(value = "UserController",tags ="用户操作接口" )
@RestController
public class UserController {
/**
* 自动装配一个UserService对象
*/
@Autowired
private UserService userService;
}
2.在实体类中对json加强
/**
* 生成json时, 该字段会被忽略
*/
@JsonIgnore
@TableField("pwd")
private String pwd;
/**
*指定生成json时的时间格式和时区
*/
@TableField("reg_time")
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",timezone = "Asia/Shanghai")
private Date regTime;
3.在给前端返回中携带code和msg
public static R error(Integer code,String msg){
R r = new R();
r.setCode(code);
r.setMsg(msg);
return r;
}
public class BizException extends Exception{
private Integer code;
public Integer getCode(){
return code;
}
public BizException(ErrorCode errorCode){
super(errorCode.getMsg());
this.code = errorCode.getCode();
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BizException.class)
public R handlerBizException(BizException e){
return R.error(e.getCode(),e.getMessage());
}
/**
* 对所有异常进行统一的处理
* @return R
*/
@ExceptionHandler(Throwable.class)
public R handlerThrowable(){
return R.error("系统开小差了, 请稍后再试");
}
}
4.使用service完成业务操作
@GetMapping("/getById")
public R getById( Integer id) throws BizException {
User byId = userService.getById(id);
if(byId == null){
throw new BizException(ErrorCode.NULL_USER);
}
return R.success(byId);
}
拓展
Spring管理事务: 事务管理器
在Spring中,事务管理器(Transaction Manager)是用来管理事务的关键组件之一。事务管理器负责协调事务的开始、提交、回滚等操作,确保数据库操作的一致性和可靠性。
Spring框架提供了多种事务管理器实现,常用的包括:
-
PlatformTransactionManager:
PlatformTransactionManager
是Spring事务管理的核心接口,定义了事务管理的基本操作。- Spring提供了多个实现类,如
DataSourceTransactionManager
、JpaTransactionManager
、HibernateTransactionManager
等,用于不同数据访问技术的事务管理。
-
DataSourceTransactionManager:
DataSourceTransactionManager
是Spring JDBC事务管理器的实现,用于基于JDBC的事务管理。- 它通过
DataSource
来管理事务,适用于传统的JDBC数据访问。
-
JpaTransactionManager:
JpaTransactionManager
是Spring对JPA(Java Persistence API)事务管理的实现。- 它用于管理基于JPA的事务,与JPA的EntityManagerFactory集成,支持JPA的事务特性。
-
HibernateTransactionManager:
HibernateTransactionManager
是Spring对Hibernate事务管理的实现。- 它用于管理基于Hibernate的事务,与Hibernate的SessionFactory集成,支持Hibernate的事务特性。
通过配置事务管理器,可以在Spring应用中实现声明式事务管理,将事务管理从业务代码中解耦,提高代码的可维护性和可测试性。在配置中指定事务管理器后,Spring会自动为标记了@Transactional
注解的方法添加事务管理的功能。