MyBatis查询数据库

1.MyBatis 是什么?

MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置 和映射原始类型、接⼝和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的记录。

简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具。

Mybatis官⽹

2.为什么要学习 MyBatis?

对于后端开发来说,程序是由以下两个重要的部分组成的:

1. 后端程序

2. 数据库

⽽这两个重要的组成部分要通讯,就要依靠数据库连接⼯具,那数据库连接⼯具有哪些?⽐如之前的 JDBC,还有今天我们将要介绍的 MyBatis,那已经有了 JDBC 了,为什么还要学习 MyBatis? 这是因为 JDBC 的操作太繁琐了,我们回顾⼀下 JDBC 的操作流程:

1. 创建数据库连接池 DataSource

2. 通过 DataSource 获取数据库连接 Connection

3. 编写要执⾏带 ? 占位符的 SQL 语句

4. 通过 Connection 及 SQL 创建操作命令对象 Statement

5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值

6. 使⽤ Statement 执⾏ SQL 语句

7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量

8. 处理结果集

9. 释放资源

对于 JDBC 来说,整个操作⾮常的繁琐,我们不但要拼接每⼀个参 数,⽽且还要按照模板代码的⽅式,⼀步步的操作数据库,并且在每次操作完,还要⼿动关闭连接等, ⽽所有的这些操作步骤都需要在每个⽅法中重复书写。于是我们就想,那有没有⼀种⽅法,可以更简 单、更⽅便的操作数据库呢?

答案是肯定的,学习 MyBatis 的真正原因,就是它可以帮助我们更⽅便、更快速的操作数据 库。

3.怎么学MyBatis?

MyBatis 学习只分为两部分:

  • 配置 MyBatis 开发环境;
  • 使⽤ MyBatis 模式和语法操作数据库

4.第⼀个MyBatis查询

开始搭建 MyBatis 之前,我们先来看⼀下 MyBatis 在整个框架中的定位,框架交互流程图:

MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在⾯向 对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象 的互相转换:

1. 将输⼊数据(即传⼊对象)+SQL 映射成原⽣ SQL

2. 将结果集映射为返回对象,即输出对象

ORM 把数据库映射为对象:

数据库表(table)--> 类(class)

记录(record,⾏数据)--> 对象(object)

字段(field) --> 对象的属性(attribute)

⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。 也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间 的转换,接下来我们来看 MyBatis 的使⽤吧。

4.1 创建数据库和表

接下来我们要实现的功能是:使⽤ MyBatis 的⽅式来读取⽤户表中的所有⽤户,我们使⽤个⼈博 客的数据库和数据包,具体 SQL 如下。

-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
use mycnblog;
-- 创建表[⽤户表]
drop table if exists userinfo;
create table userinfo(
 id int primary key auto_increment,
 username varchar(100) not null,
 password varchar(32) not null,
 photo varchar(500) default '',
 createtime datetime default now(),
 updatetime datetime default now(),
 `state` int default 1
) default charset 'utf8mb4';

 4.2 添加MyBatis框架⽀持

添加 MyBatis 框架⽀持分为两种情况:⼀种情况是对⾃⼰之前的 Spring 项⽬进⾏升级,另⼀种情况是 创建⼀个全新的 MyBatis 和 Spring Boot 的项⽬,下⾯我们分别来演示这两种情况的具体实现。

4.2.1 ⽼项⽬添加MyBatis

如果是在⽼项⽬中新增功能,添加框架⽀持:

<!-- 添加 MyBatis 框架 -->
<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.1.4</version>
</dependency>
<!-- 添加 MySQL 驱动 -->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.38</version>
 <scope>runtime</scope>
</dependency>

添加了 MyBatis 之后,为什么还需要添加 MySQL 驱动呢? MyBatis 就像⼀个平台(类似京东),⽽数据库相当于商家有很多种,不⽌有 MySQL,还有 SQL Server、DB2 等等.....因此这两个都是需要添加的。 

在⽼项⽬中快速添加框架,更简单的操作⽅式是使⽤EditStarters插件 

EditStarters 插件的使⽤⽅法: 

