MyBatis系统学习 - 使用Mybatis完成查询单条,多条数据,模糊查询,动态设置表名,获取自增主键

news2024/11/18 13:20:03

上篇博客我们围绕Mybatis链接数据库进行了相关概述,并对Mybatis的配置文件进行详细的描述,本篇博客也是建立在上篇博客之上进行的,在上面博客搭建的框架基础上,我们对MyBatis实现简单的增删改查操作进行重点概述,在MyBatis中实现简单的增删改查,算是我们在处理业务的时候经常干的事情,使用Mybatis可以帮助我们将数据库操作封装在映射文件或者映射接口中,让开发人员可以通过简单的配置或者接口方法来执行数据库操作,进而无需重复编写繁琐的SQL,并且可以灵活编写SQL语句,可以根据实际需求进行SQL拼接,从而提高数据库操作的灵活性和可用性。

项目目录结构

在这里插入图片描述
PS: 上述的Service层是我为了按照规范进行开发创建的相关类,实际开发中则需要按照上述规范进行,而本篇博客我们将不会使用到service层,所以,读者可以无需创建Service和ServiceImpl。

关注点:

  1. MyBatis实现简单的增删改查也会实现MyBatis实现一些相对复杂的查询功能,其中包括查询List集合,查询一个实体类对象,以及查询单个数据,查询单条为Map的集合和多条Map的集合。
  2. MyBatis获取参数值的两种方式: ${}和#{}
  3. 特殊SQL的执行:模糊查询,批量删除,动态设置表名,添加功能获取自增的主键
  4. 自定义映射resultMap,多对一和一对多映射关系处理

数据库

