当前位置: 首页 > news >正文

Mybatis——(2)

2.2 Mybatis 工具类(了解)

为了简化MyBatis的开发,可将MyBatis进一步封装。

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;
/*** Mybatis工具类*/
public class MybatisUtil {/*** 不让用户在外界创建工具类对象*/private MybatisUtil() {}/*** 初始化SqlSessionFactory对象*/private static SqlSessionFactory factory;static {try {InputStream in = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(in);} catch (IOException e) {e.printStackTrace();}}/*** 获取SqlSession对象的方法*/public static SqlSession getSession() {return factory.openSession();}
}

测试:

public class MybatisUtilTest {@Testpublic void test() {SqlSession sqlSession = MybatisUtil.getSession();System.out.println(sqlSession);sqlSession.close();}
}

2.4 Mapper代理方式(强制)

Mapper代理开发方式只需要程序员编写Mapper接口(相当于Dao接口),由MyBatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

程序员编写Mapper接口需要遵循一些开发规范,MyBatis可以自动生成Mapper接口实现类代理对象

2.4.1 开发规范

1、Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、Mapper.xml中定义的每个标签的id与Mapper接口方法名相同。

3、Mapper.xml中定义的每个sql的parameterType的类型与Mapper接口方法的参数类型相同。

4、Mapper.xml中定义的每个sql的resultType的类型与Mapper接口方法返回值类型相同。

注:Mapper.xml映射文件最好和Mapper接口名称一致。

2.4.2 实体类

package org.example.mybatis.entity;
​
import java.util.Date;
​
/*** Emp实体类*/
public class Emp {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;
​public Integer getEmpno() {return empno;}
​public void setEmpno(Integer empno) {this.empno = empno;}
​public String getEname() {return ename;}
​public void setEname(String ename) {this.ename = ename;}
​public String getJob() {return job;}
​public void setJob(String job) {this.job = job;}
​public Integer getMgr() {return mgr;}
​public void setMgr(Integer mgr) {this.mgr = mgr;}
​public Date getHiredate() {return hiredate;}
​public void setHiredate(Date hiredate) {this.hiredate = hiredate;}
​public Double getSal() {return sal;}
​public void setSal(Double sal) {this.sal = sal;}
​public Double getComm() {return comm;}
​public void setComm(Double comm) {this.comm = comm;}
​public Integer getDeptno() {return deptno;}
​public void setDeptno(Integer deptno) {this.deptno = deptno;}
​@Overridepublic String toString() {return "Emp{" +"empno=" + empno +", ename='" + ename + '\'' +", job='" + job + '\'' +", mgr=" + mgr +", hiredate=" + hiredate +", sal=" + sal +", comm=" + comm +", deptno=" + deptno +'}';}
}

2.4.3 Mapper接口

package org.example.mybatis.mapper;
​
import org.example.mybatis.entity.Emp;
​
import java.util.List;
​
/** Mapper接口相当于我们之前写的Dao接口,只是在Mybatis里面我们习惯这么写而已。*/
public interface Mapper {List<Emp> select();
​Emp selectById(Integer empno);
​void insert(Emp emp);
​int update(Emp emp);
​boolean delete(Integer empno);
}

批量查询:方法返回值为List类型,表示SqlSession对象将调用selectList()方法。

单条查询:方法返回值为单个实体对象,表示SqlSession对象将调用selectOne()方法。

增删改:

方法返回值为void,表示SqlSession对象中insert,update,delete方法的返回值不做任何处理。

方法返回值为int类型,表示SqlSession对象中insert,update,delete方法的返回值直接返回。

方法返回值为boolean类型,表示根据SqlSession对象中的insert,update,delete方法返回值(影响数据库的条数)判断操作是否成功,如果影响数据库的条数大于0条,表示成功,否则表示失败。

2.4.4 mapper文件