搜索“MyBatis”添加即可:

4.2.2 新项⽬添加MyBatis

 4.3 配置连接字符串和MyBatis

 此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置。

4.3.1 配置连接字符串

如果是 application.yml 添加如下内容: 

# 数据库连接配置
spring:
  datasource:
   url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
   username: root
   password: 123456
   driver-class-name: com.mysql.cj.jdbc.Driver

注意事项:

 如果使⽤ mysql-connector-java 是 5.x 之前的使⽤的是“ com.mysql.jdbc.Driver ” ,如果是⼤于 5.x 使⽤的是“ com.mysql.cj.jdbc.Driver ” 。

4.3.2 配置 MyBatis 中的 XML 路径

MyBatis 的 XML 中保存是查询数据库的具体操作 SQL,配置如下:

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
 mapper-locations: classpath:mapper/**Mapper.xml

4.4 添加业务代码 

下⾯按照后端开发的⼯程思路,也就是下⾯的流程来实现 MyBatis 查询所有⽤户的功能:

4.4.1 添加实体类

先添加⽤户的实体类:

package com.example.springmybatisdemo.model;

import lombok.Data;

import java.util.Date;
@Data
public class User {
    private Integer id;
    private String name;
    private String password;
    private String photo;
    private Date createtime;
    private Date updatetime;
}

 4.4.2 添加 mapper 接⼝

数据持久层的接⼝定义:

package com.example.springmybatisdemo.mapper;

import com.example.springmybatisdemo.model.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    List<User> queryAll();
}

4.4.3 添加 UserMapper.xml 

数据持久成的实现,mybatis 的固定 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.example.springmybatisdemo.mapper.UserMapper">
    
</mapper>

UserMapper.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="com.example.springmybatisdemo.mapper.UserMapper">
    <select id="queryAll" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo
    </select>
</mapper>

 以下是对以上标签的说明:

  • <mapper>标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接⼝的全限定 名,包括全包名.类名。
  • <select>查询标签:是⽤来执⾏数据库的查询操作的:
  • id:是和 Interface(接⼝)中定义的⽅法名称⼀样的,表示对接⼝的具体实现⽅法。
  • resultType:是返回的数据类型,也就是开头我们定义的实体类。

4.4.4 添加 Service 

服务层实现代码如下:

4.4.5 添加 Controller

控制器层的实现代码如下:

4.4.6 使⽤ postman 测试

5.增、删、改操作

接下来,我们来实现⼀下⽤户的增加、删除和修改的操作,对应使⽤ MyBatis 的标签如下:

<insert>标签:插⼊语句

<update>标签:修改语句

<delete>>标签:删除语句

数据持久层的接⼝定义:

package com.example.springmybatisdemo.mapper;

import com.example.springmybatisdemo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserMapper {
    /**
     * 查询所有数据
     * @return
     */
    List<User> queryAll();
    /**
     * 根据id来查询
     */
    User queryById(@Param("uid") Integer id);
    /**
     * 插入
     */
    Integer insert(User user);
    /**
     * 修改数据
     */
    void update(User user);
    /**
     * 删除数据
     */
    void delete(Integer id);

}

数据持久层的实现:

<?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.example.springmybatisdemo.mapper.UserMapper">
    <select id="queryAll" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo
    </select>
    <select id="queryById" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo where id = ${id}
    </select>
    <insert id="insert">
        insert into userinfo (username,password,photo)values (#{username},#{password},#{photo})
    </insert>
    <update id="update">
        update userinfo set username = #{username},password = #{password},photo = #{photo} where id = #{id}
    </update>
    <delete id="delete">
        delete from userinfo where id = #{id}
    </delete>
</mapper>

特殊的添加:返回⾃增 id 

默认情况下返回的是受影响的⾏号,如果想要返回⾃增 id,具体实现如下

  • useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据 库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动 递增字段),默认值:false。 
  • keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列 不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性 名称。
  •  keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回 值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列 不⽌⼀个,可以⽤逗号分隔多个属性名称。

6.查询操作

6.1 单表查询

