2022.8.26_关于SpringMVC增加,修改,删除(批量删除),查询的操作

前言:文章倒序来讲,从简单到困难,课堂项目文件最终会上传放链接到首端

文章目录

前言

一、统计查询

二、 6. 查询最多1条数据

1.引入库

2.读入数据

在`BrandMapper`接口中添加抽象方法:

Mybatis会自动的将查询到的结果集中的数据封装到定义的返回结果类型中,但是,在默认情况下,只能处理列名(Column)与属性名(Property)一致的情况!在规范的软件开发中,推荐使用``来配置列与属性的映射关系:

关于以上``的配置:

- `id`属性:是自定义的名称,在``标签中的`resultMap`属性的值就是对应的``的`id`值- `type`属性:用于封装查询结果的类的全限定名- ``子标签:用于配置主键的列、属性的映射关系- ``子标签:用于配置普通(不是主键,也不是一对多、多对多的关联查询)的列、属性的映射关系另外,还建议使用``标签封装查询的字段列表,此标签需要与``标签配合使用,例如:三、 2. 关于SLF4j日志总结和最后:我文件中没有写关于更新、插入等操作,所以直接发布课件了,和查询流程都是一样的。关于sql文件数据库也在其中,关于如何快速导入sql文件也在课堂项目压缩包下,在idea最右边的database按钮中,详情可以自行搜索。


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、统计查询

第一步:首先在xml文件中插入如下语句,但首先我们得引入配置sql语句的xml模板。在我的资源里有MyBatis Mapper映射文件

SELECT count(*) FROM pms_brand;

第二步:在`BrandMapper`接口中添加抽象方法:(温馨提示在mapper中添加@Repositry注释)

```
int count();
````

第三步:

在`BrandMapper.xml`中配置SQL语句:

```xml
<select id="count" resultType="int">
    SELECT count(*) FROM pms_brand
</select>

  最终:目录结构如图所示,我们接下来都按照这种方式去写,

二、 6. 查询最多1条数据

1.引入库

代码如下(示例):

SELECT 
    id, name, pinyin, logo, description, 
    keywords, sort, sales, product_count, comment_count, 
    positive_comment_count, enable 
FROM 
	pms_brand 
WHERE 
	id=?
通常,在处理查询时,并**不建议使用实体类型作为查询结果**,因为绝大部分查询都不需要查询表中所有的字段,如果使用实体类型, 必然导致查询结果对象调用某些Getter时得到的结果会是`null`,并且,这些Getter的返回结果永远会是`null`。
建议使用其它的POJO类型作为封装查询结果的类型!

常见的POJO:

- `DO`:Data Object
- `DTO`:Data Transfer Object
- `VO`:View Object / Value Object
关于POJO的使用:

```
阿里巴巴Java开发手册
【参考】
领域模型命名规约
1) 数据对象:xxxDO,xxx 即为数据表名。
2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
3) 展示对象:xxxVO,xxx 一般为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
```

另外:

```
阿里巴巴Java开发手册
【强制】
类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
```

2.读入数据

代码如下(示例):

此次查询时,应该在项目的根包下,创建`pojo.vo.BrandStandardVO`类:

```java
@Data
public class BrandStandardVO implements Serializable {
	private Long id;
    private String name;
    private String pinyin;
    private String logo;
    private String description;
    private String keywords;
    private Integer sort;
    private Integer sales;
    private Integer productCount;
    private Integer commentCount;
    private Integer positiveCommentCount;
    private Integer enable;
}
```

在`BrandMapper`接口中添加抽象方法:

```java
BrandStandardVO getStandardById(Long id);
```

Mybatis会自动的将查询到的结果集中的数据封装到定义的返回结果类型中,但是,在默认情况下,只能处理列名(Column)与属性名(Property)一致的情况!
在规范的软件开发中,推荐使用`<resultMap>`来配置列与属性的映射关系:

```xml
<resultMap id="StandardResultMap" type="cn.tedu.csmall.product.pojo.vo.BrandStandardVO">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="product_count" property="productCount"/>
    <result column="comment_count" property="commentCount"/>
    <result column="positive_comment_count" property="positiveCommentCount"/>
</resultMap>
```

