目录
一、搭建springBoot项目
1、选择spring initializr项目(和上次搭建项目一样步骤)
2、将mybatis相关配置给勾选上
3、新项目就搭建完
二、MBG(mybatis generator)逆向工程
1、导入相关pom依赖
2、将Generator.properties和generatorConfig.xml文件导入到项目中
Generator.properties文件:
generatorConfig.xml文件:
3、MyBatisPlugin.class导入org.mybatis.generator.plugins(对应的软件包)下
4、将项目进行编译
5、将MyBatisPlugin.class文件赋到本地仓库的org对应版本的压缩下:
5.1先查看对应的jar包版本号是多少:
5.2找到本地仓库的org包下的1.3.7包
5.3点击压缩文件预览,将文件赋进去
5.4将文件赋到对应jar中已完成
5.5现在已经可以进行逆向生成代码
5.6逆向生成代码完成完毕
5.7配置mybaits配置文件
三、ssm项目开发
1、首先先写mapper以及mapper.xml层
2、其次写好service层:
3、最后写controller层:
4、添加事务
四、集成PageHelper
1、导入PageHelper依赖
2、在启动类上开启aop注解
3、导入分页和切面类:
4、修改对应的方法:
五、集成通用Mapper
1、目的:通用mapper目的就是节约时间。
2、步骤:
2.1导入pom依赖:
2.2、修改启动类的MapperScan
2.3、在实体类中加上表注明
2.4、mapper层继承通用mapper类
2.5、在测试类进行测试
一、搭建springBoot项目 1、选择spring initializr项目(和上次搭建项目一样步骤) 2、将mybatis相关配置给勾选上
因为整合要用到数据库,所以必须将数据库相关配置给勾选上,如mybatis 工厂以及mybatis驱动类。
3、新项目就搭建完 二、MBG(mybatis generator)逆向工程 1、导入相关pom依赖2、将Generator.properties和generatorConfig.xml文件导入到项目中org.mybatis.generator mybatis-generator-core1.3.7 org.mybatis.generator mybatis-generator-maven-plugin1.3.7 true true
Generator.properties文件:注意:两个文件都应放在resource下
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/stu?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=password jdbc.driverLocation=D:\SoftwareInstallPath\repository\mysql\mysql-connector-java.0.27\mysql-connector-java-8.0.27.jar model.package=com.yk.code.pojo mapper.package=com.yk.code.dao xml.mapper.package=mapper
注意:其中jdbc.driverLocation中的路径为本地maven仓库中的mysql jar包路径,这也是自己将该文件导入进来后要更改的地方
generatorConfig.xml文件:jdbc.driverLocation=D:\SoftwareInstallPath\repository\mysql\mysql-connector-java\8.0.27\mysql-connector-java-8.0.27.jar
这里需要注意的是:逆向生成表的结构
3、MyBatisPlugin.class导入org.mybatis.generator.plugins(对应的软件包)下
声明:这是一个生成规范文档注释,生成接口,注解的功能类
为什么将此文件导入到对应的软件包底下:因为到时候要将文件导入到本地仓库中的对应压缩包中去,目的是为了逆向生成代码,
当然还有一种方法就是导入插件,配置mybatis generator生成器
命名行:
mybatis-generator:generate -e
package org.mybatis.generator.plugins; import lombok.extern.slf4j.Slf4j; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.Plugin; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.dom.java.*; import java.time.LocalDateTime; import java.util.List; @Slf4j public class MyBatisPlugin extends PluginAdapter { @Override public boolean validate(Listlist) { return true; } @Override public boolean modelbaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { boolean hasLombok = Boolean.parseBoolean(getProperties().getProperty("hasLombok", "false")); log.warn("hasLombok:t" + hasLombok); if (hasLombok) { topLevelClass.addimportedType("lombok.Data"); topLevelClass.addimportedType("lombok.NoArgsConstructor"); topLevelClass.addimportedType("lombok.AllArgsConstructor"); topLevelClass.addimportedType("lombok.experimental.Accessors"); topLevelClass.addAnnotation("@Data"); topLevelClass.addAnnotation("@NoArgsConstructor"); topLevelClass.addAnnotation("@AllArgsConstructor"); topLevelClass.addAnnotation("@Accessors(chain = true)"); } topLevelClass.addJavaDocLine(""); return true; } @Override public boolean modelFieldGenerated(Field field, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { field.addJavaDocLine(""); return true; } @Override public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { interfaze.addimportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper")); interfaze.addAnnotation("@Mapper"); interfaze.addimportedType(new FullyQualifiedJavaType("org.springframework.stereotype.Repository")); interfaze.addAnnotation("@Repository"); interfaze.addJavaDocLine(""); return true; } @Override public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { boolean hasLombok = Boolean.parseBoolean(getProperties().getProperty("hasLombok", "false")); return !hasLombok; } @Override public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) { boolean hasLombok = Boolean.parseBoolean(getProperties().getProperty("hasLombok", "false")); return !hasLombok; } }
项目结构:
4、将项目进行编译编译成功:
5、将MyBatisPlugin.class文件赋到本地仓库的org对应版本的压缩下: 5.1先查看对应的jar包版本号是多少:org.mybatis.generator mybatis-generator-maven-plugin1.3.7 true true
版本号为1.3.7
5.2找到本地仓库的org包下的1.3.7包注意看路径:
5.3点击压缩文件预览,将文件赋进去 5.4将文件赋到对应jar中已完成 5.5现在已经可以进行逆向生成代码双击即可逆向生成代码了:
5.6逆向生成代码完成完毕修改对应生成路径在 Generator.properties
5.7配置mybaits配置文件application.yml文件:
server: port: 8080 spring: datasource: username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/stu?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true mybatis: mapper-locations: classpath*:mapper @Repository public interface StudentMapper extends Mapper{ List select(); Student selectOne(Student student); int add(Student student) ; int del(Student student) ; int upd(Student student) ; }
studentmapper.xml:
2、其次写好service层:insert into student(stu_name,stu_phone,stu_class,stu_address) values (#{stuName},#{stuPhone},#{stuClass},#{stuAddress}) update student set stu_name=#{stuName} where stu_id=#{stuId} delete from student where stu_id=#{stuId}
studentservice:
package com.yk.code.service; import com.yk.code.pojo.Student; import com.yk.code.util.PageBean; import java.util.List; public interface StudentService { ListselectPager(PageBean pageBean); Student selectOne(Student student); int add(Student student) ; int del(Student student) ; int upd(Student student) ; }
studentservice.impl:
package com.yk.code.service.impl; import com.yk.code.dao.StudentMapper; import com.yk.code.pojo.Student; import com.yk.code.service.StudentService; import com.yk.code.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class StudentServiceImpl implements StudentService { @Autowired private StudentMapper studentMapper; @Override @Transactional(rollbackFor = Exception.class) public List3、最后写controller层:selectPager(PageBean pageBean) { return studentMapper.select(); } @Override @Transactional(rollbackFor = Exception.class) public Student selectOne(Student student) { return studentMapper.selectOne(student); } @Override @Transactional(rollbackFor = Exception.class) public int add(Student student) { return studentMapper.add(student); } @Override @Transactional(rollbackFor = Exception.class) public int del(Student student) { return studentMapper.del(student); } @Override @Transactional(rollbackFor = Exception.class) public int upd(Student student) { return studentMapper.upd(student); } }
studentController:
package com.yk.code.controller; import com.yk.code.pojo.Student; import com.yk.code.service.StudentService; import com.yk.code.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.HttpServerErrorException; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/stu") public class StudentController { @Autowired StudentService studentService; @GetMapping public Object select(HttpServletRequest request){ PageBean pageBean=new PageBean(); pageBean.setRequest(request); return studentService.selectPager(pageBean); } @GetMapping("/{stuId}") public Object selectOne(@PathVariable Long stuId){ return studentService.selectOne(new Student().setStuId(stuId)); } @DeleteMapping("/{stuId}") public Object del(@PathVariable Long stuId){ return studentService.del(new Student().setStuId(stuId)); } @PostMapping public Object add(Student student){ return studentService.add(student); } @PutMapping public Object upd(Student student){ return studentService.upd(student); } }4、添加事务
@Override @Transactional(rollbackFor = Exception.class) public int del(Student student) { return studentMapper.del(student); }
但是今天要介绍一种别的说法,今天就用RESTful架构来进行 *** 作,下面是RESTful的官方文档
RESTful API 一种流行的 API 设计风格
以下就是上述五种发送请求的格式,
Get:查询
Delete: 删除
Put:增加
Post:更新
Patch:更新
关于RESTful架构上, 写法要特别注意:
四、集成PageHelper正确写法:
@GetMapping("/{stuId}") public Object selectOne(@PathVariable Long stuId){ return studentService.selectOne(new Student().setStuId(stuId)); }错误写法:
@GetMapping("/:stuId") public Object selectOne(@PathVariable Long stuId){ return studentService.selectOne(new Student().setStuId(stuId)); }特别要注意:千万不能将{}写成:
大部分查询数据出来之后都需要分页,所以集成一个PageHelper
1、导入PageHelper依赖org.springframework.boot spring-boot-starter-aop
2、在启动类上开启aop注解com.github.pagehelper pagehelper-spring-boot-starter1.2.10
3、导入分页和切面类:@EnableAspectJAutoProxy
aspect:
package com.yk.code.aspect; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.yk.code.util.PageBean; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Component @Aspect @Slf4j public class PageAspect { @Around(value = "execution(* *..*Service.*Pager(..))") public Object invoke(ProceedingJoinPoint point) throws Throwable { PageBean pageBean = null; for (Object e : point.getArgs()) { if (e instanceof PageBean) { pageBean = (PageBean) e; break; } } if (pageBean != null && pageBean.isPagination()) { PageHelper.startPage(pageBean.getPage(), pageBean.getRows()); } Object obj = point.proceed(point.getArgs()); if (obj != null) { if (obj instanceof Page) { Page page = (Page) obj; PageInfo pageInfo = new PageInfo(page); pageBean.setTotal(new Long(pageInfo.getTotal()).intValue()); return pageInfo.getList(); } } return obj; } }
PageBean:
package com.yk.code.util; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.servlet.http.HttpServletRequest; import java.util.Map; @Data @NoArgsConstructor @AllArgsConstructor public class PageBean { private int total; private int page = 1; private int rows = 5; private boolean pagination = true; private String url; private Map4、修改对应的方法:ms; public void setMs(Map ms) { this.ms = ms; } public int calcStartIndex() { return (page - 1) * rows; } public int calcMaxPage() { return total % rows == 0 ? total / rows : total / rows + 1; } public int nextPage() { return Math.min(page + 1, calcMaxPage()); } public int prevPage() { return Math.max(page - 1, 1); } public void setRequest(HttpServletRequest req) { setUrl(req.getRequestURL().toString()); setMs(req.getParameterMap()); String page = req.getParameter("page"); if (page == null) { setPage(1); } else { setPage(Integer.parseInt(page)); } String rows = req.getParameter("rows"); if (rows == null) { setRows(5); } else { setRows(Integer.parseInt(rows)); } String pagination = req.getParameter("pagination"); if ("false".equals(pagination)) { setPagination(false); } } }
查看以下代码进行对应方法的修改:
@Around(value = "execution(* *..*Service.*Pager(..))") 以上方法是一个环绕通知,其中切面只切service的类,service中以pager结尾的方法所以查询方法要进行更改
service层:
ListselectPager(PageBean pageBean);
controller层:
@GetMapping public Object select(HttpServletRequest request){ PageBean pageBean=new PageBean(); pageBean.setRequest(request); return studentService.selectPager(pageBean); }
分页已经完成:五条数据
五、集成通用Mapper 1、目的:通用mapper目的就是节约时间。 2、步骤: 2.1导入pom依赖:tk.mybatis mapper-spring-boot-starter2.0.2
表注解pojo依赖:
2.2、修改启动类的MapperScanjavax.persistence persistence-api1.0 compile
@MapperScan("com.yk.code.dao")
2.3、在实体类中加上表注明注意导包 tk.mybatis.spring.annotation.MapperScan
@Table(name = "student")
2.4、mapper层继承通用mapper类@Table(name="tb_brand") 指定要映射的数据库中的哪个表
@Id 表示该成员变量是主键id
@GeneratedValue(strategy = GenerationType.IDENTITY) 标识该主键的策略,自增@Column(name = "name") 标识该成员变量跟数据库中的name字段映射
@Transient 不是表字段
2.5、在测试类进行测试public interface StudentMapper extends Mapper{ }
已查询出结果
这里需要注意的是,关于模糊查询的方法不同:
Example example=new Example(Student.class); Example.Criteria c1=example.createCriteria(); c1.andLike("stuName","%马%"); System.out.println(studentMapper.selectByExample(example));
姓马的名字全部查出
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)