springBoot整合ssmp

springBoot整合ssmp

  1. lomBok(帮助实体类开发) 导入坐标,然后在实体类上加入注解@Data 自动帮你生成get set hasgcode tostring方法,但是没有生成有参构造

  2. 注意,在使用mybatis-plus的增加用户操作的时候有一个bug,他默认提供的每一次增加的id是它自己提供的,我们需要的是数据库的自增,所以会报错,我们需要在yml配置文件 声明 我们需要的id是自增加的

    报错信息

     Could not set property 'id' of 'class com.itheima.domain.Book' with value '1476761652270473217' Cause: java.lang.IllegalArgumentException: argument type mismatch

    yml文件

    //加在这里
    mybatis-plus:
      global-config:
        db-config:
          table-prefix: ssm_
          id-type: auto
    ​
  3. yml 配置文件 (用下面这组来获取sql执行的日志)

    configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

分页和搜索功能的测试

  1. 第一步 要先创建一个拦截器(格式是固定的)

    @Configuration
    public class PageConfig {
    ​
        //定义一个page拦截器 来帮助我们开发分页功能
    ​
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
             mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    ​
             return mybatisPlusInterceptor;
        }
    }
  2. mybatis-plus 永远的神! 什么都写好了

    @Test
    void page(){
       //分页
        IPage<Book> page = new Page<>(1,5);
        bookDao.selectPage(page,null);
        //打印一下数据
        //当前页
        System.out.println(page.getCurrent());
        //当前数据数量
        System.out.println(page.getSize());
        //总数居数量
        System.out.println(page.getRecords());
        //总页数
        System.out.println(page.getPages());
    }
    ​
    //搜索查询  通过name关键字来查询
    @Test
    void queryBooks(){
        String name = "开心";
        IPage<Book> page = new Page<>(1,5);
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
         //这里的(name==null)表示 判断是否name为null 如果为null 则后面的不加在sql语句limit后面,反之加
        lqw.like(!(name==null),Book::getName,name);
        //在用lqw查询到的情况下将数据分页,
        IPage<Book> pageList = bookDao.selectPage(page, lqw);
        System.out.println(pageList);
    }