下⾯我们来实现⼀下根据⽤户 id 查询⽤户信息的功能。 Controller 实现代码如下:

@RequestMapping("/getuser")
public User getUserById(Integer id) {
 return userService.getUserById(id);
}

Mapper.xml 实现代码如下:

<select id="queryById" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo where id = ${id}
    </select>

6.1.1 参数占位符 #{} 和 ${}

  • #{}:预编译处理。
  • ${}:字符直接替换。

预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的 set ⽅法来赋值。直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

6.1.2 ${} 优点

使⽤ ${sort} 可以实现排序查询,⽽使⽤ #{sort} 就不能实现排序查询了,因为当使⽤ #{sort} 查询时, 如果传递的值为 String 则会加单引号,就会导致 sql 错误。

6.1.3 SQL 注⼊问题

sql 注⼊代码:“' or 1='1”

使用#号

<select id="queryByNameAndPassWord" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo where username = #{username} and password = #{password}
    </select>

 测试:

@Test
    void queryByNameAndPassWord() {
        String username = "admin";
        String password = "' or 1='1";
        User user = userMapper.queryByNameAndPassWord(username,password);
        log.info(user == null ? null:user.toString());
    }

结果:数据没有查询出来,响应正常

 使用$符号

 <select id="queryByNameAndPassWord" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo where username = '${username}' and password = '${password}'
    </select>

测试:

 @Test
    void queryByNameAndPassWord() {
        String username = "admin";
//        String password = "123";
        String password = "' or 1='1";
        User user = userMapper.queryByNameAndPassWord(username,password);
        log.info(user == null ? null:user.toString());
    }

 结果:数据不该被查出来,结果被查出来

 什么时候使用$

 排序时,只能使用$。

6.1.4 like 查询

使用#号

使用$符号

程序可以正常运行,但是$存在SQL注入的问题

需要使用MySQL的内置函数

