springboot微信支付实战------第3章

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-----------分页插件-----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值