CREATE TABLE `test`.`user`  (
       `id` int(11) NOT NULL,
       `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
       `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
       `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
       PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

CREATE TABLE `test`.`book`  (
            `uid` int(11) NOT NULL COMMENT '用户id',
            `book` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '用户借的书的名称',
            `cool` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'cool星级',
            PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

实体Bean

public class Book {

    private Integer uid;

    private String book;

    private String cool;

    public Book() {
    }

    public Book(Integer uid, String book, String cool) {
        this.uid = uid;
        this.book = book;
        this.cool = cool;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getBook() {
        return book;
    }

    public void setBook(String book) {
        this.book = book;
    }

    public String getCool() {
        return cool;
    }

    public void setCool(String cool) {
        this.cool = cool;
    }

    @Override
    public String toString() {
        return "Book{" +
                ", uid=" + uid +
                ", book='" + book + '\'' +
                ", cool='" + cool + '\'' +
                '}';
    }
}
public class User {

    private int id;

    private String name;

    private  String username;

    private String sex;

    private Book book;

    private Integer uid;

    private String bookName;

    private String cool;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", book=" + book +
                '}';
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getCool() {
        return cool;
    }

    public void setCool(String cool) {
        this.cool = cool;
    }

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public User(int id, String name, String username, String sex) {
        this.id = id;
        this.name = name;
        this.username = username;
        this.sex = sex;
    }

    public User() {
    }
}

Mapper映射层接口

@Mapper
public interface UserMapper {

    /**
     * 查询用户对象
     */
    User selectUser(@Param("user") User user);

    /**
     * 插入用户数据
     */
    int insertUser(User user);

    /**
     * 更新数据
     */
    int updateUser(@Param("user") User user);


    /**
     * 删除用户数据
     */
    int deleteUser(int id);

    /**
     * 批量删除用户数据
     */
    int  deleteUserBatch(@Param("ids") String ids);

    /**
     * 查询所有用户数据
     */
    List<User> selectAll();

    /**
     * 查询单条数据,并转化为Map对象数据
     */
    Map<String,Object> getUserToMap(@Param("id") int id);

    /**
     * 查询多条数据斌并转化为Map对象数据
     */

    List<Map<String,Object>> get100UserToMap();

    /**
     * 查询多条数据并转换为Map对象的数据的第二种方式
     */
    @MapKey("id")
    Map<Integer,User> get100UserToMap2();

    /**
     * 模糊查询
     */
    List<User> selectUserLike(@Param("user") User user);

    /**
     * 动态设置表名查询数据
     */
    List<User> selectUserByTableName(@Param("tableName") String tableName);

	/** 根据用户id查询信息*/
	User getUserById(int id);
	/** 管理其他表一对一查询 */
    User getUserBookById(int id);
}

Mapper接口对应的映射xml文件

关注

Mapper文件我们需要注意的是:
resultTyperesultType用于指定查询结果的类型。它可以是Java的基本数据类型(如int、String等),也可以是自定义的Java对象。MyBatis会根据查询结果的列名和resultType的类型进行自动映射。示例代码如下:

<select id="getUser" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
</select>

resultType指定了查询结果的类型为com.example.User,MyBatis会将查询结果自动映射到User对象中。

parameterTypeparameterType用于指定SQL语句的参数类型。它可以是Java的基本数据类型、Java对象或者是一个Map。示例代码如下:

<insert id="insertUser" parameterType="com.example.User">
   INSERT INTO users (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

parameterType指定了插入语句的参数类型为com.example.User,MyBatis会将User对象的属性值作为参数传递给SQL语句。

id:id用于唯一标识映射文件(或注解)中的语句。它是一个字符串,可以自定义命名,用于在代码中调用对应的SQL语句。示例代码如下:

<select id="getUserById" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
</select>

UserMapper.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.miaow.mybatis.mapper.UserMapper">


    <!--
    resultMap:设置自定义映射
    属性:
    id:表示自定义映射的唯一标识
    type:查询的数据要映射的实体类的类型
    子标签:
    id:设置主键的映射关系
    result:设置普通字段的映射关系
    association:设置多对一的映射关系
    collection:设置一对多的映射关系
    属性:
    property:设置映射关系中实体类中的属性名
    column:设置映射关系中表中的字段名
    -->

    <resultMap id="userMap" type="User">
<!--        实际山和我们数据库字段别名差不多-->
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="username" column="username"></result>
        <result property="sex" column="sex"></result>
        <association property="book" javaType="Book">
            <id property="uid" column="uid"></id>
            <result property="book" column="bookName"></result>
            <result property="cool" column="cool"></result>
        </association>
    </resultMap>


<!--    根据resultMap获取相关数据-->
    <select id="getUserById" resultMap="userMap" parameterType="int">
        select * from user where id = #{id};
    </select>


<!--    管理其他表一对一查询 -->
    <select id="getUserBookById" resultMap="userMap" parameterType="int">
        select a.*,b.uid as uid,b.book as bookName ,b.cool as cool from user a
        left join book b on a.id = b.uid
        where a.id = #{id}
    </select>

    <!--    插入单条数据
    * useGeneratedKeys:设置使用自增的主键
    * keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
    -->
    <insert id="insertUser" parameterType="com.miaow.mybatis.bean.User" useGeneratedKeys="true" keyProperty="id" >
    insert into user values(#{id},#{username},#{name},#{sex})
    </insert>

<!--    更新数据 -->
    <update id="updateUser" parameterType="com.miaow.mybatis.bean.User">
        update user set name = #{user.name} where id = #{user.id}
    </update>

    <!--    删除单条数据-->
    <delete id="deleteUser" parameterType="int">
        delete  from  user where id = #{id}
    </delete>
<!--    批量删除数据-->
    <delete id="deleteUserBatch" parameterType="java.lang.String">
        delete  from  user where id in (${ids})
    </delete>

    <!--   根据ID查询相关数据-->
    <select id="selectUser" resultType="com.miaow.mybatis.bean.User">
        select * from user where id = #{user.id}
    </select>
<!--    查询数据库所有数据-->
    <select id="selectAll" resultType="com.miaow.mybatis.bean.User">
    select * from user
    </select>


    <select id="getUserToMap" resultType="java.util.Map" parameterType="int">
        select * from user where id = #{id};
    </select>
    <select id="get100UserToMap" resultType="java.util.Map">
    select * from user limit 100;

    </select>
    <select id="get100UserToMap2" resultType="java.util.Map">
        select * from user limit 100;
    </select>

    <select id="selectUserLike" resultType="com.miaow.mybatis.bean.User"
            parameterType="com.miaow.mybatis.bean.User">
        select * from user where username like "%" #{user.username} "%"

    </select>
<!--    动态设置表名查询数据 -->
    <select id="selectUserByTableName" resultType="com.miaow.mybatis.bean.User"
            parameterType="java.lang.String">
        select * from ${tableName} limit 100
    </select>
</mapper>

我们根据上述的这个XML文件进行配置进行讲解:
MyBatis实现简单的增删改查也会实现MyBatis实现一些相对复杂的查询功能,其中包括查询List集合,查询一个实体类对象,以及查询单个数据,查询单条为Map的集合和多条Map的集合。

简单的新增

<insert id="insertUser" parameterType="com.miaow.mybatis.bean.User" useGeneratedKeys="true" keyProperty="id" >
    insert into user values(#{id},#{username},#{name},#{sex})
    </insert>

我们通过SQL语句和Xml的配置文件写入SQL,但是不知道眼尖的同学看到没有,这里边我写了插入id,实际上是我架构表的时候,没有使用自增,这算是我的锅,如果你配置了自增,我们有没有发现useGeneratedKeys="true" keyProperty="id" 这个语句?
useGeneratedKeys:设置使用自增的主键,默认为False。

我们在插入数据的时候,我们有时候需要直接插入数据的时候,这个时候我们可能不知道我们插入的主键id是多少
这个时候我们只需要配置 useGeneratedKeys=“true” keyProperty=“id” 然后我们就可以直接拿到我们插入数据的主键id,比如 int value = userMapper.insertUser(user); int id = userVo.getId();//获取插入数据后的主键id

keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中,比如我上面的是绑定的id,那么Mybatis就将返回的id值存入到实体类的与之相同的字段中。

删除单条数据

    <delete id="deleteUser" parameterType="int">
        delete  from  user where id = #{id}
    </delete>

删除多条数据

<!--    批量删除数据-->
    <delete id="deleteUserBatch" parameterType="java.lang.String">
        delete  from  user where id in (${ids})
    </delete>
    public void test8() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        String i = "5,6,7,8,9";
        int V = userMapper.deleteUserBatch(i);
        if(V > 0){
            System.out.println("success");
        }else {
            System.out.println("fail");
        }
    }

查询一个实体类对象

User getUserById(@Param("id") int id);
<select id="getUserById" resultType="com.miaow.mybatis.bean.User">
	select * from t_user where id = #{id}
</select>

${}和#{}

MyBatis获取参数值的两种方式: ${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

#{}#{}是预编译的占位符,它会将参数值作为参数对象的属性值进行处理,并使用预编译语句来执行数据库操作。这种方式可以提供更好的系统安全性,因为参数值会被自动转义,从而防止SQL注入攻击。使用#{}可以有效地防止恶意用户通过参数值注入恶意的SQL代码。

${}${}是字符串替换的占位符,它会将参数值直接替换到SQL语句中。这种方式更加灵活,可以在SQL语句中使用动态的表名、列名或其他字符串。然而,使用${}也带来了一些安全风险,因参数值不会被自动转义,可能会导致SQL注入攻击。因此,使用${}时需要确保参数值的安全性,例如通过输入验证或白名单过滤来防止恶意输入。

${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号
但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号

MyBatis中建议使用#{},原因在于其可以预防SQL注入,而${}无法预防SQL注入

特殊SQL的执行:模糊查询,批量删除,动态设置表名,添加功能获取自增的主键

自定义映射

驼峰配置

主要为了解决java字段和数据库字段不一致问题。我们有两种方式,一种是自定义映射,一种是我们在MyBatis中配置驼峰命名的规则的自动映射。

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

MyBatis的全局配置文件中开启驼峰命名规则的自动映射。通过设置mapUnderscoreToCamelCase属性为true,MyBatis会自动将数据库表的下划线命名转换为Java对象的驼峰命名。

自定义映射resultMap,多对一和一对多映射关系处理

resultMap:设置自定义映射
属性:
id:表示自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
子标签:
id:设置主键的映射关系
result:设置普通字段的映射关系
association:设置多对一的映射关系
collection:设置一对多的映射关系
属性:
property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名

    <resultMap id="userMap" type="User">
<!--        实际山和我们数据库字段别名差不多-->
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="username" column="username"></result>
        <result property="sex" column="sex"></result>
        <association property="book" javaType="Book">
            <id property="uid" column="uid"></id>
            <result property="book" column="bookName"></result>
            <result property="cool" column="cool"></result>
        </association>
    </resultMap>

自定义设置表名

<!--    动态设置表名查询数据 -->
    <select id="selectUserByTableName" resultType="com.miaow.mybatis.bean.User"
            parameterType="java.lang.String">
        select * from ${tableName} limit 100
    </select>
/**动态设置表名查询数据  可以通过@Param注解标识mapper接口中的方法参数此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;*/
List<User> selectUserByTableName(@Param("tableName") String tableName);
    // 动态设置表名查询数据
    @Test
    public void test9() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);
		//根据我们传入的表名查询对应的表信息
        List<User> users = userMapper.selectUserByTableName("user");
        for (User user : users) {
            System.out.println(user);
        }
    }

测试类

public class UserTest {

    @Resource
    private UserService userService;

    //插入单条数据
    @Test
    public void test() throws IOException {
        //仅仅属于Mybatis框架的相关知识解决相关问题
        //首先读取Mybatis配置文件
        InputStream is = Resources.getResourceAsStream("mybatis.xml");
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //创建SqlSession
        //第一个参数为是否自动提交,true为自动提交,false为手动提交,默认为false
        //SqlSession对象,此时通过sqlSession对象所操作的sql都会提交
       SqlSession session = sqlSessionFactory.openSession(true);
        //通过sqlSession对象获取mapper接口对象
        UserMapper userMapper = session.getMapper(UserMapper.class);
        //执行sql,插入数据的时候,我做了一个操作就获取主键的操作,调用的事Mybatis的主键回调功能
        int i = userMapper.insertUser(new User(1,"miaow","罗小黑","1"));
        if(i > 0){
            System.out.println("success");
        }else {
            System.out.println("fail");
        }
        //提交事务
        //session.commit();
        //关闭session
        session.close();
    }

    //查询表中所有数据
    @Test
    public void test2() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        List<User> users = userMapper.selectAll();
        if(users == null && users.size() == 0){
            System.out.println("你查询的表无数据");
            return;
        }
        for (User user : users) {
            System.out.println(user);
        }

        session.close();
    }

    //根据ID查询相关数据
    @Test
    public void test3() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = new User();
        user.setId(82);
        User findById = userMapper.selectUser(user);
        System.out.println(findById);

    }

    //查询单条数据
    @Test
    public void findByIdData() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = userMapper.getUserById(86);
        System.out.println(user);

    }

    //查询单条数据为map集合
    @Test
    public void test4() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        Map<String, Object> userToMap  = userMapper.getUserToMap(520);
        System.out.println(userToMap);

    }

    //查询前100条数据并将数据转换为Map集合
    @Test
    public void test5() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        List<Map<String,Object>> userToMapList = userMapper.get100UserToMap();
        for (Map<String, Object> map : userToMapList) {
            System.out.println(map);
        }
    }

    //查询前100条数据并将数据转换为Map集合方式2
    @Test
    public void findData() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        Map<Integer, User> map = userMapper.get100UserToMap2();
        Set<Integer> integers = map.keySet();
        for (Integer integer : integers) {
            System.out.println(map.get(integer));
        }
    }


    //删除单条数据
    @Test
    public void test6() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        int i = userMapper.deleteUser(82);
        if(i > 0){
            System.out.println("success");
        }else {
            System.out.println("fail");
        }
    }

    //批量删除数据
    @Test
    public void test8() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        String i = "5,6,7,8,9";
        int V = userMapper.deleteUserBatch(i);
        if(V > 0){
            System.out.println("success");
        }else {
            System.out.println("fail");
        }
    }

    //模糊查询
    @Test
    public void test7() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = new User();
        user.setUsername("K");
        List<User> users = userMapper.selectUserLike(user);
        for (User user1 : users) {
            System.out.println(user1);
        }
    }


    // 动态设置表名查询数据
    @Test
    public void test9() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        List<User> users = userMapper.selectUserByTableName("user");
        for (User user : users) {
            System.out.println(user);
        }
    }

    //更新表中数据
    @Test
    public void test10() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = new User();
        user.setId(58);
        user.setName("罗小黑");

        int i = userMapper.updateUser(user);

        if(i > 0){
            System.out.println("success");
        }else {
            System.out.println("fail");
        }
    }

//  association一对一联查
    @Test
    public void test11() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession session = sqlSessionFactory.openSession(true);
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = userMapper.getUserBookById(520);
        System.out.println(user);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品推荐 | 基于Xilinx Zynq-7015 FPGA的MYC-C7Z015核心板

一、产品概述 基于 Xilinx Zynq-7015&#xff0c;双Cortex-A9FPGA全可编程处理器&#xff1b;PS部分(ARM)与PL部分(FPGA)之间采用AXI高速片上总线通信&#xff0c;吉比特级带宽&#xff0c;突破传统ARMFPGA架构的通信瓶颈&#xff0c;通过PL部分(FPGA)灵活配置丰富的外设接口&…

windows 安装 使用 nginx

windows 安装 使用 nginx nginx官网下载地址&#xff1a;https://nginx.org/en/download.html 下载稳定版本即可 下载压缩包解压到即可 进入文件夹中&#xff0c;打开命令行窗口&#xff0c;执行启动命令 start nginx.exe验证&#xff08;默认是80端口&#xff09;&#x…

产品经理-原型绘制(五)

1. 概念 用线条、图形描绘出的产品框架&#xff0c;也称为线框图&#xff0c;是需求和功能的具体化表现 2. 常用工具 Axure 3. 类别 3.1 草图原型 手绘图稿&#xff0c;修改方便&#xff0c;规划的早期使用 3.2 低保真原型 简单交互&#xff0c;无设计图&#xff0c;无需…

【Docker】2、配置SSL证书远程访问Docker

1、使用 openssl 生成 ca 1、创建文件夹 mkdir -p /root/dockercd /root/docker2、创建 RSA 私钥 会提示 2 次输入证书密码&#xff0c;至少 4 位&#xff0c;创建后会生成一个 ca-key.pem 文件 openssl genrsa -aes256 -out ca-key.pem 4096得到 ca-key.pem 文件 3、创建…

桌面上怎么记工作任务更加合理?能设置桌面提醒的便签软件

在快节奏的现代工作中&#xff0c;电脑已成为我们处理工作的主要工具。每天&#xff0c;我们都要面对电脑屏幕&#xff0c;处理大量的工作任务。为了更好地管理这些琐碎却重要的工作&#xff0c;将工作任务直接记录在桌面上&#xff0c;随时查看和调整&#xff0c;无疑是一种高…

什么是边缘计算网关?工业方向应用有哪些?天拓四方

在数字化时代&#xff0c;信息的传输与处理变得愈发重要&#xff0c;而其中的关键节点之一便是边缘计算网关。这一先进的网络设备&#xff0c;不仅扩展了云端功能至本地边缘设备&#xff0c;还使得边缘设备能够自主、快速地响应本地事件&#xff0c;提供了低延时、低成本、隐私…

【FPGA】Verilog语言从零到精通

接触fpga一段时间&#xff0c;也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇&#xff1a;Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架&#xff1a;模块的结构 类比&#xff1a;c语言的基础…

5款ai文案自动生成器,让你写作爆款文案不犯难!

现如今&#xff0c;无论是用于社交媒体、广告宣传、网站内容还是其他各种领域&#xff0c;优秀的文案都能吸引更多的关注和流量。但是&#xff0c;对于许多创作者来说&#xff0c;想要创作出高质量的文案并非易事&#xff0c;常常会面临灵感枯竭、思路卡顿等问题。而现在有了一…

Python开发:简单的密码爆破工具

当我们进行在线密码破解时&#xff0c;使用 BurpSuite 以及 wfuzz 足以应对大部分网站应用场景。但是在遇到一些特殊情况时我们还是需要自己来开发密码爆破工具&#xff0c;本文将介绍如何使用Python开发一款简单的密码爆破工具。 0x01 背景介绍 密码破解 记得有大佬曾经说过…

企业网络的“瑞士军刀”:探索“一端多能”设备的多面性

在数字化时代&#xff0c;企业网络需求的复杂性和多样性不断增长&#xff0c;传统的单一功能网络设备已难以满足这些需求。企业需要一种集多种功能于一身的“一端多能”网络设备&#xff0c;以应对各种网络环境和业务需求&#xff0c;就像是一把多功能、灵活、可靠的瑞士军刀&a…

函数编程实际应用-异步任务

背景 常见的函数式接口&#xff0c;就是对函数编程的应用Runnable 没有返回值的函数式接口Callable 有返回值的函数式接口 使用线程池 一般来说&#xff0c;很少使用new Thread&#xff08;函数对象&#xff09;这种方式来直接 创建线程&#xff0c;更多的时候使用的线程成来集…

SOL 交易机器人基本知识

有没有可以盈利的机器人&#xff1f; 是的&#xff0c;各行各业都有许多盈利机器人。在金融领域&#xff0c;交易机器人被广泛用于自动化投资策略并根据预定义的算法执行交易。这些机器人可以分析市场趋势并做出快速决策&#xff0c;从而可能带来可观的回报。同样&#xff0c;在…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述&#xff1a; 关于BGT24LTR11N16&#xff0c;它是一款用于信号生成和接收的硅锗雷达MMlC&#xff0c;工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器&#xff08;VCO&#xff09;。 这颗芯片是属于1T1R&#xff0c;也就是一发一收…

linux开发之设备树五、设备树描述中断实践

设备树是基于设备总线模型的&#xff08;platform&#xff09; 1、添加节点 假设中断引脚为&#xff1a;GPIO0_B5 下面使用设备树来描述它 1、写节点&#xff0c;起节点名字 这里用了ft5x06的触摸芯片&#xff0c;然后I2C的地址为38 2、为节点添加属性 首先添加compatible…

【CALayer-时钟练习-CADisplayLink Objective-C语言】

一、我们接着来看,这个CADisplayLink啊, 1.刚才我们说那个时间呢,差上1秒钟的样子,然后呢,我们现在呢,用这个叫做CADisplayLink的东西,来解决,用这个类,来解决啊, 我们说,NSTimer,是跑到这儿了以后,一秒钟以后, 它才会执行,这个timeChange方法,真正的时间,不…

【NumPy】深入理解NumPy的dot函数:矩阵乘法与点积运算详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案

一、找不到my.ini配置文件 MySQL 8 安装或启动过程中&#xff0c;如果系统找不到my.ini文件&#xff0c;通常意味着 MySQL服务器没有找到其配置文件。在Windows系统上&#xff0c;MySQL 8 预期使用my.ini作为配置文件&#xff0c;而不是在某些情况下用到的my.cnf文件。 通过 …

报错注入常用的三种注入方式(flool ,extractvalue、updatexml)

报错注入常用的三种注入方式(flool ,extractvalue、updatexml) 在学习sql注入的过程中经常会遇到一些没有显示位的sql注入靶场&#xff0c;所以一般的注入的方式就无法再使用&#xff0c;在这种情况下我们可以使用函数报错注入的方式&#xff0c;通过报错查询和显示我们想要得到…

【教学类-59-】专注力视觉训练01(圆点百数图)

背景需求&#xff1a; 视觉训练的神奇效果&#xff0c;让你的宝贝成为焦点 - 小红书魔法视觉追踪-视觉训练—— &#x1f50d;视觉训练&#x1f50d; &#x1f539;想要提高宝宝的专注力&#xff0c;视觉训练是个绝佳方法&#xff01; &#x1f539;让宝宝仔细观察数字的路线&a…

PageHelper多数据源无法自动切换数据源问题解决

在使用PageHelper进行分页处理的过程中&#xff0c;通过配置autoRuntimeDialect: true发现&#xff0c;在执行MySQL分页处理后&#xff0c;继续执行SqlServer的分页&#xff0c;使用的仍然是MySQL的语法&#xff0c;PageHelper并没有进行自动切换数据源处理。 在查看源码的时候…