<select id="queryByLike" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo where username like concat('%',#{name},'%')
    </select>

 $和#区别

6.2 多表查询

如果是增、删、改返回搜影响的⾏数,那么在 mapper.xml 中是可以不设置返回的类型的:

<insert id="insert">
        insert into userinfo (username,password,photo)values (#{username},#{password},#{photo})
    </insert>
    <update id="update">
        update userinfo set username = #{username},password = #{password},photo = #{photo} where id = #{id}
    </update>
    <delete id="delete">
        delete from userinfo where id = #{id}
    </delete>

对于<select>查询标签来说⾄少需要两个属性:

id 属性:⽤于标识实现接⼝中的那个⽅法;

结果映射属性:结果映射有两种实现标签:<resultMap> 和<resultType> 。  

6.2.1 返回类型:resultType

绝⼤数查询场景可以使⽤ resultType 进⾏返回,如下代码所示:

<select id="queryAll" resultType="com.example.springmybatisdemo.model.User">
        select * from userinfo
    </select>

它的优点是使⽤⽅便,直接定义到某个实体类即可。 

6.2.2 返回字典映射:resultMap

resultMap 使⽤场景:

  • 字段名称和程序中的属性名不同的情况,可使⽤ resultMap 配置映射;
  • ⼀对⼀和⼀对多关系可以使⽤ resultMap 映射并查询数据。

字段名和属性名不同的情况 

数据库中

 

程序中

public class User {
    private Integer id;
    private String name;
    private String pwd;
    private String photo;
    private Date createtime;
    private Date updatetime;
}

mapper.xml 

<resultMap id="BaseMap" type="com.example.springmybatisdemo.model.User">
        <id property="id" column="id"></id>
        <result property="name" column="username"></result>
        <result property="pwd" column="password"></result>
    </resultMap>
    <select id="queryAllByMap" resultMap="BaseMap">
        select * from userinfo
    </select>

 

6.2.3 多表查询

在多表查询时,如果使⽤ resultType 标签,在⼀个类中包含了另⼀个对象是查询不出来被包含的对象 的,⽐如以下实体类:

@Data
public class ArticleInfo {
 private Integer id;
 private String title;
 private String content;
 private LocalDateTime createtime;
 private LocalDateTime updatetime;
 private Integer rcount;
 // 包含了 userinfo 对象
 private UserInfo user;
}

程序的执⾏结果如下图所示:

 此时我们就需要使⽤特殊的⼿段来实现联表查询了。 

6.2.3.1 ⼀对⼀的表映射

⼀对⼀映射要使⽤ <association>标签,具体实现如下(⼀篇⽂章只对应⼀个作者):

<resultMap id="BaseMap" type="com.example.springmybatisdemo.model.ArticleInfo">
        <id property="id" column="id"></id>
        <result property="title" column="title"></result>
        <result property="content" column="content"></result>
        <result property="createtime" column="createtime"></result>
        <result property="updatetime" column="updatetime"></result>
        <association property="user" resultMap="com.example.springmybatisdemo.mapper.UserMapper.BaseMap">

        </association>
    </resultMap>
    <select id="queryArticle" resultMap="BaseMap">
        select
        *
        from articleinfo ta
        left join userinfo tb on ta.uid = tb.id
    </select>

以上使⽤ 标签,<association>表示⼀对⼀的结果映射:

  • property 属性:指定 Article 中对应的属性,即⽤户。
  • resultMap 属性:指定关联的结果集映射,将基于该映射配置来组织⽤户数据。
  • columnPrefix 属性:绑定⼀对⼀对象时,是通过 columnPrefix+association.resultMap.column 来映射结果集字段。 association.resultMap.column是指 标签中 resultMap属性,对应的结果集映 射中,column字段。  

注意:columnPrefix 属性不能省略,如果省略当联表中如果有相同的字段,那么就会导致查询出错。 ⽐如两篇⽂章都是⼀个⼈写的,如果没有 columnPrefix 就会导致查询的⽤户 id(因为和⽂章表 id 相 同)查询出错。 

articleinfo:

public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private Date createtime;
    private Date updatetime;
    private Integer rcount;
    private User user;
}

 Mapper:

@Mapper
public interface ArticleMapper  {
    List<ArticleInfo> queryArticle();
}

6.2.3.2 ⼀对多:⼀个用户多篇⽂章案例

⼀对多需要使⽤ <collection>标签,⽤法和<association> 相同

7.复杂情况:动态SQL使用

动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。

动态SQL:根据输入参数不同,动态的拼接SQL

可以参考官⽅⽂档:mybatis – MyBatis 3 | 动态 SQL

7.1 <if>标签

在注册⽤户的时候,可能会有这样⼀个问题,如下图所示:

 

注册分为两种字段:必填字段和⾮必填字段,那如果在添加⽤户的时候有不确定的字段传⼊,程序应该 如何实现呢? 

这个时候就需要使⽤动态标签 <if>来判断了,⽐如添加的时候性别 state为⾮必填字段,具体实现如下:

<insert id="insertByCondition" >
        insert into articleinfo(title,content,uid
        <if test="state!=null">
            ,state
        </if>
        )
        values
        (#{title},#{content},#{userId}
        <if test="state!=null">
            ,#{state}
        </if>

        )
    </insert>

注意 test 中的 state,是传⼊对象中的属性,不是数据库字段。 

7.2<trim> 标签

之前的插⼊⽤户功能,只是有⼀个 state字段可能是选填项,如果所有字段都是⾮必填项,就考虑使⽤ <trim>标签结合<if>标签,对多个字段都采取动态⽣成的⽅式。

<trim>标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

调整 UserMapper.xml 的插⼊语句为: 

   <insert id="insertByCondition" >
        insert into articleinfo(
        <trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
            <if test="title!=null">
                title,
            </if>
            <if test="content!=null">
                content,
            </if>
            <if test="uid!=null">
                uid,
            </if>
            <if test="state!=null">
                state
            </if>
            )
        </trim>
        <trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
            <if test="title!=null">
                #{title},
            </if>
            <if test="content!=null">
                #{content},
            </if>
            <if test="userId!=null">
                #{userId},
            </if>
            <if test="state!=null">
                #{state}
            </if>
        </trim>
    </insert>

7.3 <where>标签

传⼊的⽤户对象,根据属性做 where 条件查询,⽤户对象中属性不为 null 的,都为查询条件。

<select id="queryByCondition" resultType="com.example.springmybatisdemo.model.ArticleInfo">
        select *
        from articleinfo
        <where>
            <if test="uid!=null">
                and uid = #{uid}
            </if>
            <if test="state!=null">
                and state=#{state}
            </if>
        </where>

测试:

 @Test
    void queryByCondition() {
        List<ArticleInfo> articleInfos = articleMapper.queryByCondition(null,null);
        log.info(articleInfos.toString());
    }

 ​​​​​​where标签的作用:

7.4 <set>标签

根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤标签来指定动态内容。

<update id="updateByCondition" >
        update articleinfo
        <set>
            <if test="uid!=null">
                uid=#{uid},
            </if>
            <if test="state!=null">
                state=#{state}
            </if>
        </set>
    </update>

set标签作用:

 

7.5<foreach> 标签

对集合进⾏遍历时可以使⽤该标签。<foreach>标签有如下属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

代码示例: 

 <delete id="batchDelete">
        delete from articleinfo where id in
        <foreach collection="list" open="(" close=")" separator="," item="id">
            #{id}
        </foreach>
    </delete>

 属性分析:

 8、其他

Mybatis的实现,有两种方式

1.xml方式

2.注解的方式

例如:

package com.example.springmybatisdemo.mapper;

import com.example.springmybatisdemo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper2 {
    @Select("select * from userinfo")
    List<User> queryAll();

    @Select("select * from userinfo where id = #{id}")
    User queryById(Integer aaa);
}

测试:

package com.example.springmybatisdemo.mapper;

import com.example.springmybatisdemo.model.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Select;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;


@Slf4j
@SpringBootTest
class UserMapper2Test {
    @Autowired
    private UserMapper2 userMapper2;
    @Test
    void queryAll() {
        List<User> userList = userMapper2.queryAll();
        log.info(userList.toString());
    }


    @Test
    void queryById() {
        User user = userMapper2.queryById(1);
        log.info(user.toString());
    }
}

但是动态SQL写出来比较复杂

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/54729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake:为Eigen库使能向量化

CMake:为Eigen库使能向量化 导言构建Eigen项目结构CMakeLists.txt相关源码 导言 本篇开始将涉及检测外部库相关的内容&#xff0c;期间会穿插着一些其他的内容。为了能够使得系统在系统中运行Eigen库&#xff0c;我们首先需要在系统中配置好Eigen库。然后介绍与Eigen库相关的C…

【C++】STL——vector的模拟实现、常用构造函数、迭代器、运算符重载、扩容函数、增删查改

文章目录 1.模拟实现vector1.1构造函数1.2迭代器1.3运算符重载1.4扩容函数1.5增删查改 1.模拟实现vector vector使用文章 1.1构造函数 析构函数 在C中&#xff0c;vector是一个动态数组容器&#xff0c;可以根据需要自动调整大小。vector类提供了几个不同的构造函数来创建和初…

java 版本企业招标投标管理系统源码,多个行业+及时准确+全程电子化

&#xfeff; 项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&am…

Electron 系统通知 Notification 实践指南

系统通知是桌面应用的常见功能&#xff0c;用于给用户发送提醒&#xff08;刷下存在感 &#x1f642;&#xff09;&#xff0c;还能帮定点击事件以便后续的操作。 Electron 自带通知模块&#xff0c;下方代码是一个简单的示例 const { Notification } require(electron)cons…

【C#教程】零基础从入门到精通

今天给大家分享一套零基础从入门到精通&#xff1a;.NetCore/C#视频教程&#xff1b;这是2022年最新整理的、590G的开发教程资料。课程涵盖了.Net各方面的知识&#xff0c;跟着这个教程学习&#xff0c;就足够了。 课程分类 1、C#从基础到精通教程&#xff1b; 2、Winform从…

Framework开发的热度从未下降~

近几日&#xff0c;统计局也发布了就业相关数据&#xff0c;全国失业青年达600多万&#xff0c;面对此数据&#xff0c;我们能想到的是实际的失业人数肯定会比公布的数据要多很多&#xff0c;尤其是表示 “一周工作一小时以上” 也纳入了就业范围。 反观有一批Android开发在如此…

【数据挖掘torch】 基于LSTM电力系统负荷预测分析(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

用C语言构建一个手写数字识别神经网络

(原理和程序基本框架请参见前一篇 "用C语言构建了一个简单的神经网路") &#xff11;&#xff0e;准备训练和测试数据集 从http://yann.lecun.com/exdb/mnist/下载手写数字训练数据集, 包括图像数据train-images-idx3-ubyte.gz 和标签数据 train-labels-idx1-ubyte.…

Mac 安装配置adb命令环境(详细步骤)

一、注意&#xff1a;前提要安装java环境。 因为android sdk里边开发的一些包都是依赖java语言的&#xff0c;所以&#xff0c;首先要确保已经配置了java环境。 二、在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;andr…

Django的生命周期流程图(补充)、路由层urls.py文件、无名分组和有名分组、反向解析(无名反向解析、有名反向解析)、路由分发、伪静态

一、orm的增删改查方法&#xff08;补充&#xff09; 1. 查询resmodels.表名(类名).objects.all()[0]resmodels.表名(类名).objects.filter(usernameusername, passwordpassword).all()res models.表名(类名).objects.first() # 判断&#xff0c;判断数据是否有# res如果查询…

UE4 unlua学习笔记

将这三个插件放入Plugins内并重新编译 创建一个BlueprintLibrary&#xff0c;声明一个全局函数 在这里声明路径 点击Create Lua Template 在Content的Script即可生成对应的lua文件打开它&#xff01; 显示以上lua代码 打印Hello Unlua 创建该UI&#xff0c;就会在创建UI的Con…

第5章 最佳实践

过去的错误 不要怪罪JavaScript 游览器遇到不合法的html会想尽办法将他展现出来游览器遇到不合法的js将拒绝执行它们并报错写js要保障自己代码的健壮性 质疑一切 写js功能前一定要考虑这个功能的合理性&#xff0c;避免造成不可预见的后果写js功能前一定要考虑用户的游览器…

企业级IT应用运维监控层次架构设计

企业基本都有自己的IT系统&#xff0c;而每个IT系统都有自己的监控系统。 企业级的IT应用监控架构是一种综合性的解决方案&#xff0c;涉及到很多层级和相应的工具。随着企业IT系统的规模和复杂程度的不断增加&#xff0c;监控和管理系统也面临着越来越大的挑战。 大家有时在…

视频监控汇聚平台EasyCVR告警消息生成后,合成录像显示不了是什么原因?

智能视频监控平台TSINGSEE青犀视频EasyCVR具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&…

Redis事务、管道

一.Redis事务 1.概念 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞 2.Redis事务与数据库事物的区别 3.常用命令 4.事务执行情况 正常执行 即整个过程…

【应用层】HTTPS协议详细介绍

文章目录 前言一、什么是"加密"二、常见的加密方式三、数据摘要&#xff08;数据指纹&#xff09;四、证书总结 前言 HTTPS也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层&#xff0c;由于HTTP协议内容都是按照文本的方式明文传输的&#xff…

郑州https数字证书

很多注重隐私的网站都注重网站信息的安全&#xff0c;比如购物网站就需要对客户的账户信息以及支付信息进行安全保护&#xff0c;否则信息泄露&#xff0c;客户与网站都有损失&#xff0c;网站也会因此流失大量客户。而网站使用https证书为客户端与服务器之间传输的信息加了一个…

深度学习笔记-暂退法(Drop out)

背景 在机器学习的模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题&#xff0c;过拟合具体表现在&#xff1a;模型在训练数据上损失函数较小&#xff0c;预…

day50-Insect Catch Game(捉虫游戏)

50 天学习 50 个项目 - HTMLCSS and JavaScript day50-Insect Catch Game&#xff08;捉虫游戏&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport"…
最新文章