MyBatis进阶篇

news2024/11/15 23:57:58

MyBatis

  • MyBtias工具类
  • 参数
    • 入参
      • 参数是单个参数
      • 参数是多个参数
      • 入参是POJO对象
      • 入参是Map类型
  • 自动主键增长
  • #{}和${}两种获取参数方式
  • 结果映射
  • 动态SQL
  • MyBatis多表查询
  • MyBatis注解开发

MyBtias工具类

  • SessionUtils.java

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;

public class SessionUtils {

    static SqlSessionFactory factory=null;

    //在静态代码块创建会话工厂对象
    static {

        try {
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
             factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //定义静态方法获取会话对象,自动提交事务
    public static SqlSession getSqlSession(){
        SqlSession session = factory.openSession(true);
        //返回给调用者会话对象
        return session;
    }

    //定义静态方法获取会话对象,方法调用者传递参数决定是否提交事务
    public static SqlSession getSqlSession(boolean isAutoCommit){
        SqlSession session = factory.openSession(isAutoCommit);
        //返回给调用者会话对象
        return session;
    }

    //接受会话对象,手动提交事务关闭会话对象
    public static void commitAndClose(SqlSession session){
        //判断session是否为空
        if(session!=null){
            //手动提交事务
            session.close();
            //关闭会话对象
            session.close();
        }
    }

    //接受会话对象,回滚事务关闭会话
    public static void rollbackAndClose(SqlSession session){
        //判断session是否为空
        if(session!=null){
            //回滚事务
           session.rollback();
            //关闭会话对象
            session.close();
        }
    }
}

参数

输入参数输出参数
HashMapHashMap
String、IntegerString、Integer
POJOPOJO

入参

参数是单个参数

    /**
     * 查询单个用户ID
     * @param id
     * @return
     */
    User queryById(Integer id);
    <select id="queryById"  resultType="user">
        select * from user where id=#{id}
    </select>

使用#{任意标识符},但是一般见名知意。

参数是多个参数

方式1:使用参数的索引获取arg0 arg1(舍弃,一般不用)

    /**
     * 根据用户名和性别查询用户
     * @param userName
     * @param sex
     * @return
     */
    User queryByUserNameAndSex(String userName,String sex);
    <select id="queryByUserNameAndSex" resultType="user">
       select * from user where user_name=#{arg0} and sex=#{arg1}
     </select>

方式2:使用参数的位置获取param0 param1(舍弃,一般不用)

    /**
     * 根据用户名和性别查询用户
     * @param userName
     * @param sex
     * @return
     */
    User queryByUserNameAndSex(String userName,String sex);
    <select id="queryByUserNameAndSex" resultType="user">
       select * from user where user_name=#{param1} and sex=#{param2}
     </select>

方式3:使用@Param注解(重点掌握)

    /**
     * 根据用户名和性别查询用户
     * @param userName
     * @param sex
     * @return
     */
    User queryByUserNameAndSex(@Param(value = "userName") String userName,
                               @Param(value = "sex") String sex);
    <select id="queryByUserNameAndSex" resultType="user">
       select * from user where user_name=#{userName} and sex=#{sex}
     </select>

入参是POJO对象

接口方法传入pojo类型的数据时,xml中使用#{pojo属性名称}可直接获取传入对象对应的属性值

    /**
     * 添加=用户
     * @param user
     * @return
     */
    void addUser(User user);
    <insert id="addUser">
        insert into user value (null,#{userName},#{birthday},#{sex},#{address})
    </insert>

入参是Map类型

接口方法传入Map类型的数据时,xml中使用#{map中key}可直接获取map中的value值

    /**
     * 根据性别和地址查询用户
     * @param map
     * @return
     */
    List<User> querySexAndAddress(Map<String, String> map);
    <select id="querySexAndAddress" resultType="user">
       select * from user where sex=#{sex} and address=#{address}
     </select>
    @Test
    public void test2() throws Exception {
        SqlSession sqlSession = SessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String,String> map=new HashMap<>();
        map.put("sex","男");
        map.put("address","河南");
        List<User> users = mapper.querySexAndAddress(map);
        users.forEach(u-> System.out.println(u));
        sqlSession.close();
    }

自动主键增长

新增一条数据,主键自动增长,查询主键值
使用insert标签的属性useGeneratedKeys,keyProperty,keyColumn实现;

属性说明
useGeneratedKeystrue 获取自动生成的主键,相当于select last_insert_id()
keyColumn表中主键的列名
keyProperty实体类中主键的属性名
    <insert id="addUser2" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into user value (null,#{userName},#{birthday},#{sex},#{address})
    </insert>

#{}和${}两种获取参数方式

1.使用#{}的sql是进行预编译的,可以防止sql注入;
2.

$ {id} 获取id值时,必须使用命名参数取值@param;
如果是取单个值,也可使用${value}获取;
参数值直接拼接到sql中,会有sql注入的风险;
在这里插入图片描述

结果映射

mybatis框架提供了resultType和resultMap
resultType返回值
① 返回值是基本数据类型,int string
②返回值是POJO对象,返回POJO对象的全限定名
③返回值是List POJO对象时,返回POJO对象的全限定名
④返回值是Map对象时,返回map
⑤返回值是多个Map对象时,使用注解@MapKey(指定字段名称)

    @MapKey("id")
    Map<Integer,User> getUsers();

在这里插入图片描述
resultMap主要解决数据库字段名称与POJO类属性名称不一致
完成高级查询,比如一对一 一对多 多对多

 <resultMap id="u" type="user">
        <id column="id" property="id"></id>
        <result column="user_name" property="userName"></result>
 </resultMap>
 
 <select id="getUsers2" resultMap="u">
       select * from user where id=1
 </select>

动态SQL

if:判断条件
choose when otherwise:分支判断
where标签
set标签
foreach标签
if标签:

<if test="判断条件">
     sql语句块
</if>

如果判断条件为true,执行sql语句块,否则不执行

   /**
    * 查询所有男性,如果输入用户名模糊查询,否则只查询男性
    */
   List<User> queryMale(@Param(value = "userName")String userName);
    <select id="queryMale" resultType="user">
       select * from user
       where sex='男'
       <if test="userName!=null and userName.trim()!=''">
           and user_name like concat('%',#{userName},'%')
       </if>
     </select>
    @Test
    public void test() throws Exception {
        SqlSession sqlSession = SessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.queryMale(null);
        users.forEach(u-> System.out.println(u));
        sqlSession.close();
    }

choose when otherwise:分支选择
when test条件满足执行语句,若条件都不满足,执行otherwise

   /**
    * 编写一个查询方法,设置两个参数,一个是用户名,一个是住址。
    * 根据用户名或者住址查询所有男性用户:
    * 	如果输入了用户名则按照用户名模糊查找,
    * 	否则就按照住址查找,两个条件只能成立一个,
    * 	如果都不输入就查找用户名为“孙悟空”的用户。
    */
   List<User> queryChoose(@Param(value = "userName") String userName,
                          @Param(value = "address") String address);
    <select id="queryChoose" resultType="user">
        select * from user
        where sex='男'
        <choose>
            <when test="userName !=null and userName.trim()!=''">
                and user_name like concat('%',#{userName},'%')
            </when>
            <when test="address !=null and address.trim()!=''">
                and address=#{address}
            </when>
            <otherwise>
                and user_name='孙悟空'
            </otherwise>
        </choose>
    </select>
    @Test
    public void test2() throws Exception {
        SqlSession sqlSession = SessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.queryChoose(null, "开封");
        users.forEach(u-> System.out.println(u));
        sqlSession.close();
    }

where标签
加where关键字
被where标签包裹的sql会自动去除多余的and或者or关键字

   /**
    * 如果只输入了用户名按照用户名进行查询;
    * select * from user where user_name like concat('%',#{userName},'%');
    * 如果只输入住址,按住址进行查询
    * select * from user where address=#{address};
    * 如果两者都输入,则按照两个条件查询
    * select * from user where user_name like concat('%',#{userName},'%') and address=#{address};
    * 如果两者都不合符条件,全表查询;
    * select * from user
    */
   List<User> queryWhere(@Param(value = "userName") String userName,
                          @Param(value = "address") String address);
    <select id="queryWhere" resultType="user">
        select * from user
        <where>
            <if test="userName !=null and userName.trim()!=''">
                user_name like concat('%',#{userName},'%')
            </if>
            <if test="address !=null and address.trim()!=''">
                and address=#{address}
            </if>
        </where>
    </select>

set标签
加set关键字
去除最后多余的逗号

   /**
    * 修改用户信息 如果某个属性为null,则不修改
    */
   void updateSet(User user);
  <update id="updateSet">
        update user
        <set>
            <if test="userName!=null">
            user_name=#{userName},
            </if>
            <if test="birthday !=null">
                birthday=#{birthday},
            </if>
            <if test="sex!=null">
                sex=#{sex},
            </if>
            <if test="address!=null">
                address=#{address},
            </if>
        </set>
        where id=#{id}
    </update>
    @Test
    public void test3() throws Exception {
        SqlSession sqlSession = SessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User u=new User();
        u.setUsername("杨民民");
        u.setBirthday(new Date());
        u.setSex("女");
        u.setAddress(null);
        u.setId(8);
        mapper.updateSet(u);
        sqlSession.close();
    }

foreach:遍历集合或数组
collection属性:接收的集合或者数组,集合名或者数组名
item属性:集合或者数组参数中的每一个元素
separator属性:标签分隔符
open属性:以什么开始
close以什么结束

   /**
    * 按照id值是1、2、3来查询用户
    */
   List<User> findByIds(@Param("ids") List<Integer> ids);
    <select id="findByIds" resultType="user">
        select * from user
        where id in
        <foreach collection="ids" item="item" separator="," open="(" close=")">
            #{item}
        </foreach>
    </select>
    @Test
    public void test4() throws Exception {
        SqlSession sqlSession = SessionUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<Integer> ls=new ArrayList<>();
        Collections.addAll(ls,1,2,3);
        List<User> byIds = mapper.findByIds(ls);
        byIds.forEach(u-> System.out.println(u));
        sqlSession.close();
    }

MyBatis多表查询

表与表的关系:一对一,一对多,多对多
数据库环境准备:

DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_name` varchar(32) NOT NULL COMMENT '商品名称',
  `item_price` float(6,1) NOT NULL COMMENT '商品价格',
  `item_detail` text COMMENT '商品描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_item
-- ----------------------------
INSERT INTO `tb_item` VALUES ('1', 'iPhone 6', '5288.0', '苹果公司新发布的手机产品。');
INSERT INTO `tb_item` VALUES ('2', 'iPhone 6 plus', '6288.0', '苹果公司发布的新大屏手机。');
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int(10) DEFAULT NULL COMMENT '年龄',
  `sex` int(11) DEFAULT NULL COMMENT '0-女 1-男',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123456', '张三', '30', '1');
INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456', '李四', '21', '0');
INSERT INTO `tb_user` VALUES ('3', 'wangwu', '123456', '王五', '22', '1');
INSERT INTO `tb_user` VALUES ('4', 'zhangwei', '123456', '张伟', '20', '1');
INSERT INTO `tb_user` VALUES ('5', 'lina', '123456', '李娜', '28', '0');
INSERT INTO `tb_user` VALUES ('6', '蔡徐坤', '123', '小菜', '18', '1');

DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `order_number` varchar(20) NOT NULL COMMENT '订单号',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_1` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_order
-- ----------------------------
INSERT INTO `tb_order` VALUES ('1', '1', '20140921001');
INSERT INTO `tb_order` VALUES ('2', '2', '20140921002');
INSERT INTO `tb_order` VALUES ('3', '1', '20140921003');
DROP TABLE IF EXISTS `tb_orderdetail`;
CREATE TABLE `tb_orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(32) DEFAULT NULL COMMENT '订单号',
  `item_id` int(32) DEFAULT NULL COMMENT '商品id',
  `total_price` double(20,0) DEFAULT NULL COMMENT '商品总价',
  `status` int(11) DEFAULT NULL COMMENT '状态',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`order_id`),
  KEY `FK_orderdetail_2` (`item_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`order_id`) REFERENCES `tb_order` (`id`),
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`item_id`) REFERENCES `tb_item` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_orderdetail
-- ----------------------------
INSERT INTO `tb_orderdetail` VALUES ('1', '1', '1', '5288', '1');
INSERT INTO `tb_orderdetail` VALUES ('2', '1', '2', '6288', '1');
INSERT INTO `tb_orderdetail` VALUES ('3', '2', '2', '6288', '1');
INSERT INTO `tb_orderdetail` VALUES ('4', '3', '1', '5288', '1');

一对一查询
resultMap标签中子标签association实现一对一查询
通过订单编号20140921003查询出订单信息,并查询出下单人信息。
说明:一个订单只能对应一个用户信息;

    /**
     * 根据订单号查询下单人信息
     * @param orderNumber
     * @return
     */
    Order findOrderByNumber(@Param("orderNumber")String orderNumber);
    <!--
        实现一对一查询
        1.resultMap标签实现多表查询
        2.通过id="queryOneToOneResultMap"的属性值关联下面的sql语句,和下面select标签的resultMap="queryOneToOneResultMap"属性值一致
        3.type="Order" : 表示接口方法 Order queryOneToOne(@Param("orderNumber") String orderNumber);返回值类型
        4.多表查询一定书写autoMapping="true"
    -->

    <resultMap id="queryOneToOneResultMap" type="Order" autoMapping="true">
        <id column="id" property="id"></id>
        <result column="order_number" property="orderNumber"></result>
        <association property="user" javaType="User" autoMapping="true">
            <id column="id" property="id"></id>
            <result column="user_name" property="userName"></result>
        </association>

    </resultMap>
    <select id="findOrderByNumber" resultMap="queryOneToOneResultMap">
        SELECT *
        FROM tb_user u INNER JOIN tb_order o ON u.id=o.user_id
        WHERE o.order_number=#{orderNumber}
    </select>
    @Test
    public void test1(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        Order orderByNumber = mapper.findOrderByNumber("20140921003");
        System.out.println(orderByNumber);
        sqlSession.close();
    }

一对多查询
resultMap标签中子标签collection实现一对多查询
property 映射的类中属性名称
javaType list
ofType 集合泛型
查询id为1的用户及其订单信息

    /**
     * 查询id为1的用户及其订单信息
     * id=1的用户只要1个
     * 订单表中用户id的订单可能有多个
     */
    User findOrdersById(@Param("id")Integer id);
    <resultMap id="queryOneToSomeResultMap" type="User" autoMapping="true">
        <id column="id" property="id"></id>
        <collection property="orderList" javaType="List" ofType="Order" autoMapping="true">
            <id column="oid" property="id"></id>
        </collection>
    </resultMap>
    <select id="findOrdersById" resultMap="queryOneToSomeResultMap">
        SELECT u.*,o.id AS oid,o.order_number AS orderNumber
        FROM tb_user u INNER JOIN tb_order o ON u.id=o.user_id
        WHERE u.id=#{id}
    </select>
    @Test
    public void test2(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession(false);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findOrdersById(1);
        System.out.println(user);
        sqlSession.close();
    }

MyBatis注解开发

@Select查询
@Insert新增
@Update修改
@Delete删除
@Options 可选配置(主键回填)
这里只举例@Insert注解,其它注解类似。

    //定义方法实现注解插入数据到tb_user表中
    /*
        #{userName} : 因为addUser方法的形参类型是复杂类型pojo即User实体类,所以这里大括号中书写的内容userName看User实体类中的成员变量userName
        或者User实体类中的getUserName() 去掉get将U变为u即userName

     */
    @Insert("insert into tb_user values (null,#{userName},#{password},#{name},#{age},#{sex})")
    void addUser(User user);
    
    @Test
    public void addUser(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user=new User();
        user.setUserName("hhh");
        user.setPassword("123456");
        user.setName("哈哈哈");
        user.setAge(1);
        user.setSex(0);
        mapper.addUser(user);
        sqlSession.close();
    }

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

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

相关文章

当HR问你:“什么事会让你有成就感”你该怎么回答?【文章底部添加进大学生就业交流群】

当HR问你“什么事会让你有成就感”时&#xff0c;你可以通过以下方式回答&#xff1a; 强调目标实现&#xff1a; 表达你在达成挑战性目标时感到的满足感。举例说明你在过去的工作或项目中如何设定并成功实现了目标。 强调对团队成功的贡献&#xff1a; 谈论你与团队合作取得成…

力扣每日一题 将标题首字母大写 模拟 String API

Problem: 2129. 将标题首字母大写 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public String capitalizeTitle(String title)…

leetcode 25、k个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…

项目实战-tpshop商城项目

项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…

API接口数据集接口pytorch api接口获取数据

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

这五款高性能骨传导耳机入手不后悔!附带骨传导耳机选购攻略!

随着健康生活的逐渐流行&#xff0c;越来越多的人开始注重运动和健身&#xff0c;在这一背景下&#xff0c;骨传导耳机作为当下最热门的健身装备&#xff0c;已成为市场上最受欢迎的产品之一&#xff0c;随着骨传导耳机的热度增高&#xff0c;与此同时也引发了一些不良商家和劣…

第八十天 WAF攻防-漏洞利用HPP污染分块传输垃圾数据

第80天 WAF攻防-漏洞利用&HPP污染&分块传输&垃圾数据 参考点&#xff1a; #将MySQL注入函数分为几类 拆分字符串函数&#xff1a;mid、1eft、1pad等 编码函数&#xff1a;ord、hex、a3ci等 运算函数&#xff1a;*/&^&#xff01;1 ike rlike reg等 空格替换部…

如何制作产品介绍二维码(一):编辑二维码内容

本篇主要以官方模板「产品详情介绍」为例&#xff0c;教大家如何从0开始制作单个产品介绍二维码&#xff0c;在掌握操作技巧后&#xff0c;你也能快速制作出一个效果不错的二维码。 该教程主要分以下4个部分&#xff1a; 编辑内容&#xff1a;指的是如何把图片、文件、音视频…

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目&#xff0c;第一道题目我没用这种方法&#xff0c;但还是做出来了&#xff0c;用的一种比较特殊的思考方法&#xff0c;就是把每一个点都判断出来&#xff0c;不满足要求的就舍弃&#xff0c;…

ElasticSearchLinux安装和springboot整合的记录和遇到的问题

前面整合遇到的一些问题有的记录在下面了&#xff0c;有的当时忘了记录下来&#xff0c;希望下面的能帮到你们 1&#xff1a;Linux安装ES 下载安装&#xff1a; 参考文章&#xff1a;连接1 连接2 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch…

如何关闭微软的Edge浏览器右击提示的:“使用copilot重写“的提示?

最近在使用微软的edge浏览器写文档的时候&#xff0c;总是不小心右击鼠标&#xff0c;提示 有时候挺烦人的&#xff0c;那怎么关闭呢&#xff1f; 打开edge浏览器的设置 在设置中搜索AI&#xff0c;并关闭AI书写的选项就好了 这样就可以获得一个干净的界面了&#xff0c;不…

SPEL表达式及注入漏洞

SPEL,全称为Spring表达式语言&#xff0c;是一个由 Spring 框架提供的表达式语言。它是一种基于字符串的表达式语言&#xff0c;可以在运行时对对象进行查询和操作。 SpEL 支持在XML和注解配置中使用&#xff0c;它可以在Spring框架的各种组件中使用&#xff0c;如Spring MVC …

Visual grounding-视觉定位任务介绍

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

知识图谱技术综述

作者简介:徐增林(1980 − ),男,博士,教授,主要从事机器学习及其在社会网络分析、互联网、计算生物学、信息安全等方面的研究. 【摘要】 知识图谱技术是人工智能技术的重要组成部分,其建立的具有语义处理能力与开放互联能力的知识库,可在智能搜索、智能问答、个性化推…

Java中抽象类和接口有什么区别?

1、典型回答 接口和抽象类都是用来定义对象公共行为的&#xff0c;二者的主要区别有以下几点不同&#xff1a; 类型扩展不同&#xff1a;抽象类是单继承&#xff0c;而接口是多继承&#xff08;多实现&#xff09;方法/属性访问控制符不同&#xff1a;抽象类方法和属性使用访问…

Yolov8-车辆跟踪(BoT-SORT和ByteTrack算法)

这两种代码都是成熟的&#xff0c;直接调佣即可&#xff0c;下面是使用这两种算法的代码。 直观感受&#xff1a;ByteTrack预测的速度感觉比BoT-SORT快一些&#xff0c;流畅一些。 from ultralytics import YOLOmodel YOLO(yolov8n.pt)# results model.track(source".…

人工智能迷惑行为大赏

文章目录 每日一句正能量前言人工智能的“幽默”瞬间美好愿景背后的潜规则人工智能应用人脸识别视频监控分析自动驾驶/驾驶辅助 后记 每日一句正能量 把坚持当成一种习惯&#xff0c;别人光鲜的背后&#xff0c;都有加倍的付出&#xff0c;没有谁比谁更容易&#xff0c;只有谁比…

蚂蚁链摩斯荣获“艾瑞保险业数字化卓越服务商“奖

近日&#xff0c;艾瑞咨询发布《2023年中国保险业数字化转型研究报告》&#xff0c;摩斯隐私计算解决方案被报告入选&#xff0c;并获得“保险业数字化卓越服务商”奖。 蚂蚁摩斯是隐私计算行业的领先布局者&#xff1a;早在2017年&#xff0c;蚂蚁集团启动了隐私计算项目&…

【存储】ZYNQ+NVMe小型化全国产存储解决方案

文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…