mybatis语法进阶1

日志的使用

我们在使用MyBatis的时候, 其实MyBatis框架会打印一些必要的日志信息, 在开发阶段这些日志信息对我们分析问题,理解代码的执行是特别有帮助的; 包括项目上线之后,我们也可以收集项目的错误日志到文件里面去; 所以我们采用专门的日志系统来处理.
步骤

  1. 导入坐标
  2. 拷贝日志配置文件到项目
    讲解
    • 导入坐标
<!--log start-->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.6</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.6</version>
</dependency>
<!--log end-->

• log4j.properties

#日志输出级别,最低级别为DEBUG,输出到stdout
#error > warn > info > debug > trace
log4j.rootLogger=DEBUG,stdout
#输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#可以灵活的指定布局模式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#时间
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %t %l %d %rms:%m%n
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:\\test\\mm_backend.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS\} %-5p [%t] {%c}-%m%n

log4j.rootLogger=INFO, stdout , R

此句为将等级为 INFO 的日志信息输出到 stdout 和 R 这两个目的地,stdout 和 R 的定义在下面的代码,可 以任意起名。等级可分为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置 OFF 则不打出任何信息, 如果配置为 INFO 这样只显示 INFO, WARN, ERROR 的 log 信息,而 DEBUG 信息不会被显示,具体讲解可参照 第三部分定义配置文件中的 logger。

使用Mybatis完成CRUD

需求

使用Mybatis完成CRUD

新增用户

步骤:

AspectJ 切面注解中五种通知注解:@Before、@After、@AfterRunning、@AfterThrowing、@Around
https://blog.csdn.net/u010502101/article/details/78823056

  1. UserDao中添加新增方法
public interface UserDao {/*** 添加用户* @param user  要添加到数据库的数据* @return      受到影响的行数*/public int addUser(User user);
}
  1. 在UserDao.xml中加入新增配置
<insert id="addUser" parameterType="User">//因为配置文件里起了别名,所以这里直接User就行了,不然还是要写全路径。insert into t_user (username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address})//占位符见下面根据id查询的xml里面有说明。
</insert>
  1. 添加操作测试
public class TestMybatis {private UserDao userDao;private SqlSession sqlSession;private InputStream is;//用这个注解,执行@Test之前会先执行这个方法public void init() throws IOException {//1.让mybatis框架去加载主配置文件//1.1 将主配置文件SqlMapConfig.xml转换成字节输入流is = Resources.getResourceAsStream("SqlMapConfig.xml");//1.2创建一个SqlSessionFactoryBuilderSqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();//1.3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = factoryBuilder.build(is);//1.4使用sqlSessionFactory对象创建处SqlSession对象sqlSession = sqlSessionFactory.openSession();//使用了工厂模式//2.使用sqlSession对象创建处UserDao接口的代理对象userDao = sqlSession.getMapper(UserDao.class);//使用了动态代理}public void testAddUser(){//3.调用userDao代理对象的addUser()方法添加用户User user = new User(null,"zl","男",new Date(),"成都");//注意!这里是null,pojo里面id必须为Integer类型!int类型不能为null。userDao.addUser(user);//目标是添加完用户之后,获取到该用户的id,可以在以后的多表中,进行关联查询System.out.println(user.getUid());//这个说明见下面这个}//获取从pojo获取//同理,@Test之后执行这个。public void destroy() throws IOException {//提交事务sqlSession.commit();//4.关闭资源sqlSession.close();is.close();}
}

新增用户 id 的返回值

新增用户后, 同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。
• SelectKey获取主键
在这里插入图片描述

<!--我们可以发现, 这个 sql 语句中使用#{}字符, #{}代表占位符,我们可以理解是原来 jdbc 部分所学的?,它们都是代表占位符, 具体的值是由 User 类的属性来决定的,前提必须名字pojo里面的名字和占位符里面的一样,才会给匹配上去。然后sql前面的名字是和数据库里字段名匹配。parameterType 属性:代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。selectKey标签: 查询主键keyColumn 表示要查询的列名keyProperty 表示要赋值的属性名,返回的赋值给pojo了resultType 表示查询出来的结果的类型order 表示在前或者在后执行select last_insert_id() 查询最后一个自增长的id的值
-->
<insert id="addUser" parameterType="User"><selectKey resultType="int" order="AFTER" keyProperty="uid" keyColumn="uid">select last_insert_id()</selectKey>insert into t_user (username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address})
</insert>