关于以上`<resultMap>`的配置:

- `id`属性:是自定义的名称,在`<select>`标签中的`resultMap`属性的值就是对应的`<resultMap>`的`id`值
- `type`属性:用于封装查询结果的类的全限定名
- `<id>`子标签:用于配置主键的列、属性的映射关系
- `<result>`子标签:用于配置普通(不是主键,也不是一对多、多对多的关联查询)的列、属性的映射关系

另外,还建议使用`<sql>`标签封装查询的字段列表,此标签需要与`<include>`标签配合使用,例如:

```xml
<select id="getStandardById" resultMap="StandardResultMap">
    SELECT
        <include refid="StandardQueryFields"/>
    FROM
        pms_brand
    WHERE
        id=#{id}
</select>

<sql id="StandardQueryFields">
    <if test="true">
        id, name, pinyin, logo, description,
        keywords, sort, sales, product_count, comment_count,
        positive_comment_count, enable
    </if>
</sql>
```
# 7. 关于IntelliJ IDEA错误的预判

**问题1:使用Lombok后,不会自动提示Setter和Getter,且使用相当方法后提示错误**

在IntelliJ IDEA中安装Lombok插件即可。

**问题2:使用Mybatis时,尝试自动装配Mapper接口的对象时提示错误**

- 【推荐】在Mapper接口上添加`@Repository`注解即可
- 【不推荐】使用`@Resource`替换`@Autowired`

另外,不使用`@MapperScan`,而是在每个Mapper接口上使用`@Mapper`也可以解决此问题!

**问题3:在配置SQL的XML中,使用`<sql>`节点封装字段列表时提示错误**

- 【不推荐】在IntelliJ IDEA中进行配置,不检查SQL

- 【推荐】使用某种合法的、不影响当前代码运行的代码片段,“骗”过IntelliJ IDEA即可,例如:

三、

【需求】查询品牌列表,暂不考虑分页,结果按照`sort`降序排列、`id`升序(降序)。

需要执行的SQL语句大致是:


```mysql
select 
	id, name, pinyin, logo, description, 
	keywords, sort, sales, product_count, comment_count, 
	positive_comment_count, enable
from pms_brand order by sort desc, id
```
则在项目的根包下创建`pojo.vo.BrandListItemVO`类,在类中声明与以上字体列表匹配的属性:
```java
package cn.tedu.csmall.product.pojo.vo;

import lombok.Data;

import java.io.Serializable;

@Data
public class BrandListItemVO implements Serializable {

    private Long id;
    private String name;
    private String pinyin;
    private String logo;
    private String description;
    private String keywords;
    private Integer sort;
    private Integer sales;
    private Integer productCount;
    private Integer commentCount;
    private Integer positiveCommentCount;
    private Integer enable;

}
```
在`BrandMapper.java`接口中添加抽象方法:
```java
/**
 * 查询品牌列表
 *
 * @return 品牌列表,如果没有匹配的品牌,将返回长度为0的列表
 */
List<BrandListItemVO> list();
```
在`BrandMapper.xml`中配置SQL:
```xml
<select id="list" resultMap="ListResultMap">
    SELECT
        <include refid="ListQueryFields"/>
    FROM
        pms_brand
    ORDER BY
        sort DESC, id
</select>

<sql id="ListQueryFields">
    <if test="true">
        id, name, pinyin, logo, description,
        keywords, sort, sales, product_count, comment_count,
        positive_comment_count, enable
    </if>
</sql>

<!--注意这里的BrandListItemVO,已经不是封装成实体类了-->
<resultMap id="ListResultMap"
           type="cn.tedu.csmall.product.pojo.vo.BrandListItemVO">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="product_count" property="productCount"/>
    <result column="comment_count" property="commentCount"/>
    <result column="positive_comment_count" property="positiveCommentCount"/>
</resultMap>
```
完成后,在`BrandMapperTests`中编写并执行测试:

```java
@Test
void testList() {
    List<BrandListItemVO> list = mapper.list();
    System.out.println("查询品牌列表,查询结果中的数据的数量:" + list.size());
    for (BrandListItemVO brand : list) {
        System.out.println(brand);
    }
}

 2. 关于SLF4j日志

在Spring Boot项目中,在`spring-boot-starter`依赖项中,默认已经集成了SLF4j日志框架。

在添加了`Lombok`依赖项后,可以在需要输出日志的类上添加`@Slf4j`注解,则Lombok框架会在编译期自动添加名为`log`的日志变量。

日志的显示级别,根据日志信息内容的重要程度,从低到高依次为:

- `trace`:跟踪信息
- `debug`:调试信息
- `info`:一般信息
- `warn`:警告信息
- `error`:错误信息

在SLF4j中,调用`log`变量时,有以上5种级别对应的方法,调用与日志显示级别对应的方法,则输出的日志就是对应的级别,例如调用`log.debug()`时,输出的日志就是DEBUG级别的日志,调用`log.warn()`时,输出的日志就是WARN级别的日志。

在Spring Boot项目中,默认的显示级别是`info`,相比`info`较低级别的日志不会被输出!

在Spring Boot项目中,可以在`application.properties`中通过`logging.level.包名`属性来设置日志的显示级别:

```properties
# 日志的显示级别
logging.level.cn.tedu.csmall=trace
```

关于以上配置:

- 包名部分,必须至少写1级包名,例如`logging.level.cn`,如果没有包名,则是错误的
- 配置的包名是”根包“,所以子孙包及其下的所有类的日志都会是以上配置的级别
- 如果认为有必要的话,甚至可以配置到具体的类

使用日志的好处:

- 可以通过简单的配置,实现控制日志的显示级别,所以,可以使得某些日志仅开发时能输出,在生产环境中不会输出
- 使用日志时,可以使用常量字符串,输出结果中的变量值均在此常量字符串中使用占位符表示即可,所以,字符串的处理效率非常高,并且,代码简洁

以上直接在每个测试类最上方加入@logf4j即可,把输出语句全部改为日志输出语句,另外在application.porperties配置文件中可以设置这个日志级别信息

# 日志的显示级别
logging.level.cn.tedu.csmall=trace

总结和最后:我文件中没有写关于更新、插入等操作,所以直接发布课件了,和查询流程都是一样的。关于sql文件数据库也在其中,关于如何快速导入sql文件也在课堂项目压缩包下,在idea最右边的database按钮中,详情可以自行搜索。还有关于跟新操作为什么用<set>而不用SET字段,稍后再说

课件地址

https://download.csdn.net/download/m0_62774456/86511027

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:这个异常可能是由于配置文件的问题引起的。在整合完之后,配置的应该是全部的配置文件,而不仅仅是MVC的配置文件。可能是因为没有注意到这个问题,导致出现了这个异常。解决方案可以是使用import标签将所有的配置文件导入到一个总的配置文件中,然后在web.xml中导入这个总的配置文件。\[1\] 引用\[2\]:另外,这个异常也可能是由于配置SqlSessionFactoryBean时的问题引起的。可能是在配置文件中将ref属性错误地写成了value属性。需要检查一下配置文件中是否有这样的错误。\[2\] 引用\[3\]:还有一种可能是由于编码问题引起的。如果代码中存在中文注解,并且编码格式不正确,可能会导致这个异常。需要将所有的中文注解去掉或者确保编码格式正确。\[3\] 综上所述,javax.servlet.ServletException: Servlet\[springmvc\]的Servlet.init()引发异常可能是由于配置文件问题、SqlSessionFactoryBean配置问题或者编码问题引起的。需要仔细检查相关配置文件和代码,确保没有错误。 #### 引用[.reference_title] - *1* *2* [javax.servlet.ServletException: Servlet[springmvc]的Servlet.init()引发异常](https://blog.csdn.net/m0_46212244/article/details/118307244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [javax.servlet.ServletException: Servlet[SpringMVC]的Servlet.init()引发异常](https://blog.csdn.net/adaada2046/article/details/127726435)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值