乐趣区

关于mybatis:Spring-Boot-整合-Spring-MVC的基本步骤

Spring Boot 整合 Spring MVC 过程

关系图:




这种关系图的程序代码的书写代码的程序是从左边往左边写!
要了解 Spring MVC 的操作了解:
做这些用到了 mybatis 的整合,这样简化了 jdbc 连贯数据库的操作
上面是书写的代码:
— Application.properties

close banner

spring.main.banner-mode=off

Spring DateSource

spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

spring mybatis

mybatis.mapper-locations=classpath:/mapper/goods/GoodsMapper.xml

spring log

logging.level.com.cy=debug

server

server.port=80
server.servlet.context-path=/binbin

spring thymleaf

spring.thymeleaf.prefix=classpath:/templates/pages/
spring.thymeleaf.suffix=.html
spring.thymeleaf.cache=false
–GoodsMapper.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE mapper
PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”
“http://mybatis.org/dtd/mybatis-3-mapper.dtd”>
<mapper namespace=”com.cy.pj.goods.dao.GoodsDao”>
<delete id=”deleteObjects”>

   delete from tb_goods
   where id in <!-- (1,2,3,4,5) -->
   <foreach collection="ids"
            open="("
            close=")"
            separator=","
            item="id">
           #{id}
   </foreach>

</delete>
</mapper>
Goods.java
package com.cy.pj.goods.pojo;

import java.util.Date;

public class Goods {

 private Long id;//id bigint primary key auto_increment
 private String name;//name varchar(100) not null
 private String remark;//remark text
 private Date createdTime;//createdTime datetime
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getRemark() {return remark;}
public void setRemark(String remark) {this.remark = remark;}
public Date getCreatedTime() {return createdTime;}
public void setCreatedTime(Date createdTime) {this.createdTime = createdTime;}
@Override
public String toString() {return "Goods [id=" + id + ", name=" + name + ", remark=" + remark + ", createdTime=" + createdTime + "]";
}
 

}
GoodsDao(interface)
package com.cy.pj.goods.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
/*

  • @Mapper 用于形容(做标记)数据层拜访接口,用于通知 mybatis 框架,
    应用此注解形容的接口为底层创立实现类,在实现类中基于 mybatis API 实现与数据库的交互
    这个类的对象最初 交给 spring 来治理
    */

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.cy.pj.goods.pojo.Goods;

@Mapper
public interface GoodsDao {

@Select("select * from tb_goods")
List<Goods>findGoods();
/**
 *     基于 id 执行商品信息的删除,在 mybatis 中如果 sql 映射比较简单
 *     能够间接以注解办法进行定义
 * @param id
 * @return
 */
/**
 * 基于 id 去查找商品信息
 * @param id
 * @return
 */
@Select("select * from tb_goods where id=#{id}")
Goods findById(Integer id);
@Update("update tb_goods set name=#{name},remark=#{remark} where id=#{id}")
int UpdateGoods(Goods goods);
@Delete("delete from tb_goods where id=#{id}")
int deleteById(Integer id);
/**
 *         基于多个 id 执行商品删除业务操作
 *         ids 可变参数,用于承受传入的商品 id 值
 */
int deleteObjects(@Param("ids")Integer...ids);
@Insert("insert into tb_goods(name,remark,createdTime) values (#{name},#{remark},now())" )

int insertGoods(Goods goods);

}

GoodsService(interface)
package com.cy.pj.goods.service;

import java.util.List;

import com.cy.pj.goods.pojo.Goods;

/**

  • 商品模块的业务层接口,负责具体业务规范定义
  • @author Bin and Legend

*
*/
public interface GoodsService {

        Goods findById(Integer id);
        List<Goods>findGoods();
        int deleteById(Integer id);
        int saveGoods(Goods goods);    
        int UpdateGoods(Goods goods);

}
GoodsServiceImpl
package com.cy.pj.goods.service.impl;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**

  • 业务层对象,后续会在此对象中执行
  • 1)外围业务(例如:点击购买商品信息,要生成点单项信息,扣减库存 …)
  • 2)扩大业务 (例如:事务管制,权限管制,日志记录)

*/
import org.springframework.stereotype.Service;

import com.cy.pj.goods.dao.GoodsDao;
import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;

//@Deprecated

@Service// 是一个非凡的 @Component 也能够用 @Component
public class GoodsServiceImpl implements GoodsService{


private static final Logger log = LoggerFactory.getLogger(GoodsServiceImpl.class);

@Autowired
private GoodsDao goodsdao;
@Override
public List<Goods> findGoods() {return goodsdao.findGoods();
}

@Override
public int saveGoods(Goods goods) {
    // TODO Auto-generated method stub
    goods.setCreatedTime(new Date());
    return goodsdao.insertGoods(goods);
}
@Override
public int deleteById(Integer id) {long t1 = System.currentTimeMillis();
        int rows = goodsdao.deleteById(id);
        long t2 = System.currentTimeMillis();
        log.info("deleteById execute time : {}",(t2-t1));
        System.out.println(log.getClass().getName());
    return rows;
}
@Override
public Goods findById(Integer id) {return goodsdao.findById(id);
}
    
@Override
public int UpdateGoods(Goods goods) {
    // TODO Auto-generated method stub
    return goodsdao.UpdateGoods(goods);
}

}
GoodsController
/**

*/
package com.cy.pj.goods.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;