根据id查询用户(会被修改方法调用)

 UserDao添加根据id查询的方法

public User findById(Integer id);

 UserDao.xml文件中新增配置

<select id="findById" parameterType="int" resultType="User">select * from t_user where uid=#{uid}
</select>

修改用户(测试时会调用根据Id查询方法)

 UserDao添加修改的方法

public void updateUser(User user);

 UserDao.xml文件中新增配置

<update id="updateUser" parameterType="User">update t_user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where uid=#{uid}
</update>

 测试:
先调用根据id查询要修改的人的信息,再修改。所以,xml文件里应该修改所有的信息,在这里不能单个修改。
在这里插入图片描述

删除用户

 UserDao中添加删除方法
public int deleteById(int id);

 UserDao.xml文件中新增配置

<delete id="deleteById" parameterType="int">delete from t_user where uid=#{id}
</delete>

注意:
数据库删除中间的任意一行后,比如删除第3个。原来顺序是1234,会变成124。就是不是一个完整的顺序了!!!如果想调整成完整的顺序,就需要别的操作来操作一下。

模糊查询

方式一(不推荐使用)

 UserDao中添加模糊查询方法

public List searchByUsername(String name);

 UserDao.xml文件中新增配置

<select id="searchByUsername" parameterType="String" resultType="User">select * from t_user where username like #{name}
</select>

 测试方法
查询名字里有l的。


public void testSearchByUsername(){List<User> userList = userDao.searchByUsername("%l%");for (User user : userList) {System.out.println(user);}
}
方式二

 UserDao中添加模糊查询方法

public List searchByUsername(String name);

 UserDao.xml文件中新增配置

<!--模糊查询另外一种在SQL语句中引用方法的参数的方式:${}1. 引用pojo中的属性: '${属性名}'2. 引用简单类型的参数: '${value}',但是高版本的mybatis中可以'${任意字符串}'
-->
<select id="searchByUsername" parameterType="String" resultType="User">方式一:<!--select * from t_user where username like "%"#{name}"%"-->方式二:<!--select * from t_user where username like concat("%",#{name},"%")-->select * from t_user where username like "%${value}%"
//方式三:才是最常用。
</select>

 测试方法


public void testSearchByUsername(){List<User> userList = userDao.searchByUsername("l");//上面三个都是传一个l就行。for (User user : userList) {System.out.println(user);}
}
#{}与${}的区别
  1. #{}一定不能写在引号里面,${}一定要写在引号里面,因为他是字符串拼接
  2. 如果是pojo、map类型的参数,无论是#{}还是${}里面都是属性名
  3. 如果是简单类型的参数,#{}里面可以写任意字符串,但是${}里面只能写value(以前的版本)
  4. 如果使用#{}引入参数的话,其实是先使用?这个占位符,然后再设置参数;而使用${}引入参数的话,是直接拼接SQL语句
    建议尽量使用#{}。

SqlSessionFactory工具类的抽取

上面是使用前置通知和后置通知@Before和@After,我们也可以把这些相同的步骤放在同一个工具类Utils里。

步骤:

  1. 创建SqlSessionFactoryUtils
    在这里插入图片描述
  2. 定义一个openSqlSession ()方法获得sqlSession
  3. 定义释放资源方法
  4. 保证SqlSessionFactory只有一个(静态代码块)

实现:

package com.gavin.utils;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;
import java.io.InputStream;/*** 1. 类加载的时候就创建出来了一个SqlSessionFactory对象* 2. 我们得声明一个方法,用于创建SqlSession对象,因为每次执行SQL语句的sqlSession对象不能是同一个*/
public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {try{//1 将主配置文件SqlMapConfig.xml转换成字节输入流InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");//2创建一个SqlSessionFactoryBuilderSqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();//3使用factoryBuilder对象加载字节输入流,创建 SqlSessionFactory对象sqlSessionFactory = factoryBuilder.build(is);is.close();} catch (IOException e) {e.printStackTrace();}}/*** 创建SqlSession对象* @return*/public static SqlSession openSqlSession(){return sqlSessionFactory.openSession();}/*** 提交事务并且关闭SqlSession* @param sqlSession*/public static void commitAndClose(SqlSession sqlSession){sqlSession.commit();sqlSession.close();}/*** 回滚事务并且关闭SqlSession* @param sqlSession*/public static void rollbackAndClose(SqlSession sqlSession){sqlSession.rollback();sqlSession.close();}
}

测试

public class TestSqlSessionFactoryUtils {public void test1(){//1. 创建SqlSession对象SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();//2. 创建UserDao的代理对象UserDao userDao = sqlSession.getMapper(UserDao.class);//3. 调用userDao对象的findById()方法System.out.println(userDao.findById(6));//4. 关闭资源,提交事务SqlSessionFactoryUtils.commitAndClose(sqlSession);}
}

parameterType深入

传递简单类型

单个参数,方法就以简单类型传入即可,那么在映射配置文件中的parameterType的值就是这个简单类型的别名;在SQL语句中引入简单类型的参数#{任意字符串}
User findById(int id);

select * from t_user where uid=#{id}

传递 pojo 对象 或者 Map

  1. 将多个参数封装到一个POJO中,那么在映射配置文件中parameterType的值就是这个POJO的全限定名或者别名; 在SQL语句中引入参数#{POJO的属性名}或者’${POJO的属性名}’
  2. 将多个参数封装到一个Map中(要封装的参数没有对应的POJO),那么在映射配置文件中parameterType的值是map; 在SQL语句中引入参数#{map的key}或者’${map的key}’
void addUser(User user);void updateUser(Map map);<insert id="addUser" parameterType="User">insert into t_user (username, sex, birthday, address) values (#{username}, #{sex}, #{birthday}, #{address})
</insert><update id="updateUser" parameterType="map">update t_user set username=#{username},sex=#{sex} where uid=#{uid}
</update>
public void test2() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User(null, "麻子", "男", new Date(), "重庆");mapper.addUser(user);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
public void test3(){SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);Map map = new HashMap();map.put("username","老八");map.put("sex","女");map.put("uid",7);mapper.updateUser(map);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}

传递多个参数

方式一:通过参数索引

User findByUsernameAndAddress(String username, String address);<select id="findByUsernameAndAddress" resultType="User">select * from t_user where username=#{arg0} and address=#{arg1}
</select>

方式二:通过注解
@Param使用注解指定参数的名称

User findByUsernameAndSex(("name") String username,("sex") String sex);<select id="findByUsernameAndSex" resultType="User">select * from t_user where username=#{name} and sex=#{sex}
</select>

传递 pojo 包装对象类型

开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。

需求:根据用户id查询用户信息并进行分页,查询条件放到 QueryVo 的 user 属性中。
QueryVo.java




public class QueryVo {public QueryVo(Long currentPage, Integer pageSize, User queryCondition) {this.currentPage = currentPage;this.pageSize = pageSize;this.queryCondition = queryCondition;}private Long currentPage;private Integer pageSize;//查询条件private User queryCondition;private Long offset;public Long getOffset(){return (currentPage-1)*pageSize;}
}

UserDao.java

List<User> searchByCondition(QueryVo queryVo);

UserDao.xml

<select id="searchByCondition" parameterType="QueryVo" resultType="User">select * from t_user where sex=#{queryCondition.sex} and address=#{queryCondition.address}limit #{offset},#{pageSize}
</select>

测试


public void test6() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User();user.setSex("男");user.setAddress("北京");QueryVo queryVo = new QueryVo(1l,5,user);List<User> userList = mapper.searchByCondition(queryVo);for (User user1 : userList) {System.out.println(user1);}SqlSessionFactoryUtils.commitAndClose(sqlSession);
}

resultType深入

输出简单类型

查询的结果是单个数据, 映射配置文件中的resultType属性的值就是这个数据的类型

/*** 查询用户的总个数* @return*/
Long findTotal();<select id="findTotal" resultType="long">select count(*) from t_user
</select>

输出pojo对象(一个pojo对象就对应一行数据)或者一个Map

查询的结果是一行数据:
• 将这一行数据存储到POJO对象中, 映射配置文件的resultType的值就是POJO的全限定名或者别名,此时就要求查询结果的字段名和类型 要和POJO的属性名和类型一致

/*** 根据id查询一条数据* @param id* @return*/
User findById(int id);<select id="findById" parameterType="int" resultType="User">select * from t_user where uid=#{uid}
</select>

• 将这一行数据存储到Map对象,映射配置文件的resultType的值就是map,那么此时查询结果中的字段名就是 map的key,字段值就是map的value
/**

  • 根据用户名查询用户
  • @param username
  • @return
    */
    Map findByUsername(String username);
select * from t_user where username = #{username}

输出pojo列表(一个pojo列表就对应多行数据)或者Map的列表

查询的结果是多行数据:
• 将多条数据存储到List中,映射配置文件的resultType的值就是POJO的别名

List<User> findAll();<select id="findAll" resultType="User">select *from t_user
</select>

• 将多条数据存储到List中,映射配置文件的resultType的值就是map

List<Map> findAll2();<select id="findAll2" resultType="map">select *from t_user
</select>

resultMap结果类型

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。(下次课讲)
那我们今天就来看返回的列名与实体类的属性不一致时的情况. 下次课再接着研究复杂的封

UserInfo

package com.gavin.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;


public class UserInfo implements Serializable {private Integer userId;private String username;private String userSex;private String userBirthday;private String userAddress;
}

UserDao

/*** 查询所有用户信息,封装到UserInfo对象* @return*/
List<UserInfo> findAllUserInfo();

UserDao.xml

<resultMap id="userInfoMap" type="UserInfo" autoMapping="true">
Column是数据库字段名<id column="uid" property="userId"></id><result column="sex" property="userSex"></result><result column="birthday" property="userBirthday"></result><result column="address" property="userAddress"></result>
</resultMap><select id="findAllUserInfo" resultMap="userInfoMap">select *from t_user
</select>

测试

public class TestMybatis {public void test1() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);List<UserInfo> userInfoList = mapper.findAllUserInfo();for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}SqlSessionFactoryUtils.commitAndClose(sqlSession);}
}