<?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">
<!--namespace:与Mapper接口的全限定名保持一致-->
<mapper namespace="org.example.mybatis.mapper.Mapper"><!--statementId与Mapper接口的方法名称保持一致;parameterType的类型必须与方法的参数类型保持一致;resultType的类型必须与方法的返回值类型保持一致;--><select id="select" resultType="org.example.mybatis.entity.Emp">select empno,ename,job,mgr,hiredate,sal,comm,deptnofrom emp</select><select id="selectById" parameterType="java.lang.Integer"resultType="org.example.mybatis.entity.Emp">select empno,ename,job,hiredate,mgr,sal,comm,deptnofrom empwhere empno = #{empno}</select>
​<insert id="insert" parameterType="org.example.mybatis.entity.Emp">insert into emp(ename, job, mgr, hiredate, sal, comm, deptno)values (#{ename}, #{job}, #{mgr}, #{hiredate}, #{sal}, #{comm}, #{deptno})</insert><update id="update" parameterType="org.example.mybatis.entity.Emp">update empset ename=#{ename}, job=#{job}, mgr=#{mgr}, hiredate=#{hiredate}, sal=# {sal},comm=#{comm}, deptno=#{deptno}where empno=#{empno}</update><delete id="delete" parameterType="java.lang.Integer">deletefrom empwhere empno = #{empno}</delete>
</mapper>

加载mapper文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration 文件的根节点 -->
<configuration><!--properties 用于引入外部的properties配置文件resource:引入类路径下的文件url:引入磁盘或网路--><properties/><!--environments:多个配置环境;通过default属性可以对多个环境快速切换。environments default属性的值必须和某个environment的id值一致。--><!-- 和spring整合后 environments配置将废除,了解即可 --><environments default="mysql"><environment id="oracle"><!-- 配置事务:使用jdbc的事务管理 --><transactionManager type="JDBC"/><!-- 配置数据源:连接数据库的信息type: 表示连接是否使用连接池,POOLED表示mybatis中自带的连接池;JNDI、POOLED、UNPOOLED--><dataSource type="POOLED"><property name="driver"value="oracle.jdbc.driver.OracleDriver"/><property name="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/><property name="username" value="scott"/><property name="password" value="tiger"/></dataSource></environment><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?
characterEncoding=utf8&amp;useSSL=false"/><property name="username" value="root"/><property name="password" value=""/></dataSource></environment></environments>
​<!-- 加载映射文件的位置 --><mappers><mapper resource="mapper/Mapper.xml"/></mappers>
</configuration>

2.4.5 测试

package org.example.mybatis.test;
​
import org.apache.ibatis.session.SqlSession;
import org.example.mybatis.entity.Emp;
import org.example.mybatis.mapper.Mapper;
import org.example.mybatis.utils.MybatisUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
​
import java.util.Date;
import java.util.List;
​
public class MapperTest {private SqlSession sqlSession;private Mapper mapper;
​@Beforepublic void before() {sqlSession = MybatisUtil.getSession();//获取Mapper接口的代理对象mapper = sqlSession.getMapper(Mapper.class);}
​@Afterpublic void after() {sqlSession.commit();sqlSession.close();}
​@Testpublic void test() {System.out.println(sqlSession);System.out.println(mapper);}
​@Testpublic void testSelect() {List<Emp> list = mapper.select();for (Emp emp : list) {System.out.println(emp);}}
​@Testpublic void testSelectById() {Emp emp = mapper.selectById(7938);System.out.println(emp);}
​@Testpublic void testInsert() {Emp emp = new Emp();emp.setEname("小明");emp.setJob("职员");emp.setSal(4500.0);emp.setComm(1000.0);emp.setMgr(1);emp.setHiredate(new Date());mapper.insert(emp);}
​@Testpublic void testUpdate() {Emp emp = new Emp();emp.setEmpno(7940);emp.setEname("小李");emp.setJob("秘书");emp.setSal(5300.0);emp.setComm(1300.0);emp.setMgr(1);emp.setHiredate(new Date());int result = mapper.update(emp);System.out.println("方法的返回值:" + result);}
​@Testpublic void testDelete() {boolean result = mapper.delete(7940);System.out.println("方法的返回值:" + result);}
}

三、Mybatis 核心配置文件(了解)

MyBatis的全局配置文件mybatis-config.xml,配置内容如下:

properties(属性)

settings(全局配置参数)

typeAliases(类型别名)

typeHandlers(类型处理器)

objectFactory(对象工厂)

plugins(插件)

environments(环境集合属性对象)

environment(环境子属性对象)

transactionManager(事务管理)

dataSource(数据源)

mappers(映射器)

四、Mybatis Mapper配置文件

mapper.xml映射文件中定义了操作数据库的Sql,每个Sql是一个statement,映射文件是MyBatis的核心。

4.1 parameterType输入映射(强制)

parameterType配置输入参数的类型。

4.1.1 表结构

CREATE TABLE `users` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`username` varchar(20),
`password` varchar(50),
`realname` varchar(20)
);
INSERT INTO `users` VALUES (1, 'admin', '123456', '管理员');
INSERT INTO `users` VALUES (2, 'tom', '123', '汤姆');
INSERT INTO `users` VALUES (3, 'jerry', '456', '杰瑞');
INSERT INTO `users` VALUES (4, 'zhangsan', '111', '张三');
INSERT INTO `users` VALUES (5, 'lisi', '222', '李四');

4.1.2 实体类

package org.example.mybatis.entity;public class User {private Integer id;private String username;private String password;private String realname;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRealname() {return realname;}public void setRealname(String realname) {this.realname = realname;}@Overridepublic String toString() {return "Users{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", realname='" + realname + '\'' +'}';}
}

4.1.3 简单类型

Java基本数据类型以及包装类,String字符串类型。

mapper接口:

package org.example.mybatis.mapper;import org.example.mybatis.entity.Users;import java.util.List;public interface UsersMapper {List<Users> selectByRealname(String realname);
}

mapper文件:

<?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="org.example.mybatis.mapper.UsersMapper"><select id="selectByRealname" parameterType="java.lang.String"resultType="org.example.mybatis.entity.Users">select id, username, password, realnamefrom userswhere realname likeconcat('%', #{realname}, '%')</select>
</mapper>

测试:

package org.example.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.example.mybatis.entity.Users;
import org.example.mybatis.mapper.UsersMapper;
import org.example.mybatis.utils.MybatisUtil;
import org.junit.Test;import java.util.List;public class ParameterTypeTest {@Testpublic void testSimpleParam() {SqlSession sqlSession = MybatisUtil.getSession();UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);List<Users> list = usersMapper.selectByRealname("张");for (Users users : list) {System.out.println(users);}sqlSession.close();}
}

4.1.4 实体类或自定义类型

开发中通过实体类或pojo类型传递查询条件,查询条件是综合的查询条件,不仅包括实体类中查询条件

还包括其它的查询条件,这时可以使用包装对象传递输入参数。

4.1.4.1 自定义类型

分页类:

package org.example.mybatis.entity;public class Page {//当前页码private Integer pageNum = 1;//每页条数private Integer pageSize = 3;//总页数: 总记录数/每页条数,除不尽+1private Integer pages;//总记录数private Integer total;/*** mysql* 起始偏移量:(当前页码-1)*每页条数*/private Integer offset;/*** oracle* 起始条数:(当前页码-1)*每页条数+1* 结束条数: 当前页码*每页条数*/private Integer start;private Integer end;public Integer getPageNum() {return pageNum;}public void setPageNum(Integer pageNum) {this.pageNum = pageNum;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize = pageSize;}public Integer getPages() {return getTotal() % getPageSize() == 0 ? getTotal() / getPageSize() :getTotal() / getPageSize() + 1;}public void setPages(Integer pages) {this.pages = pages;}public Integer getTotal() {return total;}public void setTotal(Integer total) {this.total = total;}public Integer getOffset() {return (getPageNum() - 1) * getPageSize();}public void setOffset(Integer offset) {this.offset = offset;}public Integer getStart() {return (getPageNum() - 1) * getPageSize() + 1;}public void setStart(Integer start) {this.start = start;}public Integer getEnd() {return getPageNum() * getPageSize();}public void setEnd(Integer end) {this.end = end;}
}

复合类:UsersQuery

package org.example.mybatis.entity;/*** 多条件查询复合类*/
public class UsersQuery {private Users users;private Page page;public Users getUsers() {return users;}public void setUsers(Users users) {this.users = users;}public Page getPage() {return page;}public void setPage(Page page) {this.page = page;}
}
4.1.4.2 mapper接口
// 在UsersMapper接口上增加
List<Users> selectByPage(Page page);List<Users> selectByRealnameAndPage(UsersQuery usersQuery);
4.1.4.3 mapper文件
<select id="selectByPage" parameterType="org.example.mybatis.entity.Page"resultType="org.example.mybatis.entity.Users">select id,username,password,realname from users order by id limit #{offset}, #{pageSize}
</select>
<select id="selectByRealnameAndPage" parameterType="org.example.mybatis.entity.UsersQuery"resultType="org.example.mybatis.entity.Users">select id,username,password,realname from userswhere realname like concat('%',#{users.realname},'%')order by id limit #{page.offset}, #{page.pageSize}
</select>
4.1.4.4 测试
package org.example.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.example.mybatis.entity.Page;
import org.example.mybatis.entity.Users;
import org.example.mybatis.entity.UsersQuery;
import org.example.mybatis.mapper.UsersMapper;
import org.example.mybatis.utils.MybatisUtil;
import org.junit.Test;import java.util.List;public class ClassParamTests {@Testpublic void testClassParam1() {SqlSession sqlSession = MybatisUtil.getSession();UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);Page page = new Page();page.setPageNum(1);System.out.println("mysql起始偏移量:" + page.getOffset());System.out.println("起始条数:" + page.getStart());System.out.println("结束条数:" + page.getEnd());List<Users> list = usersMapper.selectByPage(page);for (Users users : list) {System.out.println(users);}sqlSession.close();}@Testpublic void testPojoParam2() {SqlSession sqlSession = MybatisUtil.getSession();UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);Page page = new Page();page.setPageNum(1);Users users = new Users();users.setRealname("张");UsersQuery usersQuery = new UsersQuery();usersQuery.setPage(page);usersQuery.setUsers(users);List<Users> list = usersMapper.selectByRealnameAndPage(usersQuery);for (Users u : list) {System.out.println(u);}sqlSession.close();}
}

