mapper
主要定义接口,不需要实现类(由厂商实现),接口上注解@ mapper
在接口中定义方法,注意考虑返回值
@Mapper public interface ClazzMapper { //插入数据 void insert(Clazz clazz); //查询所有信息 List<Clazz> findAll(); }
2.sql语句编写方案
1.使用mybatis生成xml文件(放在接口上生成),sql语句写在xml文件中
2.和sql语句(放在方法上生成)(根据操作情况编写)
3.注意sql语句,如果是查询一类的注意实体类属性名与数据库字段名的不一致(eg:实体类:createTime(小驼峰),在数据库字段名中则是(create_time)),因为查询一类的是映射关系,要进行修改
方法1:
起别名(写在sql语句中)
eg:select id, name, create_time as createTime, update_time as updateTime from dept
方法2:注解方式手动映射(写在sql语句上面)
@ Results(
{@ Result(column="字段名",property =”属性名“),。。。}
方法3:(与2相同,只不过写在xml文件中)
eg:
<!--方案二:字段名与实体类属性名不一致xml方式手动映射解决方案 <id>为主键字段映射 <result>为普通字段映射 <resultMap id="随意" type="com.itheima.pojo.Dept">返回值类型 <id column="id" property="id"/> <result column="name" property="name"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> </resultMap> <select id="findAll" resultMap="与id 值一致"> select * from dept </select>-->
方式4:在application.yml开启驼峰命名映射自动转换
map-underscore-to-camel-case:true(放在mybatis下面)
service
创建接口和实现类
接口中定义方法(service层处理数据的方法)
public interface ClazzService { void insert(Clazz clazz); List<Clazz> findAll(); }
实现类中
1.加入容器管理,使用注解@ service
2.引用mapper层的对象 @ Autowired
3.重写方法,实现逻辑
public interface ClazzService { void insert(Clazz clazz); List<Clazz> findAll(); } @Service public class ClazzServiceIml implements ClazzService { @Autowired private ClazzMapper clazzMapper; @Override public void insert(Clazz clazz) { clazzMapper.insert(clazz); } @Override public List<Clazz> findAll() { return clazzMapper.findAll(); } }
controller
创建实现类
1.添加注解
@RestController,加入容器(不加入容器,无法被扫描,就无法使用注入依赖的注解)
@RequestMapping("路径名") 如果是本机直接可以不写路径名,
此注解放在类上,象征着里面的方法都会使用到这个路径,eg:访问路径是:127.0.0.1/clazzs/lst,则@RestController(”/clazzs“) ;
方法上的注解 @GetMapping("/list"),根据请求的不同注解也不同
@ RequestBody 把请求体的json格式转换为java中的实体类的对象 eg:@RequestBody Clazz clazz 把请求体中的json格式转换为 Clazz类的clazz对象
@RequestBody
关注的是请求体本身。@RequestParam
用于获取 URL 中的查询参数。@PathVariable
用于获取 URL 路径中的变量。- 参数绑定:
@PathVariable("id")
中的名称需与路径中的变量名一致。
@RestController @RequestMapping("/api/users") public class UserController { // 处理GET请求:/api/users/123 @GetMapping("/{id}") public User getUserById(@PathVariable("id") Long userId)// 不一致写法 { return userService.getUser(userId); } // 处理PUT请求:/api/users/123/roles/admin @PutMapping("/{id}/roles/{role}") public User updateUserRole( @PathVariable Long id, //一致写法 @PathVariable String role ) { return userService.updateUserRole(id, role); } }
@RequestParam
示例
请求 URL:/hello?name=张三
控制器方法:
@GetMapping("/hello") public String sayHello(@RequestParam String name) { return "你好," + name; }
结果:返回 你好,张三
特性 |
|
|
参数位置 |
URL 查询字符串( ) |
URL 路径部分( ) |
典型场景 |
搜索、分页、筛选等可选参数 |
RESTful 资源标识(如 ID、名称) |
URL 示例 |
|
|
参数是否必传 |
默认必传(可设置 ) |
必传(路径中必须存在变量) |
代码可读性 |
参数多时代码冗长 |
路径更直观,符合 RESTful 风格 |
@RestController @RequestMapping("/clazzs") public class ClazzController { @Autowired private ClazzService clazzService; @PostMapping public Result insert(@RequestBody Clazz clazz){ try{ clazzService.insert(clazz); return Result.success(); } catch (Exception e){ e.printStackTrace(); return Result.error("添加班级失败,部门名称重复!"); } } @GetMapping("/list") public Result findAll(){ //查询信息是一一映射的关系,即是,子表段中的的数据按照子标段名称一一映射给实体类,因此名字要一致 List<Clazz> all = clazzService.findAll(); return Result.success(all); } }
2.注入依赖,定义service实现类的对象,调用方法
3.定义方法,一般使用Result返回值(Result自定义的实体类,调用,固定模板,用于封装信息)
@RequestBody与@ResponseBody
@RequestBody
:将 HTTP 请求体反序列化为 Java 对象。@ResponseBody
:将 Java 对象序列化为 HTTP 响应体。
特性 |
|
|
作用对象 |
HTTP 请求体 |
HTTP 响应体 |
数据流向 |
客户端 → 服务端 |
服务端 → 客户端 |
常用场景 |
接收 JSON/XML 参数(POST/PUT 请求) |
返回 JSON/XML 数据(RESTful API) |
核心依赖 |
消息转换器(如 Jackson) |
消息转换器(如 Jackson) |
常见异常 |
|
|
注解位置 |
方法参数 |
方法或类(如 ) |
使用与不使用@RequestParam
的区别
场景 |
使用 注解 |
不使用 注解 |
参数名与请求名一致 |
等价于不使用注解,均可获取参数 |
直接通过参数名匹配请求参数 |
参数名与请求名不一致 |
必须通过 指定映射(如 ) |
无法获取,会报参数不存在错误 |
设置默认值 |
支持(通过 ) |
不支持,参数缺失时会报 错误 |
控制必填性 |
支持(通过 ) |
默认为必填,参数缺失时报错 |