Mybatis 映射文件的 SQL 深入(重点)

动态 SQL 之 if标签

我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。
比如在 id 如果不为空时可以根据 id查询,如果 username 不为空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到
注:
按照以前这样写;

在这里插入图片描述
会什么都不返回,因为传入的address为空,因为没有查到符合条件的,所以没有返回任何东西。

在这里插入图片描述
UserDao.java

/*** 根据address查询用户,如果没有传入地址则查询出所有用户* @param address* @return*/
List<User> findUserListByAddress(("address") String address);/*** 根据用户地址和性别查询用户,如果有address才考虑address的条件,如果有sex才考虑sex的条件* @param user* @return*/
List<User> findUserListByAddressAndSex(User user);

UserDao.xml

<select id="findUserListByAddress" parameterType="string" resultType="User">select * from t_user<if test="address != null">where address=#{address}</if>
</select><select id="findUserListByAddressAndSex" parameterType="User" resultType="User">select * from t_userwhere 1=1    //恒成立的一个随便一个条件。为了保证下面任何一个条件符合或不符合,sql语句拼接出来都是正确的。<if test="address != null">and address=#{address}</if><if test="sex != null">and sex=#{sex}</if>
</select>

测试


public void test1() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);List<User> userList = mapper.findUserListByAddress(null);for (User user : userList) {System.out.println(user);}SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
public void test2() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User();user.setAddress("北京");user.setSex("男");List<User> userList = mapper.findUserListByAddressAndSex(user);for (User user1 : userList) {System.out.println(user1);}SqlSessionFactoryUtils.commitAndClose(sqlSession);
}

动态 SQL 之where标签

为了简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发。
注意:可以自动处理第一个and
UserDao.java

/*** 根据用户地址和性别查询用户,如果有address才考虑address的条件,如果有sex才考虑sex的条件* @param user* @return*/
List<User> findUserListByAddressAndSex(User user);

UserDao.xml

<select id="findUserListByAddressAndSex" parameterType="User" resultType="User">select * from t_user<!--where标签的作用:1.可以在添加之前添加where关键字2.可以去掉第一个条件前的and--><where><if test="address != null">and address=#{address}</if><if test="sex != null">and sex=#{sex}</if></where>
</select>

测试


