1.加入mybatis的依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
数据源的选择。
2.加入配置文件:
#可以自动识别
#spring.datasource.driver-class-name =com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8
spring.datasource.username =root
spring.datasource.password =password
#如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource)
spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
3、启动类增加mapper扫描 ,这个是在主类里面加进去的。
@MapperScan("net.xdclass.xdvideo.mapper")//这个是mybatis的注解在主类里面配置
@Select("SELECT * FROM video")
@Results({
@Result(column = "create_time",property = "createTime") //javaType = java.util.Date.class
})
List<Video> getAll();
具体:
1)主配置类加注解
package net.xdclass.xdvideo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("net.xdclass.xdvideo.mapper")
public class XdvideoApplication {
public static void main(String[] args) {
SpringApplication.run(XdvideoApplication.class, args);
}
}
2)在mapper文件夹下写sql
/**
* video数据访问层
*/
public interface VideoMapper {
@Select("SELECT * FROM video")
List<Video> getAll();
}
流程讲解:
1.加mapper,扫描形成对象
2.注入
其他的模式:
开发mapper
参考语法 http://www.mybatis.org/mybatis-3/zh/java-api.html
xml配置:http://www.mybatis.org/mybatis-3/zh/configuration.html
----------------------01--------------------mybatis--------------------
可以进行json格式化访问的网站:https://www.json.cn/
关于数据的映射:是不是驼峰形式的。
解决办法1:
public interface VideoMapper {
@Select("SELECT * FROM video")
@Results({
@Result(column = "cover_img",property = "coverImg")
})
List<Video> getAll();
}
解决办法2:
#mybatis.configuration.mapUnderscoreToCamelCase=true
---
其他的video的crud的mapp接口
写Service和ServiceImpl。
写controller。
---
知识点:增加打印sql的语句。
#增加打印sql语句,一般用于本地开发测试
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
打印:
---
知识点:保存的时候自增ID Insert
@Insert("INSERT INTO `video` ( `title`, `summary`, " +
"`cover_img`, `view_num`, `price`, `create_time`," +
" `online`, `point`)" +
"VALUES" +
"(#{title}, #{summary}, #{coverImg}, #{viewNum}, #{price},#{createTime}" +
",#{online},#{point});")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
int save(Video video);
拿到自增的ID是很重要的。
----------------------02--------------------crud-------------------------
接口规范:
注意一点:
最好写为小写字母加下划线的。
1、save接口保存对象
1)@RequestParam(value = "page", defaultValue)int videoId
可以设置默认值,比如分页
2)@RequestBody 请求体映射实体类
需要指定http头为 content-type为application/json charset=utf-8
注意前后端分离我们要这么选择的:
form是表单提交的。
raw是前后端分离的我们用的是JSON。
代码综合:
package net.xdclass.xdvideo.controller;
import net.xdclass.xdvideo.domain.Video;
import net.xdclass.xdvideo.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/")
public class VideoController {
@Autowired
private VideoService videoService;
/**
* 当前的页数默认是第一页 每页显示几条
* @param page
* @param size
* @return
*/
@GetMapping("page")
public Object pageVideo(@RequestParam(value="page",defaultValue = "1")int page,
@RequestParam(value="size",defaultValue = "10")int size){
return videoService.getAll();
}
/**
* 根据Id找视频
* @param videoId
* @return
*/
@GetMapping("find_by_id")
public Object findById(@RequestParam(value="video_id",required = true) int videoId){
return videoService.findById(videoId);
}
/**
* 根据Id删除视频
* 参数必须是videoId
* @param videoId
* @return
*/
@DeleteMapping("delete_by_id")
public Object deleteById(@RequestParam(value="video_id",required = true) int videoId){
return videoService.delete(videoId);
}
/**
* 根据Id更新视频
* @return
*/
@PutMapping("update_by_id")
public Object deleteById(@RequestBody Video video){
return videoService.update(video);
}
/**
* 保存视频对象
* @param
* @return
*/
@PostMapping("save")
public Object save(@RequestBody Video video){
return videoService.save(video);
}
}
删除 update是管理员才可以做的我们要抽出去的。
新建哥管理员的Controller
-------------------------03--------------完善crud接口协议--------
有些属性没有传过来怎么办?
1、
@UpdateProvider(type=VideoSqlProvider.class,method="updateVideo") 更新
@InsertProvider 插入
@DeleteProvider 删除
@SelectProvider 查询
2、写法
public String updateVideo(final Video video){
return new SQL(){{
UPDATE("video");
//条件写法.
if(video.getAuthorId()!= null){
SET("author_id=#{authorId}");
}
if(video.getTotalEpisode()!= null){
SET("total_episode=#{totalEpisode}");
}
WHERE("id=#{id}");
}}.toString();
}
3、参考资料
https://www.cnblogs.com/zhangminghui/p/4903351.html
-------------------
新的知识点如何写动态的sql:
1.新建一个类:
public String updateVideo(final Video video){
return new SQL(){{
UPDATE("video");
//条件写法.
if(video.getTitle()!= null){
SET("title=#{authorId}");
}
if(video.getSummary()!= null){
SET("summary=#{summary}");
}
if(video.getCoverImg()!= null){
SET("cover_img=#{coverImg}");
}
if(video.getViewNum()!= null){
SET("view_num=#{viewNum}");
}
if(video.getPrice()!= null){
SET("price=#{price}");
}
if(video.getOnline()!= null){
SET("online=#{online}");
}
if(video.getPoint()!= null){
SET("point=#{point}");
}
WHERE("id=#{id}");
}}.toString();
}
2.如何用?
@UpdateProvider(type=VideoProvider.class,method="updateVideo")
int update(Video Video);
参考:
参考网站:https://www.cnblogs.com/zhangminghui/p/4903351.html
-----------------------------04---------动态sql--------------------------
PageHelper:
分页的sql:
如何使用:
1.引入我们的分页插件依赖:
<!-- 分页插件依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
2.增加配置文件
/**
* mybatis分页的插件配置
* Configuration
*Bean扫描为Bean 优先用pageHelper
*/
@Configuration
public class MyBatisConfig {
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
//设置为true的时候,会将RowBounds第一个参数的offSet当成pageNum的页码使用
p.setProperty("offsetAsPageNum","true");
//设置为true的时候,使用RowRounds分页进行count查询
p.setProperty("rowBoundsWithCount","true");
p.setProperty("reasonable","true");
pageHelper.setProperties(p);
return pageHelper;
}
}
3.包装类
PageHelper.startPage(page, size);
PageInfo<VideoOrder> pageInfo = new PageInfo<>(list);
@GetMapping("page")
public Object pageVideo(@RequestParam(value="page",defaultValue = "1")int page,
@RequestParam(value="size",defaultValue = "10")int size){
PageHelper.startPage(page,size);
return videoService.getAll();
}
查询:
controller的终极写法:
@GetMapping("page")
public Object pageVideo(@RequestParam(value="page",defaultValue = "1")int page,
@RequestParam(value="size",defaultValue = "10")int size){
PageHelper.startPage(page,size);
List<Video> list = videoService.getAll();
PageInfo<Video> pageInfo = new PageInfo<>(list);
Map<String,Object> data = new HashMap<>();
data.put("total_size",pageInfo.getTotal());//总条数
data.put("total_page",pageInfo.getPages());//总页数
data.put("current_page",page);//当前页
data.put("data",pageInfo.getList());//数据
return data;
}
为什么这么神奇?
原理:
-----------------------------05-----------分页插件-----------------------