/**

  • @author Bin and Legend

*
*/
@Controller
@RequestMapping(“/goods/”)
public class GoodsController {

//http://localhost/goods/doDeleteById?id=12
@Autowired
private  GoodsService goodsService;
// 执行删除操作
@RequestMapping("doDeleteById/{id}")
public String doDeleteById(@PathVariable Integer id) {goodsService.deleteById(id);    
    return "redirect:/goods/doGoodsUI";
}

@RequestMapping("doGoodsAddUI")
public String doGoodsAddUI() {return "goods-add";}
@RequestMapping("doGoodsUI")
public String doGoodsUI(Model model) {List<Goods> list = goodsService.findGoods();
    model.addAttribute("goods", list);
    return "goods";//view name
}
@RequestMapping("doSaveGoods")
public String doSaveGoods(Goods goods){goodsService.saveGoods(goods);
    return "redirect:/goods/doGoodsUI" ;
}
@RequestMapping("doUpdateGoods")
public String doUpdateGoods(Goods goods){goodsService.UpdateGoods(goods);
    return "redirect:/goods/doGoodsUI" ;
}
@RequestMapping("doFindById/{id}")
public String doFindById(@PathVariable Integer id,Model model) {Goods goods = goodsService.findById(id);
    model.addAttribute("goods", goods);
    return "goods-update";
}
    //FAQ?
    // 返回的 viewname 会给谁?谁调用 doGoodsController 就给谁(DispatcherServelt)// 谁负责解析 viewname V
    // 解析到的后果会响应到哪里
}

goods.html
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<title>Insert title here</title>
</head>
<body>
<h1>The Goods Page</h1>
增加商品

id name remark createdTime operation
1 AAAAAAA AA…. 2020/08/31 delete update

</body>
</html>
goods-add.html
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<title>Insert title here</title>
<style type=”text/css”>

    ul li {list-style-type: none}

</style>
</head>
<body>

<h1>The Goods Add page</h1>
<form th:action="@{/goods/doSaveGoods}" method="p">
    <ul>
        <li>name:
        <li><input type="text" name="name">
        <li>remark:
        <li><textarea rows="3" cols="30" name="remark"></textarea>
        <li><input type="submit" value="Save Goods">
    </ul>
</form>

</body>
</html>
goods-update.html
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<title>Insert title here</title>
<style type=”text/css”>

    ul li {list-style-type: none}

</style>
</head>
<body>

<h1>The Goods Add page</h1>
<form th:action="@{/goods/doUpdateGoods}" method="p">
    <input type="hidden" name="id" th:value="${goods.id}">
    <ul>
        <li>name:
        <li><input type="text" name="name" th:value="${goods.name}">
        <li>remark:
        <li><textarea rows="3" cols="30" name="remark" th:text="${goods.remark}"></textarea>
        <li><input type="submit" value="Save Goods">
    </ul>
</form>

</body>
</html>
前面的是测试类的后果:
DateSourceTests.java
package com.cy.pj.common.datasource;

import java.sql.Connection;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class DataSourceTests {

/*
 * FAQ?* 请问 dataSource 对象在运行时指向的具体对象类型是什么 两种:* 一:对象。getclass()。getname();通过反射来找到指向的具体对象 二:通过 debug 测试来,将鼠标指向该连贯就能够看到具体对象
 *  请问 dataSource 对象是有谁帮你创立的?spring 框架(基于底层的根本配置)DataSourceAutoConfiguration
 */
    @Autowired
    private DataSource datasource;
    // 测试通过数据源 DataSource 对象获取一个连贯
    @Test
    public void testConnection() throws Exception {

// // 输入 datasource 变量指向的对象的类型
// System.out.println(datasource.getClass().getName());//com.zaxxer.hikari.HikariDataSource

            // 请问获取连贯的过程你理解吗
        // 第一次获取连贯时会检测连接池是否存在,如果不存在则创立并初始化池
        // 基于 Driver 对象创立与数据库的连贯,并将连贯放在池中
        // 最初从池中返回用户的须要的连贯
        Connection conn = datasource.getConnection();
            System.out.println(conn);
    }

}
GoodsDaoTests.java
package com.cy.pj.goods.dao;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.cy.pj.goods.dao.GoodsDao;

@SpringBootTest
public class GoodsDaoTests {

    /**    关联数据层接口,并由 spring 为其进行值的注入
     *     FAQ?
     * 1)GoodsDao 指向的对象是谁,由谁创立?由谁治理
     * 2)GoodsDao 指向的外部对象会做什么事件?基于 mybatis API 进行会话操作
     */
    @Autowired
    private GoodsDao goodsdao;
    @Test
    void testDeleteId() {int rows = goodsdao.deleteById(1);
        System.out.println("rows=" + rows);
    }
    @Test
    void testDeleteObject() {int rows = goodsdao.deleteObjects(2,3);
        System.out.println("rows=" + rows);
    }

}
GoodsServiceTests.java
package com.cy.pj.goods.service;
import java.util.List;

/**

  • FAQ?
  • 什么是耦合?耦合性(Coupling),也叫耦合度,是对模块间关联水平的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的形式以及通过界面传送数据的多少。

*/
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.cy.pj.goods.pojo.Goods;

@SpringBootTest
public class GoodsServiceTests {

    @Autowired//has a
private GoodsService goodsService;
    @Test
    void testFindGoods() {List<Goods> list = goodsService.findGoods();
        for(Goods g:list) {System.out.println(g);
        }
    }
    @Test
void testDeleteById() {int rows = goodsService.deleteById(10);
    System.out.println("rows=" +rows);
}
    

}
这一次的所须要的依赖注入,来自 pom.xml 文件中体现:
<?xml version=”1.0″ encoding=”UTF-8″?>
<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cy</groupId>
<artifactId>CGB-SBOOT-04</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>CGB-SBOOT-04</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
<!-- 此依赖提供了 HikariCP 连接池 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
       <!-- 负责数据库的的驱动程序 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
    <!-- 增加 mybatis starter 依赖(SpringBoot 在这个依赖下提供 mybatis 的主动配置 -->
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>

退出移动版