public void test2() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);User user = new User();user.setAddress("北京");user.setSex("男");List<User> userList = mapper.findUserListByAddressAndSex(user);for (User user1 : userList) {System.out.println(user1);}SqlSessionFactoryUtils.commitAndClose(sqlSession);
}

动态标签之foreach标签

需求
• 批量删除: 根据id的集合删除所有元素
以前方式:用in()

在这里插入图片描述
但是我们现在无法提前知道是哪些要传的值,所以无法用in()。
UserDao.java

/*** 批量删除* @param ids*/
void deleteByIds(List<Integer> ids);

UserDao.xml:
Foreach标签属性:
collection:要遍历的集合(所以传入方法的是一个集合),
item:遍历出来的元素起个名字
separator:遍历出来的每个元素间的分隔符。
Index:遍历出来的每个元素的索引
Open:遍历出来的第一个元素之前,我们要拼接的字符串。
Close:遍历出来的最后一个元素之后,我们要拼接的字符串。

<delete id="deleteByIds" parameterType="int">//集合的泛型是integer,这里可以用int?delete from t_user<foreach collection="list" item="id" separator="," open="where uid in("    close=")">#{id}</foreach>
</delete>

测试


public void test3() {SqlSession sqlSession = SqlSessionFactoryUtils.openSqlSession();UserDao mapper = sqlSession.getMapper(UserDao.class);List<Integer> ids = new ArrayList<Integer>();ids.add(7);ids.add(8);ids.add(9);mapper.deleteByIds(ids);SqlSessionFactoryUtils.commitAndClose(sqlSession);
}

动态标签之Sql片段

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。我们先到 UserDao.xml 文件中使用标签,定义出公共部分.

UserDao.xml

<sql id="select_all">select uid,username,sex,birthday,address from t_user
</sql><!--加入一个判断,判断传入的address是否为空,使用if标签进行判断,该标签中的test属性就编写判断条件
-->
<select id="findUserListByAddress" parameterType="string" resultType="User"><include refid="select_all"></include><if test="address != null">where address=#{address}</if>
</select>

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

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

相关文章

阿里云人工智能平台PAI论文入选OSDI ‘24

近日&#xff0c;阿里云人工智能平台PAI的论文《Llumnix: Dynamic Scheduling for Large Language Model Serving》被OSDI 24录用。论文通过对大语言模型&#xff08;LLM&#xff09;推理请求的动态调度&#xff0c;大幅提升了推理服务质量和性价比。 Llumnix是业界首个能灵活在…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性&#xff0c;这些属性固定&#xff0c;形成了机器人的个人偏好 在实现过程中&#xff0c;此处使用一个xml配置文件&#xff0c;配置了机器人的个人年…

如何选购一台云服务器

说明&#xff1a;基于博主本人经常在用云服务学习技术&#xff0c;许多博客里的技术分享也都是在自己购买的云服务器上操作的&#xff0c;本文介绍根据自己的经验&#xff0c;如何选购一台云服务器 选择产商 云服务可以选择阿里云、华为云、腾讯云、百度云&#xff0c;都是几…

296个地级市GDP相关数据(2000-2023年)

GDP相关数据&#xff1a;衡量地区经济活动的综合指标 国内生产总值&#xff08;GDP&#xff09;是衡量一个国家或地区经济规模和发展水平的核心指标。它反映了在一定时期内&#xff0c;所有常住单位生产活动的最终成果。 GDP的种类及其含义&#xff1a; 名义GDP&#xff1a;按…

昆明高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

昆明高校大学智能制造实验室的数字孪生可视化系统平台建设项目&#xff0c;正是在这样的背景下应运而生。项目自启动以来&#xff0c;便受到了校方的高度重视和大力支持。经过数月的紧张筹备和精心实施&#xff0c;项目团队克服了种种技术难题&#xff0c;成功完成了系统的开发…

热题系列9

剑指 Offer 39. 数组中出现次数超过一半的数字 给一个长度为 n 的数组&#xff0c;数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次&#xff0c;超过数组长度的一半&am…

用 Kotlin 编写四则运算计算器:从零开始的简单教程

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

AI搜索助手心流正式上线 小程序版本、APP版本也将推出

