param nameSSM项⽬总结
项⽬总结
前⾔
最近这半年,学习了SSM框架,做了⼤⼤⼩⼩⼏个模拟项⽬和两个商业项⽬。从什么都不会,到可以做⼀个具有主要功能的管理系统,再到接触商业项⽬,感觉⾃⼰对项⽬流程和业务逻辑的理解以及对SSM框架的使⽤有了显著的进步,以下是这段时间做项⽬时的收获、遇到的问题、解决⽅案和技术点的总结。
模拟项⽬
在初学如何做项⽬的时候,⾸先⾃⼰先做的是⼀些模拟项⽬,例如学⽣管理系统、酒店管理系统、毕设管理系统等。
初学SSM框架
entity层(model层、domain层)
⽤来放我们的实体类,每个实体类的类名以及属性要和数据库中表名和字段要⼀⼀对应。例如user表的实体类就是User,User实体类的属性和user表的字段⼀⼀对应。
public class User {
private Integer id;
private Integer username;
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
public Integer getUsername(){
return username;
}
public void setUsername(Integer username){
this.username = username;
}
}
mapper层(dao层)
⽂件名格式为xxxMapper,每个接⼝中的⽅法要和mybatis中l中定义的sql⼀⼀对应
service层
⽂件名格式为xxxService,其实现层格式为xxxServiceImpl,Service类封装要在controller层中调⽤的⽅法,ServiceImpl类实现这些⽅法
controller层
⽂件名格式为xxxController,通过调⽤Service层中的接⼝控制业务流程,需要通过使⽤前台传回来的参数来调⽤相应的接⼝,并将该调⽤接⼝获得的结果按照⼀定的形式传回前台,完成业务逻辑控制。
mybatis映射⽂件
⽂件名格式为l或l。
定义resultMap,type为实体类对象,其中的result每个代表该实体类对象的⼀个属性,即数据库中表的⼀个字段。
<resultMap id="BaseResultMap"type="ity.User">
<result column="id"jdbcType="INTEGER"property="id"/>
<result column="user_name"jdbcType="VARCHAR"property="userName"/>
<result column="pass_word"jdbcType="VARCHAR"property="passWord"/>
</resultMap>
定义sql语句,包括增删改查等,parameterType为传⼊的参数类型,resultMap或resultType为返回的
结果类型,resultMap返回的是java对象,resultType返回的是指定的类型,如java.lang.Long、java.lang.String等
<select id="studentLogin"resultMap="BaseResultMap"parameterType="ity.Student">
SELECT *
FROM student
WHERE userName = #{userName}
AND password = md5(#{password});
</select>
Layui框架
由于在做模拟项⽬的时候没有学习过vue,只学习过html,所以前端页⾯使⽤的是layui框架。
通过ajax,调⽤后台的接⼝。
elem: '#test'
, url: '/student/selectStudentByTeacherid'
, toolbar: '#toolbarDemo' //开启头部⼯具栏,并为其绑定左侧模板
, defaultToolbar: ['filter', 'exports', 'print', { //⾃定义头部⼯具栏右侧图标。如⽆需⾃定义,去除该参数即可
title: '提⽰'
, layEvent: 'LAYTABLE_TIPS'
, icon: 'layui-icon-tips'
}]
, title: '⽤户数据表'
, cols: [
[
{type: 'checkbox', fixed: 'left'}
, {field: 'id', title: 'ID', width: 80, fixed: 'left', unresize: true, sort: true}
, {field: 'userName', title: '⽤户名'}
, {field: 'password', title: '密码'}
,
{field: 'teacherid', title: '教师id', hide: true}
, {field: 'nickName', title: '昵称'}
, {fixed: 'right', title: '操作', toolbar: '#barDemo'}
]
]
, page: true
});
项⽬地址
总结
通过⼤⼤⼩⼩的⼏个模拟项⽬,了解到了整个项⽬的开发流程以及⼀些基础功能是如何实现的,为我之后做业务逻辑更复杂、指标更严格的商业项⽬打下了⼀定的基础。
XX应急平台和XX药学院
这两个项⽬是我接触到的商业项⽬,在XX应急平台这个项⽬中主要负责后端接⼝的开发,在XX药学院这个项⽬中负责前端页⾯和后端接⼝同步开发。
技术点
Lambok
在实体类上加上@Data和@Builder注解。
@Data:可以简化实体类,加上这个注解就相当于实体类加上了getter/setter⽅法。
@Builder:便于初始化对象,将类转变为建造者模式。
@Builder
@Data
public class VedioFile {
private Long id;
private Long vedioId;
private Long fileId;
private String vedioFile;
private int sort;
private LocalDateTime createTime;
}
Mybatis-Plus
快速⽣成entity层、mapper层、service层、controller层和mapper映射⽂件。
在⽣成的mapper层和service层的接⼝中,继承mybatis-plus⾃带的接⼝。
mapper层接⼝继承了BaseMapper接⼝。
service层接⼝继承IService接⼝,IService接⼝封装了BaseMapper接⼝。
在BaseMapper接⼝中有许多CRUD相关的⽅法,可以直接调⽤。
【添加数据:(增)】
int insert(T entity); // 插⼊⼀条记录
注:
T 表⽰任意实体类型
entity 表⽰实体对象
【删除数据:(删)】
int deleteById(Serializable id); // 根据主键 ID 删除
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根据 map 定义字段的条件删除
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); // 根据实体类定义的条件删除对象
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进⾏批量删除
注:
id 表⽰主键 ID
columnMap 表⽰表字段的 map 对象
wrapper 表⽰实体对象封装操作类,可以为 null。
idList 表⽰主键 ID 集合(列表、数组),不能为 null 或 empty
【修改数据:(改)】
int updateById(@Param(Constants.ENTITY) T entity); // 根据 ID 修改实体对象。
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); // 根据 updateWrapper 条件修改实体对象
注:
update 中的 entity 为 set 条件,可以为 null。
updateWrapper 表⽰实体对象封装操作类(可以为 null,⾥⾯的 entity ⽤于⽣成 where 语句)
【查询数据:(查)】
T selectById(Serializable id); // 根据主键 ID 查询数据
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 进⾏批量查询
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根据表字段条件查询
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 根据实体类封装对象查询⼀条记录
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询记录的总条数
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 entity 集合)
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 map 集合)
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(但只保存第⼀个字段的值)
<E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 entity 集合),分页 <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查询所有记录(返回 map 集合),分页
注:
queryWrapper 表⽰实体对象封装操作类(可以为 null)
page 表⽰分页查询条件
实体类注释
@TableName:⽤来指定数据库表名和JavaBean映射关系。
@TableId:指定该属性为数据库表中的主键。
@TableField:指定该属性为数据库表中的⾮主键。
@Data
@TableName("ref_vedio_file")
public class VedioFile {
@TableId(type = IdType.AUTO)
private Long id;
IPage
private Long vedioId;
private Long fileId;
private String vedioFile;
private int sort;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
}
条件构造器
可以使⽤queryWrapper、updateWrapper 等构造器来构造条件,返回相应的数据,⽤于查询相关的接⼝。
/**
* 查询列表
*
* @param currentPage
* @param pageSize
* @param vedio
* @return
*/
@Log(value ="查询列表", businessType = BusinessType.LIST)
@PreAuthorize("hasAuthority('/vedio')")
@ApiImplicitParams({@ApiImplicitParam(name ="Authorization", value ="Authorization token", required =true, dataType ="string", paramType ="head er")})
@PostMapping("/list/{currentPage}/{pageSize}")
public ResultJson index(@ApiParam(name="currentPage",value="页数",required=true)@PathVariable Integer currentPage,@ApiParam(name="pageSi ze",value="每页数量",required=true)@PathVariable Integer pageSize,@RequestBody Vedio vedio){
QueryWrapper<Vedio> queryWrapper =new QueryWrapper<>();
if(StringUtils.VedioIntro())){
queryWrapper.like("vedio_intro", VedioIntro());
}
if(StringUtils.VedioCover())){
queryWrapper.like("vedio_cover", VedioCover());
}
if(StringUtils.Operator())){
queryWrapper.like("operator", Operator());
}
Type()!=null){
queryWrapper.eq("type",Type());
}
ClassificationId()!=null){
queryWrapper.eq("type",ClassificationId());
}
IPage<Vedio> pageList = vedioService.page(new Page<>(currentPage, pageSize), queryWrapper);
return ResultJson.ok(pageList);
}
分页
使⽤IPage和Page来进⾏分页,mapper层和service层的⽅法加上Page参数,返回参数类型为IPage,泛型为对应的实体类。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论