4.1.5 Map类型

mapper接口:

// 在UsersMapper接口上增加
List<Users> selectUseMap(Map<String, Object> map)

mapper文件:

<select id="selectUseMap" parameterType="java.util.HashMap" resultType="org.example.mybatis.entity.Users">select id,username,password,realname from userswhere realname like concat('%',#{name},'%')order by id limit #{begin}, #{size}
</select>

测试:

@Test
public void testMapParam() {SqlSession sqlSession = MybatisUtil.getSession();UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);Map<String, Object> map = new HashMap<>();map.put("name", "李");map.put("size", 5);map.put("begin", 0);List<Users> list = usersMapper.selectUseMap(map);for (Users u : list) {System.out.println(u);}sqlSession.close();
}

4.1.6 多输入参数

MyBatis中允许有多个输入参数,可使用@Param注解。

这种做法类似与Map类型的输入参数,其中@Param注解的value属性值为Map的key,在映射文件中通

过ognl可获取对应的value,并且parameterType可以不指定类型。

mapper接口:

Users login(@Param("uname") String username, @Param("pwd") String password);

mapper文件:

<select id="login" parameterType="java.util.HashMap" resultType="org.example.mybatis.entity.Users">select id,username,password,realname from userswhere username=#{uname} and password=#{pwd}
</select>

测试:

@Test
public void testMultiParam() {SqlSession sqlSession = MybatisUtil.getSession();UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);Users users = usersMapper.login("jerry", "456");System.out.println(users);sqlSession.close();
}

4.2 resultType输出映射(强制)

4.2.1 表结构

CREATE TABLE `person` (
`id` int(11) PRIMARY KEY AUTO_INCREMENT,
`person_name` varchar(20),
`person_age` int(4),
`person_address` varchar(50)
);
INSERT INTO `person` VALUES (1, '曹操', 40, '洛阳');
INSERT INTO `person` VALUES (2, '刘备', 38, '成都');
INSERT INTO `person` VALUES (3, '孙权', 29, '杭州');
INSERT INTO `person` VALUES (4, '关羽', 35, '荆州');
INSERT INTO `person` VALUES (5, '张飞', 32, '成都');
INSERT INTO `person` VALUES (6, '曹仁', 28, '许都');

4.2.2 实体类

package org.example.mybatis.entity;public class Person {private Integer id;private String personName;private Integer personAge;private String personAddress;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getPersonName() {return personName;}public void setPersonName(String personName) {this.personName = personName;}public Integer getPersonAge() {return personAge;}public void setPersonAge(Integer personAge) {this.personAge = personAge;}public String getPersonAddress() {return personAddress;}public void setPersonAddress(String personAddress) {this.personAddress = personAddress;}@Overridepublic String toString() {return "Person{" +"id=" + id +", personName='" + personName + '\'' +", personAge=" + personAge +", personAddress='" + personAddress + '\'' +'}';}
}

4.2.3 简单类型

查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。

mapper接口:

package org.example.mybatis.mapper;public interface PersonMapper {// 查询Person的总数量Integer selectCount();
}

mapper文件:

<?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="org.example.mybatis.mapper.PersonMapper"><select id="selectCount" resultType="java.lang.Integer">select count(1) from person</select>
</mapper>

测试:

package org.example.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.example.mybatis.mapper.PersonMapper;
import org.example.mybatis.utils.MybatisUtil;
import org.junit.Test;public class ResultTypeTest {@Testpublic void testSimpleResult() {SqlSession sqlSession = MybatisUtil.getSession();PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);int total = personMapper.selectCount();System.out.println("总记录数:" + total);sqlSession.close();}
}

4.2.4 实体类对象和列表

不管是输出的实体类是单个对象还是一个列表(list中包括实体类对象),在mapper.xml中resultType指定的类型是一样的。

在原始Dao的方式中,通过selectOne和selectList方法来区分返回值为单个对象或集合列表,而在mapper代理中,则通过接口中定义的方法返回值来区分。

mapper接口:

    Person selectById(Integer id);List<Person> selectAll();

mapper文件:

<select id="selectById" parameterType="java.lang.Integer" resultType="org.example.mybatis.entity.Person">select id,person_name personName,person_age personAge,person_addresspersonAddress from person where id=#{id}
</select><select id="selectAll" resultType="org.example.mybatis.entity.Person">select id,person_name personName,person_age personAge,person_addresspersonAddress from person
</select>

测试:

@Test
public void testResultType1() {SqlSession sqlSession = MybatisUtil.getSession();PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);Person person = personMapper.selectById(1);System.out.println(person);sqlSession.close();
}@Test
public void testResultType2() {SqlSession sqlSession = MybatisUtil.getSession();PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);List<Person> list = personMapper.selectAll();for (Person person : list) {System.out.println(person);}sqlSession.close();
}