7月10日&#xff0c;专为科研人员、高校教师和学生、职场人士研发的大模型应用产品心流正式上线。据了解&#xff0c;其产品定位为用户的AI搜索助手&#xff0c;提供智能搜索、知识问答、智能阅读、辅助创作等能力&#xff0c;旨在帮助用户提升工作和学习效率。 心流支持AI搜索…

AI绘画:midjourney快速生成符合心意的AI人物形象

生成人物的万能句式&#xff0c;包含**「人物的客观描述」「视角」「角度」「距离」「表情」「服装」「风格」「光源」**等内容&#xff0c;也可以只取其中部分的也会得到一个还不错的结果。 人物构图视角的选择 视角可以按照相机相对于被拍摄对象的位置&#xff0c;分为 正面…

微信小程序毕业设计-报刊订阅系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

网络(二)——套接字编程

文章目录 理解源IP地址和目的IP地址认识端口号认识TCP/UDP协议网络字节序socket编程接口socket 常见APIsockaddr结构 理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址&#xff1b; 源IP即发送方的地址&#xff0c;目的IP即接受方的…

免费开源数字人生成工具

使用步骤更是简单到不行&#xff1a; 1. 输入图片&#xff1a;选择你想要生成动态视频的肖像图片。 2. 输入音频&#xff1a;提供与图片匹配的音频文件&#xff0c;EchoMimic会根据音频内容驱动肖像的动态效果。 3. 设置参数&#xff1a;一般保持默认设置即可&#xff0c;当然&…

【银河麒麟服务器操作系统】系统夯死分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 512G 整机类型/架构&#xff1a; X86_64 【内核版本】 4.19.90-25…

【C++深入学习】类和对象(一)

欢迎来到HarperLee的学习笔记&#xff01; 博主主页传送门&#xff1a;HarperLee博客主页&#xff01; 欢迎各位大佬交流学习&#xff01; 本篇本章正式进入C的类和对象部分&#xff0c;本部分知识分为三小节。复习&#xff1a; 结构体复习–内存对齐编译和链接函数栈桢的创建…

再升级!视频理解大模型 CogVLM2 开源

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

基于JAVA-JSP的电子书下载系统设计与实现

点击下载源码 基于JAVA-JSP电子书下载系统 目 录 第1章 绪论 1 课题的研究背景、内容和意义 1 第2章 主要技术概述 3 2.1 B/S结构 3 2.2 JSP技术 4 2.2.1 JSP技术的强势 5 2.2.2 JSP技术的弱势 5 2.3 SQL SERVER 2000数据库 5 2.4 JDBC数据库连接 6 2.4.1 JDBC接口 …

Mathematica笔记

Mathematica笔记 mathematica等距、不等距数组mathematica多条线作图与循环图例 mathematica等距、不等距数组 mathematica多条线作图与循环图例 Clear["*"] h[x_, a_] a*E^x; LogLogPlot[Evaluate[Table[h[x, i], {i, 1, 20, 2}]], {x, 0.001, 10}, PlotRange -&g…

OpenGL笔记八之EBO和EBO绘制流程

OpenGL笔记八之EBO和EBO绘制流程 —— 2024-07-07 晚上 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记八之EBO和EBO绘制流程1.EBO2.glDrawElements&#xff1a;如果使用了ebo&#xff0c;最后一个参数可以写03.glDrawElements&#xff1a;如果使用了ebo…

CSS技巧专栏:一日一例 2.纯CSS实现 多彩边框按钮特效

大家好,今天是 CSS技巧一日一例 专栏的第二篇《纯CSS实现多彩边框按钮特效》 先看图: 开工前的准备工作 正如昨日所讲,为了案例的表现,也处于书写的习惯,在今天的案例开工前,先把昨天的准备工作重做一遍。 清除浏览器的默认样式定义页面基本颜色设定body的样式清除butt…

2024辽宁省数学建模B题【钢铁产品质量优化】思路详解

2024 辽宁省大学数学建模竞赛试题 B 题 钢铁产品质量优化 由于连续退火工序中各阶段的工艺参数之间存在耦合性&#xff08;加热炉的温度设定会影响后续均热与冷却温度的设定&#xff0c;以及带钢穿行速度&#xff09;&#xff0c;导致难以建立该工序的机理模型&#xff0c;从而…