Service层 的简便

  1. mybatis-plus 还帮我们将service都写好了

    • 第一步创建接口 并且实现 IService《你要实现的实体类》

      ​
      public interface IBookService extends IService<Book> {
    • 第二步 创建实现类

      @Service
      public class IBookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService {
      }

      什么都不用写,已经帮我们写好了增删改查的方法,只不过名字不一样删除变成了remove

    • 第三步 测试即可,

    • 如果我们想要增加新的功能 ,只要跟老样子在接口创建方法,实现类 实现就行,别重写他的方法就行

Controller

  1. 所有请求都用 GetMapping 修改用PutMapping 增加用 PostMappong 删除用deleteMapping

前后端的协议

  1. 我们将后面的数据统一格式,将他们都封装到一个R类下的data(Object类型)属性当中,前端就可以通风这个data来获取数据,同时我们设立一个flag, 如果我们查询成功就返回true ,出现异常返回false

    • 第一步:创建一个R类

      public class R {
      ​
          private boolean flag;
          private Object data;
    • 第二步:Controller 的写法

      @RestController
      @RequestMapping("/books")
      public class BookController {
          @Autowired
          private BookService bookService;
          //所有的请求用get 修改用put 增加用post 删除用delete
          @PostMapping
          public R addBook(@RequestBody Book book){
              R r = new R(bookService.save(book));
              return r;
          }
      ​
          @DeleteMapping("{id}")
          public R deleteBook(@PathVariable Integer id){
              R r = new R(bookService.deleteById(id));
              return  r;
          }
      ​
          @PutMapping()
          public R updateBook(@RequestBody Book book){
              R r = new R(bookService.update(book));
              return r;
          }
      ​
          @GetMapping
          public R getAll(){
              R r = new R();
              List<Book> books = bookService.queryAll();
              r.setData(books);
              r.setFlag(true);
              return r;
          }
      ​
          @GetMapping("{curentPage}/{size}")
          public R pages(@PathVariable int curentPage,@PathVariable int size){
              R r = new R();
              IPage<Book> page = bookService.curentPage(curentPage, size);
              r.setFlag(true);
              r.setData(page);
              return r;
          }

Vue

  1. 先导入vue。js vue框架的运作是 vue将视图和模型之间做了相互转换, 首先 用户在客户端输入数据,视图发生了改变,vue就将改变发送给模型,模型跟着改变,然后又将改变的数据给视图,视图又改变

        <title>vue</title>
    </head>
    <body>
    <div id="app">
         <input v-model="username">
          {{username}}  <!--这里打印出上面modle的值, 上面视图发生变化,跟着模型发生变化,又跟着视图变化-->
    </div>
    ​
      <script src="js/vue.js"></script>
    <script>
         new Vue({
             el:"#app",  /*用来规定你要操作的范围,这里的app就是id为app的div都会受到这个vue 的控制*/
             data(){
                 return {   /*返回*/
                     username:""
                 }
             }
         });
    </script>
    </body>
    </html>
  2. v-bind

    <div id="app">
        <input v-model="username">
        {{username}}  <!--这里打印出上面modle的值, 上面视图发生变化,跟着模型发生变化,又跟着视图变化-->
        <a v-bind:href="url">百度一下</a>
        <a :href="url">百度一下</a> <!--还可以写成这样-->
        <input v-model="url">  <!--我在这里的名字和url一样,那么我这个和url也形成了双向连接,我这里的值一遍url也要变-->
    </div>
    ​
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el:"#app",  /*用来规定你要操作的范围,这里的app就是id为app的div都会受到这个vue 的控制*/
            data(){
                return {   /*返回*/
                    username:"",  /*这个其实相当于 默认值,如果这里有值的化,上面和这个同名的就会有默认值*/
                    url:"https://www.baidu.com/"   /*给网址加上默认的*/
                }
            }
        });
  3. v-on 绑定一个事件

    <div id="app">
       <input type="button" value="我是一个按钮" v-on:click="show()">
       <input type="button" value="我是一个按钮" @click="show()"> <!--第二种写法-->
    ​
    </div>
    ​
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el:"#app",  /*用来规定你要操作的范围,这里的app就是id为app的div都会受到这个vue 的控制*/
             /*为方法加上一个单机事件*/
            methods:{
                show(){
                    confirm("我被点了啊!。。。")
                }
            }
        });
  4. v-if

    <div id="app">
          <!--控制显示的页面-->  
        <div v-if="count==3">div1</div>    <!--顾名思义当count=3才显示-->
        <div v-if="count==3">div2</div>
        <div v-if="count==4">div3</div>
        <div v-if="count==5">div4</div>
        <div v-show="count==4">v-show</div>  <!--这个特殊,效果跟上面一样,但是即使count不等于4 他会在源码理想显示代码,上面不会显示代码-->
        <!--控制count数量-->
        <input v-model="count">
    ​
    </div>
    ​
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el:"#app",
            data:{
                count:"3"
            }
        });
    </script>

    表示分界线​
  5. v-for 循环

    <div id="app">
    ​
       <div v-for="addr in addrs">  <!--遍历数组-->
               {{addr}}
       </div>
    ​
        <hr>
        <div v-for="(addr,i) in addrs">  <!--遍历数组-->
            {{i+1}}---{{addr}}  <!--i表示数组的下标从0开始-->  <!--我们可以用i来表示序号,将他加个1-->
        </div>
    </div>
    ​
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el:"#app",
            data:{
                addrs:["重庆","北京","上海","武汉"]   /*定义一个数组*/
            }
        });
    </script>
上一篇:Centos7.7安装vncserver虚拟网络控制台


下一篇:笔记——whatis命令(1)