第三阶段第一周笔记及代码

    技术2022-07-12  96

    第三阶段第一周笔记及代码

    2020/6/28--第一天---介绍以及软件2020/6/29第二天2020/6/30--第三天--Spring Boot 整合连接池2020/7/1--第四天--mybatis框架的整合2020/7/2--第五天--自习排除问题1.List findGoods();2.@Insert问题(接口类中插入方式未解决) 2020/7/3--第六天--基于Spring Boot脚手架整合SpringMVC应用与前端交互通过Thymeleaf(取代jsp)遇到的问题sql.date和utill.date的区别 2020/7/4--第七天--SpringBoot 综合实践实现

    2020/6/28–第一天—介绍以及软件

    如何使用sts以及配置maven环境,创建的是spring项目## 二级目录

    2020/6/29第二天

    2020/6/30–第三天–Spring Boot 整合连接池

    上午从十点二十四开始缺,需要补, 下午说的Spring Boot 整合连接池

    2020/7/1–第四天–mybatis框架的整合

    上午: 开始说的debug大概到十点半这样,整理debug的方式 四大引用的认识与举例 下午: 基于spring对mybatis框架的整合。主要是04中GoodsDao中的内容通过debug来显示出哪里使用了mybatie因为形式和内容都和spring差不多看不出来需要借助工具来解释一下, 出现的问题有》》导入mybites时pom.xml文件出错然后右键spring选择edit startes,如果spring不行就换aliyun.com

    单元测试报错记得看一下是不是这几个错误 业务进阶分析及实现方面较难需要再看

    2020/7/2–第五天–自习排除问题

    1.List findGoods();

    List指的是集合.<>是泛型,里面bai指定了这个集du合中存放的是什么数据. 查询显示中需要数据类型所以创建Goods类来描述并限定类型 @Select(“select id,name,remark,createdTime from tb_goods”) List findObjects();

    2.@Insert问题(接口类中插入方式未解决)

    spring整合mybatis后处理sql有两种方式

    在GoodsDao接口类中书写处理sql语句需要注解@Delete@Select@Update相对较麻烦 首先书写sql的注解,然后在GoodsService接口类中定义,接口实现类GoodsServiceImpl要重写(Override)方法,最后在测试类GoodsDaoTests中先 @Autowired private GoodsService goodsService; 然后在使用@Test即可在Goodsmapper.xml中书写处理sql语句要在标签中书写对应信息较简单 在mapper标签中书写对应的sql语句标签注意id,书写好后需要在接口类GoodsDao中定义id这样才能在测试类GoodsDaoTests中使用,但是需要在测试类上加上 @Autowired private GoodsDao gs; 然后就可以在test中进行单元测试

    接口类以及测试类代码如下 Goods:接口类: com.cy.pj.goods.pojo.Goods是类的实现

    package com.cy.pj.goods.pojo; import java.sql.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 //余下的是set和get方法以及重写我就不延伸了

    com.cy.pj.goods.dao.GoodsDao是接口类

    package com.cy.pj.goods.dao; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * @Mapper 注解由mybatis框架定义,用于描述数据层接口对象 * ,系统底层启动mybatis框架会基于@Mapper注解的描述,创建 * 其接口实现类,并将实现类对象交给spring管理。 * @author qilei */ import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.cy.pj.goods.pojo.Goods; @Mapper public interface GoodsDao { /** * 基于id执行批量删除操作 * @param ids * @return */ //int deleteObjects(@Param("ids")Integer ...ids);//早期版本需要基于@Param注解定义参数名 //通过Mapper进行插入 int deleteObjects(Integer... ids);//sql映射中可以使用array,ids参数名来接收方法参数数据 //通过Mapper进行插入 int insert1(); /** * 基于id删除数据库中的商品信息 * @param id * @return */ @Delete("delete from tb_goods where id=#{id}") int deleteById(Integer id); //方式一:直接在Dao里面书写@Delete的内容 //但是删除需要参数所以添加 int deleteById(Integer id); @Select("select id,name,remark,createdTime from tb_goods") List<Goods> findObjects(); //方式一:直接在Dao里面书写@@Select的内容但是查看需要集合来限定 //也就需要创建Goods类 @Update("update tb_goods set name='zhangsan' where id=#{id}") int updateById(Integer idforname); //方式二:在.xml中解决sql语言问题 }

    GoodsMapper.xml里面是另一种实现sql语句的方式

    <?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值应该保证唯一 在程序中通过[ namespace + id ]定位到要执行哪一条SQL语句 --> <mapper namespace="com.cy.pj.goods.dao.GoodsDao"> <delete id="deleteObjects"> delete from tb_goods <where> <if test="ids!=null and ids.length!=0"> id in <!-- (1,2,3,4) --> <foreach collection="ids" open="(" separator="," close=")" item="id"> #{id} </foreach> </if> or 1=2 </where> </delete> <insert id="insert1"> insert into tb_goods value(null,'wdl','tl',now()) </insert> </mapper>

    com.cy.pj.goods.dao.GoodsDaoTests是测试类

    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; @SpringBootTest public class GoodsDaoTests { //has a @Autowired private GoodsDao goodsDao;//请问这个引用指向的对象是谁?你怎么知道的 @Test void testDeleteById() { int rows=goodsDao.deleteById(10);//请此操作需要连接吗?从哪里来? System.out.println("delete.rows="+rows); }//在GoodsDao里面直接书写的方式一 @Test void testDeleteObjects() { //执行goodsDao.deleteObjects方法时候,系统会: //1)基于接口类全名找到与其namespace对应的映射文件。 int rows=goodsDao.deleteObjects(10,11,12); System.out.println("delete.rows="+rows); }//在GoodsMapper.xml里面书写的方式二 }

    service接口类: com.cy.pj.goods.service.GoodsService是接口类

    package com.cy.pj.goods.service; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import com.cy.pj.goods.pojo.Goods; public interface GoodsService { int deleteById(Integer id);//@Delete List<Goods> findGoods();// @Select int updateById(Integer idforname);// @Update }

    com.cy.pj.goods.service.GoodsServiceImpl是接口实现类

    package com.cy.pj.goods.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.cy.pj.goods.dao.GoodsDao; import com.cy.pj.goods.pojo.Goods; @Service //@Component public class GoodsServiceImpl implements GoodsService { @Autowired private GoodsDao goodsDao; @Override public int deleteById(Integer id) { int rows=goodsDao.deleteById(id);//主要内容利用方式一 return rows; } @Override public List<Goods> findGoods() { long start=System.currentTimeMillis();//无关紧要--计数 List<Goods> list=goodsDao.findObjects();//主要内容利用方式一 long end=System.currentTimeMillis();//无关紧要--计数 System.out.println("query time:"+(end-start));//无关紧要--计数 return list; } @Override public int updateById(Integer idforname) { // TODO Auto-generated method stub int rows = goodsDao.updateById(idforname); return rows; } }

    com.cy.pj.goods.dao.GoodsDaoTests是测试类

    package com.cy.pj.goods.service; import java.util.HashMap; import java.util.List; 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; import com.cy.pj.goods.pojo.Goods; @SpringBootTest public class GoodsServiceTests { @Autowired private GoodsService goodsService; @Autowired private GoodsDao gs; @Test void testDeleteById() { int rows=goodsService.deleteById(15); System.out.println("rows="+rows); } @Test public void testFindGoods() { List<Goods> list=goodsService.findGoods(); list=goodsService.findGoods(); //System.out.println(list);//toString() for(Goods g:list) { System.out.println(g);//toString() } }// @Test void testUpdateById() { int rows=goodsService.updateById(1); System.out.println("rows="+rows); } @Test//访问GoodsDao接口中xml中的方式 void testdeleteObjectsUseMapper_xml() { int rows = gs.deleteObjects(1,2,3); System.out.println(rows); } @Test//访问GoodsDao接口中xml中的方式 void testinsertObjectsUseMapper_xml() { int rows = gs.insert1();参数在mapper.xml里面书写 System.out.println("rows="+rows); } }

    2020/7/3–第六天–基于Spring Boot脚手架整合SpringMVC应用

    与前端交互通过Thymeleaf(取代jsp)

    控制器(Controller)- 负责获取请求,处理请求,响应结果。 模型(Model) - 实现业务逻辑,数据逻辑实现。

    仍然在04里面接着书写今天的内容

    1 编辑pom.xml文件,添加web依赖,Thymeleaf依赖 Web依赖(提供了Spring MVC核心API,同时会嵌入一个Tomcat服务器) Thymeleaf依赖(提供了一个视图解析器对象以及数据绑定机制)

    2 配置Spring MVC 核心对象在application.properties文件中添加视图解析器配置 spring.thymeleaf.prefix=classpath:/templates/pages/ spring.thymeleaf.suffix=.html

    3 在src/main/resources目录下创建templates/pages目录 目录里创建goods.xml文件里面是要显示的内容

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> XXXXXXXXXXXXX </body> </html>

    4编写GoodsController类并将其交给spring管理,Controller在SpringMVC 规范中通常称之为Handler(处理器)在企 业中有时也会将此对象理解为一个后端控制器

    package com.cy.pj.goods.controller; @Controller @RequestMapping("/goods/") public class GoodsController { @RequestMapping("doGoodsUI") public String doGoodsUI() { return "goods"; } }

    练习一: 将数据库中的商品数据查询出来更新到页面上。(出现问题的原因:注解,拼写)

    第一步:在上述GoodsController 中添加Model 以及接口对象

    @Autowired private GoodsService goodsService; @RequestMapping("doGoodsUI") public String doGoodsUI(Model model){ List<Goods> list = goodsService.findObjects(); model.addAttribute("list,list"); return "goods"; }

    第二步:在.html中显示,利用的是thymeleaf中的方式

    <table> <thead> <th>id</th> <th>name</th> <th>remark</th> <th>createdTime</th> </thead> <tbody> <tr th:each="g:${list}"> <td th:text="${g.id}">1</td> <td th:text="${g.name}">MySql</td> <td th:text="${g.remark}">DBMS</td> <td th:text="${g.createdTime}">2020/4/4</td> </tr> </tbody> </table>

    练习二:基于ID删商品库中的商品信息。

    @RequestMapping("doDeleteById") //http://localhost:8080/goods/dodoDeleteById?id=9 public String doDeleteById(Integer id){ goodsService.deleteById(id); return "redirect:doGoodsUI"; }//可以直接使用,但是需要美化使用按钮就好啦 <th>operation</th>> ... <td><a th:href="@{/goods/doDeleteById(id=${g.id})}">delete</a></td>>

    练习三:将页面用户输入的商品信息写入到数据库。

    固定式输入insert的内容,但是来自于简单的xml文件中不能自己改,实实在在的说就是仍调用以前的插入方式,但是能用 后期会有采用表单输入的方式更加完善

    @RequestMapping("doInsert") public String doInsert() { //但是不行哦 goodsDao.insert1();//但是只能插入一次还是调用固定的写法(GoodsMapper.xml),不然还需要添加输入框以及不知名的情况 return "redirect:doGoodsUI"; }

    操作方式就是浏览器输入

    遇到的问题sql.date和utill.date的区别

    1) java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。 说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

    2)JAVA里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含2002/05/22 5:00:57 PM的字段,读取日期时得到的是2002/05/22,而读取时间时得到的是5:00:57 PM. 你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现的BUG:获得一个JAVA里的日期对象。 从数据库里读取日期 试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false。.sql.Timestamp类比java.util.Date类精确度要高。这个类包了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用…

    总之,java.util.Date 就是Java的日期对象,而java.sql.Date 是针对SQL语句使用的,只包含日期而没有时间部分。

    2020/7/4–第七天–SpringBoot 综合实践实现

    练习三:将页面用户输入的商品信息写入到数据库。 完善采用表单输入的方式

    @Insert("insert into tb_goods (name,remark,createdTime) values (#{name},#{remark},now())") int insertObject(Goods entity);

    其他层的自己书写一下不难

    <form action="doSaveObject" method="post"> <ul> <li>name: <li><input type="text" name="name"> <li>remark: <li><textarea rows="5" cols="50" name="remark"></textarea> <li><input type="submit" value="save"> </ul> </form>

    上午主讲后端人员如何书写前端,借助bootstrap的css样式

    https://start.spring.io/建包可以通过这个网站

    下午有几个难点!!!!!!!!!!主要是在网页页面的一些书写

    模板出错问题:html放错了地方@Mapper和@Service容易忘记添加:删除传参出错:script–function的书写方式:jsp/js:

    待做笔记——老师主要结合样式表加上前天说的内容结合,但是在html中因为样式的多样操作会有很多细节上的问题

    Processed: 0.018, SQL: 9