JAVA基础-层级结构
最近开始学习JAVA,接触后端项目,发现跟iOS的区别挺大的,在这里记录一下
iOS谈到项目结构,无非就是MVC,再加上一些自定义的文件夹,管理类,资源类,三方类,拓展,公共UI、弹框等等,比较随意
JAVA这边接触下来,发现它的层级结构比较多,而且一环套着一环,要求比较高,这里的要求甚至对命名的要求都比较高
1、模型(PO)
JAVA中的模型可以直接将数据库的表结构通过工具网址进行转换,数据库字段里面的下划线转成驼峰命名,eg:user_id 转成 userId
模型名直接用表名+PO。eg:表名 user_login 转成class文件名 UserLoginPO
工具网址:https://java.bejson.com/generator/
注解:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "表名")
模型稍微好理解一点,就是看着不太习惯,iOS里面的模型基本上都是以Model结尾,也第一次接触注解这种玩意,难搞。
2、控制层(Controller)
这次跟iOS里面的控制器比较相像,可以简单理解为这层就是和客户端进行交互的,接口路径啥的都是定义在这里。
controller只和service交互。
注解:
@Slf4j
@Validated
@RestController
定义service对象
@Autowired private IUserTaskService userTaskService;
定义接口
// get接口 @RequestMapping(value = "/api/task/list", method = RequestMethod.GET) public ResultMsg<?> userTaskList(HttpServletRequest request) { return xxxx; } // post接口 @RequestMapping(value = "/login/qq/miniprogram", method = RequestMethod.POST) public Object login_qq_miniprogram(HttpServletRequest request, @RequestBody QQProgramUserInfo info) { }
3、接口层(service)
这里就是写接口的地方,只写接口返回类型和入参,提供方法给controller层调用,实现交由impl层实现
命名也是前面名字保持统一后面加上service
文件类型:interface
不用注解
4、接口实现层(impl)
命名:在接口文件名后面加上 impl
文件类型:class,implements service
快捷键生成对于方法:option+回车
@Service public class UserGoldCoinAccountServiceImpl implements UserGoldCoinAccountService
注解:
@Service @Resource private UserGoldCoinAccountDao userGoldCoinAccountDao;
5、Dao层
操作数据库的层级,跟Mapper通信,提供方法给impl调用
文件类型:class
注解:
@Repository
@Resource
private UserGoldCoinAccountMapper userGoldCoinAccountMapper;
eg:
@Repository public class UserGoldCoinAccountDao { @Resource private UserGoldCoinAccountMapper userGoldCoinAccountMapper; public UserGoldCoinAccountPo getUserGoldCoinAccountDao(String userId) { return userGoldCoinAccountMapper.selectUserGoldCoinAccountByUserId(userId); } public void updateUserGoldCoinAccountDao(UserGoldCoinAccountPo userGoldCoinAccountPo) { userGoldCoinAccountMapper.updateByPrimaryKeySelective(userGoldCoinAccountPo); } public void addUserGoldCoinAccountDao(UserGoldCoinAccountPo userGoldCoinAccountPo) { userGoldCoinAccountMapper.insertSelective(userGoldCoinAccountPo); } }
6、Mapper层
操作数据库的层级,绑定模型,只定义方法,实现交由同名的xml文件来实现
文件类型:interface 文件名Mapper extends Mapper<模型名>
一般都是返回查询的模型或者int值
注解:
@Component
eg:
@Component public interface UserGoldCoinAccountMapper extends Mapper<UserGoldCoinAccountPo> { UserGoldCoinAccountPo selectUserGoldCoinAccountByUserId(@Param("userId") String userId); }
7、xml层
直接创建File文件,文件名和Mapper名保持完全一致,最后加上文件后缀:.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="mapper文件路径">
<select id="selectUserGoldCoinAccountByUserId" resultType="返回模型文件路径">
select * from 表名 where user_id = #{userId} and status = 1 limit 1
</select>
</mapper>
总结:
controller 用 @Autowired 定义 service对象,自身用@Validated @RestController 修饰,--class
service的实现层impl 用 @Autowired 定义Dao对象,自身用 @Service修饰, --interface
dao 用 @Autowired 定义 Mapper对象,自身用@Repository修饰,---class
Mapper 自身用@Component修饰,并通过 extends Mapper<Model> 绑定模型,---interface
xml文件内直接写SQL