4.2.5 resultMap

resultType可以指定将查询结果映射为实体类,但需要实体类的属性名和SQL查询的列名一致方可映射成功,当然如果开启下划线转驼峰 或 Sql设置列别名,也可以自动映射。

如果SQL查询字段名和实体类的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还会将查询结果映射到实体类对象中。

resultMap可以实现将查询结果映射为复合型的实体类,比如在查询结果映射对象中包括实体类和list实现一对一查询和一对多查询。

mapper接口:

List<Person> selectAll();

mapper文件:使用resultMap作为statement的输出映射类型。

<resultMap id="selectResultMap" type="org.example.mybatis.entity.Person"><id property="id" column="id"/><result property="personName" column="person_name"/><result property="personAge" column="person_age"/><result property="personAddress" column="person_address"/>
</resultMap>
<select id="select" resultMap="selectResultMap">select id,person_name,person_age,person_address from person
</select>

resultType: 自动映射。

resultMap: 手动映射。

id: 唯一标识,名称;

type: 手动映射的java类型;

子标签 <id/> 配置数据库表中的主键和实体类中属性的对应关系;

子标签 <result/> 配置数据库表中的普通字段和实体类中属性的对应关系;

property:实体类中的成员变量名;

column:结果集中的字段名称;

javaType:实体类成员变量的类型,由mybaits自动识别,可不配置;

jdbcType:表字段的类型,由mybaits自动识别,可不配置;

typeHandler:自定义类型处理器,用的相对比较少;

测试:

@Test
public void testResultMap() {SqlSession sqlSession = MybatisUtil.getSession();PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);List<Person> list = personMapper.select();for (Person person : list) {System.out.println(person);}sqlSession.close();
}

4.3 动态SQL(强制)

4.3.1 什么是动态SQL

动态Sql是指MyBatis对Sql语句进行灵活操作,通过表达式进行判断,对Sql进行灵活拼接、组装。

比如:

我们要查询姓名中带 M 和 高于 1000的员工信息;

可能有时候我们需要不带条件查询;

可能有时候我们需要模糊查询;

可能有时候需要根据多条件查询;

动态SQL可以帮助我们解决这些问题。

通过Mybatis提供的各种标签方法实现动态拼接sql。

4.3.2 if标签

判断标签,当参数符合判断条件拼接SQL语句。

实体类:

package org.example.mybatis.entity;import java.util.Date;public class Emp {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;private String gender;public Integer getEmpno() {return empno;}public void setEmpno(Integer empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Integer getMgr() {return mgr;}public void setMgr(Integer mgr) {this.mgr = mgr;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public Double getSal() {return sal;}public void setSal(Double sal) {this.sal = sal;}public Double getComm() {return comm;}public void setComm(Double comm) {this.comm = comm;}public Integer getDeptno() {return deptno;}public void setDeptno(Integer deptno) {this.deptno = deptno;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "Emp{" +"empno=" + empno +", ename='" + ename + '\'' +", job='" + job + '\'' +", mgr=" + mgr +", hiredate=" + hiredate +", sal=" + sal +", comm=" + comm +", deptno=" + deptno +", gender='" + gender + '\'' +'}';}
}

mapper接口:

package org.example.mybatis.mapper;import org.example.mybatis.entity.Emp;import java.util.List;public interface EmpMapper {List<Emp> selectUseIf(Emp emp);
}

mapper文件:

<?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="org.example.mybatis.mapper.EmpMapper"><select id="selectUseIf" parameterType="org.example.mybatis.entity.Emp"resultType="org.example.mybatis.entity.Emp">select empno,ename,job,mgr,hiredate,sal,comm,deptno from empwhere<!--注意:判断条件中使用的变量为实体类或输入参数的属性空字符串的判断仅能使用在字符串类型的属性中--><if test="ename != null and ename != ''">ename like concat('%',#{ename},'%')</if><if test="sal != null">and sal=#{sal}</if><if test="deptno != null">and deptno=#{deptno}</if></select>
</mapper>

测试:

package org.example.mybatis.test;import org.apache.ibatis.session.SqlSession;
import org.example.mybatis.entity.Emp;
import org.example.mybatis.mapper.EmpMapper;
import org.example.mybatis.utils.MybatisUtil;
import org.junit.Test;import java.util.List;/** 动态sql测试*/
public class DynamicSqlTest {@Testpublic void testIf() {SqlSession sqlSession = MybatisUtil.getSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("S");emp.setSal(1300.0);emp.setDeptno(20);List<Emp> list = empMapper.selectUseIf(emp);for (Emp e : list) {System.out.println(e);}sqlSession.close();}
}

4.3.3 where标签

where标签,替代where关键字。

  1. 当where标签内所有的条件都不成立,不会拼接where关键字,只要有一个条件成立就会在SQL语句中拼接where关键字。

  2. where标签会自动剔除条件头部的and或者or关键字。

mapper接口:

List<Emp> selectUseWhere(Emp emp);

mapper文件:

<select id="selectUseWhere" parameterType="org.example.mybatis.entity.Emp"resultType="org.example.mybatis.entity.Emp">select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp<where><if test="ename != null and ename != ''">ename like concat('%',#{ename},'%')</if><if test="sal != null">and sal=#{sal}</if><if test="deptno != null">and deptno=#{deptno}</if></where>
</select>

测试:

@Test
public void testWhere() {SqlSession sqlSession = MybatisUtil.getSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("S");emp.setSal(1300.0);emp.setDeptno(20);List<Emp> list = empMapper.selectUseWhere(emp);for (Emp e : list) {System.out.println(e);}sqlSession.close();
}

4.3.4 set标签

set标签,替代set关键字。

  1. 当set标签内所有的条件都不成立,不会拼接set关键字,只要有一个条件成立就会在SQL语句中拼接set关键字。

注意:如果set包含的内容为空SQL语句会出错。

  1. set标签会自动剔除条件末尾的任何不相关的逗号。

mapper接口:

void updateUseSet(Emp emp);

mapper文件:

<update id="updateUseSet" parameterType="org.example.mybatis.entity.Emp">update emp<set><if test="ename != null">ename=#{ename},</if><if test="job != null">job=#{job},</if><if test="mgr != null">mgr=#{mgr},</if><if test="hiredate != null">hiredate=#{hiredate},</if><if test="sal != null">sal=#{sal},</if><if test="comm != null">comm=#{comm},</if><if test="deptno != null">deptno=#{deptno},</if></set>where empno=#{empno}
</update>

测试:

@Test
public void testSet() {SqlSession sqlSession = MybatisUtil.getSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEmpno(7938);emp.setEname("JACK");emp.setJob("MANAGER");emp.setMgr(7844);emp.setSal(5600.0);emp.setComm(1200.0);emp.setHiredate(new Date());emp.setDeptno(30);empMapper.updateUseSet(emp);sqlSession.commit();sqlSession.close();
}

4.3.5 trim标签

trim标签属性解析:

prefix:前缀,包含内容前加上某些字符。

suffix:后缀,包含内容后加上某些字符。

prefixOverrides:剔除包含内容前的某些字符。

suffixOverrides:剔除包含内容后的某些字符。

4.3.5.1 mapper接口
void insertUseTrim(Emp emp);
4.3.5.2 mapper文件
<!--trim标签--><insert id="insertUseTrim" parameterType="org.example.mybatis.entity.Emp">insert into emp<trim prefix="(" suffix=")" suffixOverrides=","><if test="ename != null">ename,</if><if test="job != null">job,</if><if test="mgr != null">mgr,</if><if test="hiredate != null">hiredate,</if><if test="sal != null">sal,</if><if test="comm != null">comm,</if><if test="deptno != null">deptno,</if></trim><trim prefix=" values(" suffix=")" suffixOverrides=","><if test="ename != null">#{ename},</if><if test="job != null">#{job},</if><if test="mgr != null">#{mgr},</if><if test="hiredate != null">#{hiredate},</if><if test="sal != null">#{sal},</if><if test="comm != null">#{comm},</if><if test="deptno != null">#{deptno},</if></trim></insert>
4.3.5.3 测试
@Test
public void testTrim() {SqlSession sqlSession = MybatisUtil.getSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);Emp emp = new Emp();emp.setEname("CHRIS");emp.setJob("CLERK");emp.setMgr(1);emp.setSal(3400.0);emp.setComm(800.0);emp.setHiredate(new Date());emp.setDeptno(10);empMapper.insertUseTrim(emp);sqlSession.commit();sqlSession.close();
}
4.3.5.4 代替where标签
<select id="selectUseTrim" parameterType="org.example.mybatis.entity.Emp" resultType="org.example.mybatis.entity.Emp">select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp<trim prefix="where" prefixOverrides="and|or"><if test="ename != null and ename != ''">ename like concat('%',#{ename},'%')</if><if test="sal != null">and sal=#{sal}</if><if test="deptno != null">and deptno=#{deptno}</if></trim>
</select>
4.3.5.5 代替set标签
    <!--代替set标签--><update id="updateUseTrim" parameterType="org.example.mybatis.entity.Emp">update emp<trim prefix="set" suffixOverrides=","><if test="ename != null">ename=#{ename},</if><if test="job != null">job=#{job},</if><if test="mgr != null">mgr=#{mgr},</if><if test="hiredate != null">hiredate=#{hiredate},</if><if test="sal != null">sal=#{sal},</if><if test="comm != null">comm=#{comm},</if><if test="deptno != null">deptno=#{deptno},</if></trim>where empno=#{empno}</update>

4.3.6 foreach标签

向SQL传递数组或list,MyBatis使用foreach解析。

属性解析:

collection: 遍历的数组或集合对象名称。

SQL只接收一个数组参数,这时SQL解析参数的名称MyBatis固定为array。

SQL只接收一个List参数,这时SQL解析参数的名称MyBatis固定为list。

如果是通过一个实体类或自定义类型的属性传递到SQL的数组或List集合,则参数的名称为实体类或自定义类型中的属性名。

index: 为数组的下标。

item: 每次遍历生成的对象。

open: 开始遍历时拼接的串。

close: 结束遍历时拼接的串。

separator: 遍历的两个对象中需要拼接的串。

mapper接口:

void deleteUseForeach(Integer[] ids);
void insertUseForeach(List<Emp> empList);

mapper文件:

    <!--foreach标签--><delete id="deleteUseForeach" parameterType="java.lang.Integer"><!--delete from emp where empno in (1,2,3,4)-->delete from emp where empno in<foreach collection="array" open="(" close=")" separator="," item="id">#{id}</foreach></delete><insert id="insertUseForeach" parameterType="org.example.mybatis.entity.Emp">insert into emp(ename,job,mgr,hiredate,sal,comm,deptno) values<foreach collection="list" separator="," item="emp">(#{emp.ename},#{emp.job},#{emp.mgr},#{emp.hiredate},#{emp.sal},#{emp.comm},#{emp.deptno})</foreach></insert>

测试:

    @Testpublic void testForeach() {SqlSession sqlSession = MybatisUtil.getSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);empMapper.deleteUseForeach(new Integer[]{1, 2, 3, 4});sqlSession.commit();sqlSession.close();}@Testpublic void testForeach2() {SqlSession sqlSession = MybatisUtil.getSession();EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> empList = new ArrayList<>();for (int i = 1; i <= 3; i++) {Emp emp = new Emp();emp.setEname("TOM" + i);emp.setJob("CLERK" + i);emp.setMgr(1);emp.setSal(4567.0);emp.setComm(123.0);emp.setHiredate(new Date());emp.setDeptno(10);empList.add(emp);}empMapper.insertUseForeach(empList);sqlSession.commit();sqlSession.close();}

4.3.7 choose标签

choose标签、when标签、otherwise标签的组合,类似于if-else-if判断。

<select id="">select...<choose><when test=""></when><when test=""></when><otherwise></otherwise></choose>
</select>

4.3.8 SQL片段

将实现的动态SQL判断代码块抽取出来,组成一个SQL片段,其它的statement中就通过 <include> 标

签就可以引用SQL片段,方便程序员进行开发。

注意:在SQL片段中不要包括where标签。

    <sql id="feildSql">empno,ename,job,mgr,hiredate,sal,comm,deptno</sql><sql id="whereSql"><if test="ename != null and ename != ''">ename like concat('%',#{ename},'%')</if><if test="sal != null">and sal=#{sal}</if><if test="deptno != null">and deptno=#{deptno}</if></sql><select id="selectUseSql" parameterType="org.example.mybatis.entity.Emp"resultType="org.example.mybatis.entity.Emp">select<include refid="feildSql"></include>from emp<where><include refid="whereSql"></include></where></select>

4.4 Map输入和输出类型(强制)

实体类:

package org.example.mybatis.entity;public class Dept {private Integer deptno;private String dname;private String loc;public Dept() {}public Dept(Integer deptno, String dname, String loc) {this.deptno = deptno;this.dname = dname;this.loc = loc;}/*** 获取* @return deptno*/public Integer getDeptno() {return deptno;}/*** 设置* @param deptno*/public void setDeptno(Integer deptno) {this.deptno = deptno;}/*** 获取* @return dname*/public String getDname() {return dname;}/*** 设置* @param dname*/public void setDname(String dname) {this.dname = dname;}/*** 获取* @return loc*/public String getLoc() {return loc;}/*** 设置* @param loc*/public void setLoc(String loc) {this.loc = loc;}public String toString() {return "Dept{deptno = " + deptno + ", dname = " + dname + ", loc = " + loc + "}";}
}

Mapper接口:

package org.example.mybatis.mapper;import java.util.List;
import java.util.Map;public interface DeptMapper {//查询List<Map<String, Object>> queryAllDept();//插入int insertDept(Map<String, Object> map);
}

Mapper文件:

<?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="org.example.mybatis.mapper.DeptMapper"><!--查询,输出参数是MapMybatis会把查询结果给我们封装成List<Map>因为一行数据就是一个Map--><select id="queryAllDept" resultType="hashmap">select *from dept</select><!--插入,输入参数是Map--><!--输入参数是hashmap,那么#{map中的key}--><insert id="insertDept" parameterType="hashmap">insert into deptvalues (#{id}, #{name}, #{address})</insert>
</mapper>

测试:

    @Testpublic void testMapResultType(){
// 获取Mapper接口的代理对象 (相当于实现类对象)SqlSession sqlSession = MybatisUtil.getSession();DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
//我们的输出参数是hashMap,那么mybatis会把查询结果集的列作为key,值作为valueList<Map<String, Object>> maps = mapper.queryAllDept();for(Map<String, Object> map:maps){System.out.println(map.get("DEPTNO")+"\t"+map.get("DNAME")+"\t"+map.get("LOC"));}sqlSession.close();}@Testpublic void testMapParameter(){
// 获取Mapper接口的代理对象 (相当于实现类对象)SqlSession sqlSession = MybatisUtil.getSession();DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);Map<String,Object> map = new HashMap<String,Object>();map.put("id",50);map.put("name","开发部门");map.put("address","北京市");int i = mapper.insertDept(map);System.out.println(i);sqlSession.close();}

相关文章:

Mybatis——(2)

2.2 Mybatis 工具类&#xff08;了解&#xff09; 为了简化MyBatis的开发&#xff0c;可将MyBatis进一步封装。 import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apa…...

QT笔记- QSystemTrayIcon系统托盘功能完整示例

1. 创建托盘对象 // 创建托盘图标QSystemTrayIcon * trayIcon new QSystemTrayIcon(this);QIcon icon("://icon/test.png");trayIcon->setIcon(icon);trayIcon->show();trayIcon->connect(trayIcon, &QSystemTrayIcon::activated,this, &MainWindo…...

ElasticSearch08-分析器详解

零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器&#xff08;Analyzer&#xff09;是全文搜索的核心组件&#xff0c;它负责将文本转换为一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。 &#xff08;1&#xff…...

指针的深入讲解

本章重点&#xff1a; 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数 我们在指针的初阶的时候主要讲了&#xff1a; 1.指针就是变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间 2.指针的大小是固定4个…...

王佩丰24节Excel学习笔记——第十二讲:match + index

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 vlookup与match&#xff0c;index 相结合使用match,index 结合&#xff0c;快速取得引用的值扩展功能&#xff0c;使用match/index函数&#xff0c;结合照相机工具获取照片 一、回顾…...

概率论得学习和整理28:用EXCEL画折线图,X轴数据也被当成曲线的解决办法

目录 1 折线图和散点图&#xff0c;对数据的处理差别 1.1 EXCEL画图的一些默认设置 1.2 多于2列的数据&#xff0c;也是如此 2 如果我们非要以第1列数据为X轴&#xff0c;做一个折线图呢&#xff1f;也能 2.1 首先&#xff0c;把第1列&#xff0c;想当成X轴的数据&#xf…...

387. 字符串中的第一个唯一字符

1&#xff0c;题目 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 2&#xff0c;代码 class Solution { public:int firstUniqChar(string s) {//记数排序int coutArr[26] {0};//统计字符出现…...

Oracle RAC最佳实践-优化私网连接

在 Oracle RAC 环境中&#xff0c;私网&#xff08;Interconnect&#xff09; 是节点之间通信和数据传输的关键部分。一直有个误解&#xff0c;认为私网&#xff08;心跳网&#xff09;只要能通随便什么交换机都可以,甚至有直连的&#xff0c;实际上私网的性能至关重要&#xf…...

[bug] StarRocks borker load意向之外的bug

意向之外&#xff0c;又清理之中 背景&#xff1a; StarRocks各方面碾压相同类型的数据库&#xff0c;最近我们要从生成HIVE导历史数据&#xff08;ORC格式&#xff09;到StarRocks&#xff0c;前期小测一下&#xff0c;在测试是没问题&#xff0c;上生产先导2个月的数据&…...

游戏AI实现-寻路算法(Dijkstra)

戴克斯特拉算法&#xff08;英语&#xff1a;Dijkstras algorithm&#xff09;&#xff0c;又称迪杰斯特拉算法、Dijkstra算法&#xff0c;是由荷兰计算机科学家艾兹赫尔戴克斯特拉在1956年发现的算法。 算法过程&#xff1a; 1.首先设置开始节点的成本值为0&#xff0c;并将…...

9 OOM和JVM退出。OOM后JVM一定会退出吗?

首先我们把两个概念讲清楚 OOM是线程在申请堆内存&#xff0c;发现堆内存空间不足时候抛出的异常。 JVM退出的条件如下&#xff1a; java虚拟机在没有守护线程的时候会退出。守护线程是启动JVM的线程&#xff0c;服务于用户线程。 我们简单说下守护线程的功能: 1.日志的记录…...

Linux 端口操作

安装netstat yum -y install net-tools 检测端口占用 netstat -npl | grep "端口" 安装lsof lsof yum -y install lsof 检测端口占用 lsof -i :端口号 安装nc yum -y install nc 查看对方端口是否开放 nc -vz 对方ip 对方端口 安装telnet telnet yum -y in…...

【USB-HID】“自动化键盘“ - 模拟键盘输入

目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现&#xff0c;网…...

基于Spring Boot+Vue 的高校运动会管理系统

目录 1 绪论1.1研究背景1.2 研究意义1.3 相关开发技术简介1.3.1 Vue.js1.3.2 Spring Boot1.3.3 MySQL 2 系统分析2.1 需求分析2.1.1 功能需求2.1.2 非功能需求 2.2 系统可行性分析2.2.1 经济可行性2.2.2 技术可行性2.2.3 操作可行性 3 系统概要设计系统功能描述业务流程分析 4 …...

Linux应用程序中终止进程的几种方法

目录 1、正常退出进程的方法 1.1、exit(int status) 函数 1.2、_exit(int status) 函数 1.3、_Exit(int status) 函数 2、异常退出进程的方法 3、何时使用这些方法&#xff1f; 在 Linux 应用程序中&#xff0c;终止进程的方式有多种&#xff0c;通常取决于进程是否需要进…...

电脑文档损坏:原因剖析和修复方法

在使用电脑的过程中&#xff0c;许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑&#xff0c;特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作&#xff1a; 在编…...

了解ARM的千兆以太网——RK3588

1. 简介 本文并不重点讲解调试内容&#xff0c;重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…...

【Nginx-4】Nginx负载均衡策略详解

在现代Web应用中&#xff0c;随着用户访问量的增加&#xff0c;单台服务器往往难以承受巨大的流量压力。为了解决这一问题&#xff0c;负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;提供了多种负载均衡策略&#xff0c;能够有效地将请求分…...

低级计算机网络知识总结

1 应用层 1.1 HTTP(TCP) 浏览器访问WWW服务器过程&#xff1a;首先进行域名解析&#xff0c;然后通过TCP向服务器发送连接请求 HTTP本身是无连接&#xff0c;无状态的。无状态特性使服务器能够支持大量的并发HTTP请求。实际应用中&#xff0c;通常使用Cookie加数据库跟踪用户…...

linux sysrq的使用举例

在menuconfig中选择m和 *的区别&#xff1a; *: 模块驱动编译到内核中&#xff0c;启动时自动加载 M:标识作为内核模块编译 空格:表示该功能不编译到内核中&#xff0c;即新的内核将不支持该功能。 m&#xff1a;模块会被编译&#xff0c;但是不会被编译到内核中&#xff0c;只…...

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?

TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…...

Oracle 适配 OpenGauss 数据库差异语法汇总

背景 国产化进程中&#xff0c;需要将某项目的数据库从 Oracle 转为 OpenGauss &#xff0c;项目初期也是规划了适配不同数据库的&#xff0c;MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后&#xff0c;只写…...

【记录】Django解决与VUE跨域问题

1 梗概 这里记录Django与VUE的跨域问题解决方法&#xff0c;主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…...

Yolov10本地部署,torch找不到GPU问题解决

在本地部署跑Yolov10的模型.具体分为以下几步,也是踩了一些坑: 1.YoloV10 代码拉取 2.安装CUDA 1.查看CUDA支持版本 2.下载安装CUDA 3.下载CUDNN 3.创建python虚拟环境 Anaconda下载安装 虚拟环境安装配置 4.运行 1.yoloV10代码拉取 源码地址: GitHub - THU-MIG/yolov10: YOLO…...

el-upload 上传文件 入参格式为form-data格式,入参字段为code、name、type、file(文件)的形式,如何实现?

el-upload 是 Element UI 中用于文件上传的组件。如果你需要上传文件并将其封装为 form-data 格式&#xff0c;并且包含字段如 code、name、type 和 file&#xff0c;你可以通过自定义 before-upload 或 action 进行处理。 1. el-upload 的基本用法 Element UI 的 el-upload …...

VUE组件插槽使用示例,弹窗样式

在Vue.js中&#xff0c;插槽&#xff08;slots&#xff09;是一种非常强大的功能&#xff0c;它允许你在父组件中向子组件传递内容。插槽主要有三种类型&#xff1a;默认插槽、具名插槽和作用域插槽。下面是一些示例来展示如何使用这些插槽。 默认插槽 默认插槽是最简单的插槽…...

ARM嵌入式学习--第八天(PWM)

PWM -PWM介绍 PWM&#xff08;pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量&#xff0c;通信&#xff0c;工控等方面 PWM的频率 是指在1秒钟内&#xff0c;信号从…...

新能源汽车大屏可视化第三次数据存储

任务&#xff1a; 将数据存放到temp.csv 链接&#xff1a; 1.排行页面 https://www.dongchedi.com/sales 2.参数页面 https://www.dongchedi.com/auto/params-carIds-x-9824 完善打印&#xff1a; 1. [{‘series_id’: 5952, ‘series_name’: ‘海鸥’, ‘image’: ‘https://…...

linux 替换yum源镜像

1. 备份源镜像 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2. 下载国内镜像阿里云 如果没有wget可以用curl 代替 sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清华大学 sudo wget -…...

SAP:如何修改已释放的请求

SAP:如何修改已释放的请求 QQ出了一个新功能&#xff0c;把10年前的旧日志推给自己。这个10年前的日志&#xff0c;是用户反映在SE10中把请求释放后发现漏了内容&#xff0c;想修改已释放的请求。经调查写了一个小程序&#xff0c;实现用户的需求。 *&-------------------…...

js的?. 和??和||有什么区别

let a 0; let b null; let c Hello;console.log(a ?? default); // 0 console.log(b ?? default); // "default" console.log(c ?? default); // "Hello"console.log(a || default); // "default" (因为 0 是假值) console.log(b |…...

clickhouse 分布式表创建、增加、更新、删除、查询

创建分布式表 --先创建本地表 设置自动过期时间3天 CREATE TABLE IF NOT EXISTS ck_database.ck_databaseon cluster default(cluster name) (table_id String COMMENT id,item_id String COMMENT 业务id,desc Int64 COMMENT 描述,time DateTime DEFAULT now() COMMENT 数据…...

推送本地仓库到远程git仓库

目录 推送本地仓库到远程git仓库1.1修改本地仓库用户名1.2 push 命令1.3远程分支查看 推送本地仓库到远程git仓库 删除之前的仓库中的所有内容&#xff0c;从新建库&#xff0c;同时创建一个 A.txt 文件 清空原有的远程仓库内容&#xff0c;重新创建一个新的仓库&#xff0c;…...

LSTM长短期记忆网络

LSTM&#xff08;长短期记忆网络&#xff09;数学原理 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c;解决了标准RNN中存在的梯度消失&#xff08;Vanishing Gradient&#xff09; 和**梯度爆炸&#x…...

ABAP SQL 取日期+时间最新的一条数据

我们在系统对接的时候&#xff0c;外部系统可能会推送多个数据给到我们。 我们 SAP 系统的表数据中日期和时间是作为主键的&#xff0c;那么如果通过 ABAP SQL 取到最新日期的最新时间呢。 解决方案&#xff1a; 方式 1&#xff1a;SELECT MAX 可以通过两个 SELECT MAX 来取…...

SAST静态应用安全测试常见的编码规则

行业优先级难易度标准标准名称数量 军工12易GJB 5369:2005GJB_5369&#xff08;国家军用标准航天型号软件C语言可靠性编程规范&#xff09;138军工行业最早的C语言编码标准&#xff0c;强制性4易GJB 8114:2013GJB_8114&#xff08;国家军用标准C/C语言可靠性编程规范&#xff…...

AI相关专业名词汇总解释

1.SFT Supervised fine-tuning&#xff0c;“有监督微调”意味着使用有标签的数据来调整一个已预训练好的语言模型&#xff08;LLM&#xff09;&#xff0c;使其更适应某一特定任务。通常LLM的预训练是无监督的&#xff0c;但微调过程往往是有监督的。 详解&#xff1a;https:/…...

【C语言】指针数组和数组指针

前言 指针数组和数组指针是C语言中经常混淆的两个概念&#xff0c;虽然他们的名字相似&#xff0c;但其含义却完全不同。 指针数组 指针数组本质是一个数组&#xff0c;特点是数组中的元素均为指针&#xff0c;其定义形式为&#xff1a; 数据类型 *指针名[长度] 例如 int *…...

联邦学习中:公共物品属性的一般定义

在经济学和相关领域中,公共物品属性具有特定的含义,在论文中与联邦学习数据交易等情境相关联时,其意义如下: 公共物品属性的一般定义 非排他性 公共物品一旦被提供,很难或不可能排除其他人使用。例如,路灯照亮了街道,一个人使用路灯照明并不会阻止其他人同时使用,无法…...

前端的Python应用指南(一):快速构建 Web 服务器 - Flask vs Node.js 对比

随着前端开发技术的不断发展&#xff0c;前端开发者的技术栈也在不断扩展。如今&#xff0c;前端开发者不仅要掌握 HTML、CSS、JavaScript&#xff0c;还要掌握后端技术&#xff0c;成为全栈开发者。而在后端技术的选择上&#xff0c;Python 和 Node.js 是两种非常流行的选择。…...

典型案例 | 旧PC新蜕变!东北师范大学依托麒麟信安云“旧物焕新生”

东北师范大学始建于1946年&#xff0c;坐落于吉林省长春市&#xff0c;是中国共产党在东北地区创建的第一所综合性大学。作为国家“双一流”建设高校&#xff0c;学校高度重视教学改革和科技创新&#xff0c;校园信息化建设工作始终走在前列。基于麒麟信安云&#xff0c;东北师…...

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …...

ROS+PX4+Gazebo仿真环境配置全流程解析

上一期文章介绍了我们即将发布的仿真平台&#xff0c;并提到后续需要在Ubuntu系统上进行PX4软件在环仿真。本期文章将为大家详细介绍如何配置Ubuntu环境以及安装ROS和PX4仿真环境。具体配置包括&#xff1a;Ubuntu 20.04 ROS Noetic PX4 Python3。 需要注意的是&#xff0c…...

STM32F103单片机HAL库串口通信卡死问题解决方法

在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法&#xff0c;在测试的过程中无意间发现&#xff0c;串口会出现卡死的问题。 当串口一次性发送十几个数据的时候&#xff0c;串口感觉像卡死了一样&#xff0c;不再接收数据…...

基于微信小程序的电影院订票选座系统ssm+论文源码调试讲解

第2章 开发环境与技术 本章节对开发基于微信小程序的电影院订票选座系统需要搭建的开发环境&#xff0c;还有基于微信小程序的电影院订票选座系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始…...

解决新安装CentOS 7系统mirrorlist.centos.org can‘t resolve问题

原因 mirrorlist.centos.org yum源用不了 解决办法就是 # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo_bak # vim CentOS-Base.repoCentOS系统操作 # mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/*.repo_bak # curl -o /etc/yum.repos.d/CentOS-Linux-Ba…...

分布式系统架构3:服务容错

这是小卷对分布式系统架构学习的第3篇文章&#xff0c;虽然知道大家都不喜欢看纯技术文章&#xff0c;写了也没多少阅读量&#xff0c;但是个人要成长的话&#xff0c;还是需要往深一点的技术上去探索的 1.为什么需要容错 分布式系统的本质是不可靠的&#xff0c;一个大的服务…...

鸿蒙项目云捐助第十四讲云函数的初步使用

鸿蒙项目云捐助第十四讲云函数的初步使用 在开发项目的过程中&#xff0c;云端充分利用已成为一种驱势。云监控&#xff0c;云运维&#xff0c;云开发&#xff0c;云办公等等软件层出不穷&#xff0c;本地软件云端化也成为一种潮流。在这股大潮中&#xff0c;华为云也是独树一…...

【5G】5G的主要架构选项

最初&#xff0c;在3GPP讨论中考虑了所有可能的聚合和核心网络组合&#xff0c;共有八个架构选项。以下重点介绍option2、3、4和7。 1. 独立组网 (Standalone, SA) 架构选项 2 &#xff1a;Standalone architecture with 5G-core 特点&#xff1a; 5G核心网&#xff08;5GC, …...

【Laravel】端口问题导致菜单打不开

以下是修改 Laravel 应用程序的端口配置&#xff0c; 修改环境变量 APP_URL 来实现 app/Providers/AppServiceProvider.php <?phpnamespace App\Providers;use Illuminate\Events\Dispatcher; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\URL…...