• 33.Mybatis-Plus


    目录

    一、Mybatis-Plus。

    (1)简介。

    (2)Mybatis整合MP常有的三种用法。

    (2.1)快速开始_准备工作。

    (2.2)快速开始_Mybatis + MP。

    (2.3)快速开始_Spring + Mybatis + MP。

    (2.4)快速开始_SpringBoot + Mybatis + MP。

    (2.5)整合脉络整理。 

    (2.5.1)mybatis 和 mybatisplus的整合。

    (2.5.2)ssm+mp整合之后,可以直接通过调用接口方法查询数据库,前提是代理模式(即有对应接口)。

    (2.5.3)springboot + mybatis + mybatisplus。

    (3)通用CRUD。

    (3.1)插入操作。 

    (3.2)更新(修改)操作。

    (3.3)删除操作。 

    (3.4)查询操作。

    (4)SQL注入的原理。

    (5)配置。 

    (5.1)基本配置。

    (5.2)进阶配置。

    (5.3)DB策略配置。

    (6)条件构造器。 

    (6.1)简介与注意事项。

    (6.2)allEq。 

    (6.3)基本比较操作。 

    (6.4)模糊查询。 

    (6.5)排序。

    (6.6)逻辑查询。

    (6.7)select。


    一、Mybatis-Plus。

    (1)简介。

    (2)Mybatis整合MP常有的三种用法。

    对于Mybatis整合MP有常常有三种用法,分别是Mybatis+MP、Spring+Mybatis+MP、Spring Boot+Mybatis+MP。

    (2.1)快速开始_准备工作。

    (2.1.1)创建数据库以及表。

    1.创建数据库mp,字符集选utf-8。

    2.创建表、插入数据。 

    1. -- 创建测试表
    2. CREATE TABLE `tb_user` (
    3. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    4. `user_name` varchar(20) NOT NULL COMMENT '用户名',
    5. `password` varchar(20) NOT NULL COMMENT '密码',
    6. `name` varchar(30) DEFAULT NULL COMMENT '姓名',
    7. `age` int(11) DEFAULT NULL COMMENT '年龄',
    8. `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
    9. PRIMARY KEY (`id`)
    10. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    11. -- 插入测试数据
    12. INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
    13. ('1', 'zhangsan', '123456', '张三', '18', 'test1@itcast.cn');
    14. INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
    15. ('2', 'lisi', '123456', '李四', '20', 'test2@itcast.cn');
    16. INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
    17. ('3', 'wangwu', '123456', '王五', '28', 'test3@itcast.cn');
    18. INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
    19. ('4', 'zhaoliu', '123456', '赵六', '21', 'test4@itcast.cn');
    20. INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES
    21. ('5', 'sunqi', '123456', '孙七', '24', 'test5@itcast.cn');

    (2.1.2)创建工程。

    1.创建一个maven工程。

    2.导入依赖。

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>Mybatis_PlusartifactId>
    8. <packaging>pompackaging>
    9. <version>1.0-SNAPSHOTversion>
    10. <modules>
    11. <module>Mybatis_and_MPmodule>
    12. modules>
    13. <properties>
    14. <maven.compiler.source>15maven.compiler.source>
    15. <maven.compiler.target>15maven.compiler.target>
    16. properties>
    17. <dependencies>
    18. <dependency>
    19. <groupId>com.baomidougroupId>
    20. <artifactId>mybatis-plusartifactId>
    21. <version>3.5.3.1version>
    22. dependency>
    23. <dependency>
    24. <groupId>mysqlgroupId>
    25. <artifactId>mysql-connector-javaartifactId>
    26. <version>8.0.27version>
    27. dependency>
    28. <dependency>
    29. <groupId>com.alibabagroupId>
    30. <artifactId>druidartifactId>
    31. <version>1.2.8version>
    32. dependency>
    33. <dependency>
    34. <groupId>org.projectlombokgroupId>
    35. <artifactId>lombokartifactId>
    36. <optional>trueoptional>
    37. <version>1.18.26version>
    38. dependency>
    39. <dependency>
    40. <groupId>junitgroupId>
    41. <artifactId>junitartifactId>
    42. <version>4.12version>
    43. <scope>testscope>
    44. dependency>
    45. <dependency>
    46. <groupId>org.slf4jgroupId>
    47. <artifactId>slf4j-log4j12artifactId>
    48. <version>1.7.7version>
    49. dependency>
    50. dependencies>
    51. <build>
    52. <plugins>
    53. <plugin>
    54. <groupId>org.apache.maven.pluginsgroupId>
    55. <artifactId>maven-compiler-pluginartifactId>
    56. <configuration>
    57. <source>1.8source>
    58. <target>1.8target>
    59. configuration>
    60. plugin>
    61. plugins>
    62. build>
    63. project>

    (2.2)快速开始_Mybatis + MP。

    注意事项有3个:

    1、要加入spring的依赖,不然报错(我使用mybatis-plus的时候需要依赖spring的类)。 

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-contextartifactId>
    4. <version>5.2.20.RELEASEversion>
    5. dependency>

     2、mybatis核心加载mapper.xml映射文件接口(即不需要映射文件)都行。

    注意:下面的选一个就行(要么加载映射文件,要么加载接口)    
        
            
            
        

    3、解决了驼峰命名问题。

    数据表是user_name,而查询写的是userName, 然后也查询成功了。

    实体User中属性userName采用驼峰,对应数据库中的字段会是user_name

    (2.3)快速开始_Spring + Mybatis + MP。

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xmlns:tx="http://www.springframework.org/schema/tx"
    6. xmlns:context="http://www.springframework.org/schema/context"
    7. xsi:schemaLocation="
    8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    12. " >
    13. <context:property-placeholder location="classpath:database.properties">context:property-placeholder>
    14. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    15. <property name="driverClassName" value="${driver}">property>
    16. <property name="url" value="${url}">property>
    17. <property name="username" value="${user}">property>
    18. <property name="password" value="${pwd}">property>
    19. bean>
    20. <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
    21. <property name="dataSource" ref="dataSource">property>
    22. <property name="configLocation" value="classpath:mybatis.xml">property>
    23. <property name="mapperLocations" value="classpath:mapper/*.xml">property>
    24. bean>
    25. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    26. <property name="basePackage" value="com.anshangshi.mapper">property>
    27. bean>
    28. <context:component-scan base-package="com.anshangshi">context:component-scan>
    29. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
    30. <property name="dataSource" ref="dataSource">property>
    31. bean>
    32. <tx:advice id="txAdvice" transaction-manager="txManager">
    33. <tx:attributes>
    34. <tx:method name="add*" propagation="REQUIRED"/>
    35. <tx:method name="update*" propagation="REQUIRED"/>
    36. <tx:method name="del*" propagation="REQUIRED"/>
    37. <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
    38. tx:attributes>
    39. tx:advice>
    40. <aop:config>
    41. <aop:pointcut id="servicePointcut" expression="execution(* com.anshangshi.service..*.*(..))"/>
    42. <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut">aop:advisor>
    43. aop:config>
    44. beans>

    (2.4)快速开始_SpringBoot + Mybatis + MP。

    注意事项3个: 

    1、这个注解要这样写:@SpringBootTest(classes = MyApplication.class)

    1. @RunWith(SpringJUnit4ClassRunner.class)
    2. @SpringBootTest(classes = MyApplication.class)
    3. public class testMybatisSpringBoot {
    4. @Autowired
    5. private UserMapper userMapper;
    6. @Test
    7. public void test(){
    8. List userList = userMapper.selectList(null);
    9. for (User user : userList) {
    10. System.out.println(user);
    11. }
    12. }
    13. }

    2、这个坐标的版本我改成3.4.3.1才能成功使用。(其他版本的不知道,3.1.1版本出现错误)

    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>mybatis-plus-boot-starterartifactId>
    4. <version>3.4.3.1version>
    5. dependency>

    3、修改java编译器的jdk版本,或者,在pom.xml中,使用的jdk版本为12才行(比如使用15版本的,提示不支持)。

    注意:这两个标签如果存在,会修改java编译器的jdk版本(有这个标签,则修改java编译器的jdk版本意义不大,会被改回来的)。

    1. <properties>
    2. <maven.compiler.source>12maven.compiler.source>
    3. <maven.compiler.target>12maven.compiler.target>
    4. properties>

    (2.5)整合脉络整理。 

    下面三种整合方式:接口方法都可以使用注解实现sql语句。 

    (2.5.1)mybatis 和 mybatisplus的整合。

    (必须代理模式下:即映射文件方法有对应接口方法

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="mp.mapper.UserMapper">
    4. <select id="findById" resultType="User">
    5. select * from tb_user where id = #{id}
    6. select>
    7. mapper>
    1. public interface UserMapper extends BaseMapper{
    2. User findById(Long id);
    3. }

    其实跟原本差不多的用法:

    1. // 创建 MyBatis SqlSessionFactory
    2. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    3. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    4. // 获取 UserMapper 接口的代理对象
    5. SqlSession session = sqlSessionFactory.openSession();
    6. UserMapper mapper = session.getMapper(UserMapper.class);
    7. ...............

    为什么不能直接用接口调用方法?

    因为那样没人帮你执行sql语句,因为mybatis不知道(你没告诉它) 。

    (2.5.2)ssm+mp整合之后,可以直接通过调用接口方法查询数据库,前提是代理模式(即有对应接口)。
    1. @Autowired
    2. private UserMapper userMapper;
    3. @Test
    4. public void testFindAll() {
    5. List userList = userMapper.findAll();
    6. for (User user : userList) {
    7. System.out.println(user);
    8. }
    9. }

    为什么可以直接用接口调用方法?

     因为你整合ssm+mp时已经告诉mybatis或mybatisplus了。

    (2.5.3)springboot + mybatis + mybatisplus。

    映射xml文件+mp配置指定映射文件+接口(对应映射文件的抽象方法):(映射文件+接口=即代理模式)。

    1. #指定全局的配置文件
    2. #mybatis-plus.config-location=classpath:mybatis-config.xml
    3. #指定Mapper.xml文件的路径
    4. #mybatis-plus.mapper-locations=classpath*:mybatis/*.xml

    为什么可以直接用接口调用方法?

    因为mybatisplus帮你执行sql语句。

    (3)通用CRUD。

    (3.1)插入操作。 

    1. @Test
    2. //插入方法
    3. public void test1(){
    4. User user = new User();
    5. user.setMail("1@itcast.cn");
    6. user.setAge(31);
    7. user.setUserName("caocao1");
    8. user.setName("曹操1");
    9. user.setPassword("123456");
    10. user.setAddress("北京");
    11. int result = userMapper.insert(user);
    12. System.out.println("数据库受影响的行数:"+result);
    13. //获取自增长后的id值,自增长后的id值会回填到user对象中
    14. System.out.println("id => "+user.getId());
    15. }

    (3.2)更新(修改)操作。

    1. @Test
    2. public void testUpdateById(){
    3. User user = new User();
    4. user.setId(1L);//条件,根据id更新
    5. user.setAge(19);//更新的字段
    6. user.setPassword("666");
    7. int result = userMapper.updateById(user);
    8. System.out.println("result => "+result);
    9. }
    10. @Test
    11. public void testUpdate(){
    12. User user = new User();
    13. user.setAge(20);//更新的字段
    14. user.setPassword("8888");
    15. QueryWrapper wrapper = new QueryWrapper<>();
    16. wrapper.eq("user_name","zhangsan");//匹配user_name = zhangsan 的用户数据
    17. //根据条件做更新
    18. int result = userMapper.update(user, wrapper);
    19. System.out.println("result => "+result);
    20. }
    21. @Test
    22. public void testUpdate2(){
    23. UpdateWrapper wrapper = new UpdateWrapper<>();
    24. wrapper.set("age",21).set("password","999999")//更新的字段
    25. .eq("user_name","zhangsan");//更新的条件
    26. //根据条件做更新
    27. int result = userMapper.update(null, wrapper);
    28. System.out.println("result => "+result);
    29. }

    (3.3)删除操作。 

    1. @Test
    2. public void testDeleteById(){
    3. //根据id删除数据
    4. int result = userMapper.deleteById(9L);
    5. System.out.println("result => "+result);
    6. }
    7. @Test
    8. public void testDeleteByMap(){
    9. Map map = new HashMap<>();
    10. map.put("user_name","zhangsan");
    11. map.put("password","999999");
    12. //根据map删除数据,多条件之间是and关系
    13. int result = userMapper.deleteByMap(map);
    14. System.out.println("result => "+result);
    15. }
    16. @Test
    17. public void testDelete(){
    18. //用法一:
    19. QueryWrapper wrapper = new QueryWrapper<>();
    20. wrapper.eq("user_name","caocao1")
    21. .eq("password","123456");
    22. //用法二:
    23. User user = new User();
    24. user.setPassword("123456");
    25. user.setUserName("caocao");
    26. QueryWrapper wrapper1 = new QueryWrapper<>(user);
    27. //根据包装条件做删除
    28. //int result = userMapper.delete(wrapper);
    29. int result = userMapper.delete(wrapper1);
    30. System.out.println("result => "+result);
    31. }
    32. @Test
    33. public void testDeleteBatchIds(){
    34. //根据id批量删除数据
    35. int result = userMapper.deleteBatchIds(Arrays.asList(10L, 11L));
    36. System.out.println("result => "+result);
    37. }

    (3.4)查询操作。

    注意: PaginationInnerInterceptor这种方式已经过时了。在 Mybatis-Plus 3.4.0 版本以后,推荐使用 MybatisPlusInterceptor 替代 PaginationInnerInterceptor

    MybatisPlusInterceptor 是一个更加通用、更加灵活的插件拦截器,可以实现多种拦截器的功能,例如分页、乐观锁、动态表名等。

    1. @Configuration
    2. @MapperScan("mp.mapper") //设置mapper接口的扫描包
    3. public class MybatisPlusConfig {
    4. /*@Bean //配置分页插件
    5. public PaginationInnerInterceptor paginationInnerInterceptor(){
    6. return new PaginationInnerInterceptor();
    7. }*/
    8. @Bean
    9. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    10. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    11. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    12. return interceptor;
    13. }
    14. }
    1. @Test
    2. public void testSelectById(){
    3. User user = userMapper.selectById(1L);
    4. System.out.println(user);
    5. }
    6. @Test
    7. public void testSelectBatchIds() {
    8. //根据id批量查询数据
    9. List userList = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L, 4L, 5L));
    10. for (User user : userList) {
    11. System.out.println(user);
    12. }
    13. }
    14. @Test
    15. public void testSelectOne() {
    16. QueryWrapper wrapper = new QueryWrapper<>();
    17. //查询条件(没有查到数据,则返回为null),查询的数据超过一条时,会抛出异常
    18. wrapper.eq("user_name","lisi1");
    19. //wrapper.eq("password","123456");//如果查询到多条数据,则报错
    20. User user = userMapper.selectOne(wrapper);
    21. System.out.println(user);
    22. }
    23. @Test
    24. public void testSelectCount() {
    25. QueryWrapper wrapper = new QueryWrapper<>();
    26. wrapper.gt("age",20);//年龄大于20岁的用户
    27. //根据条件查询数据条数
    28. Integer count = userMapper.selectCount(wrapper);
    29. System.out.println("count => "+count);
    30. }
    31. @Test
    32. public void testSelectList() {
    33. QueryWrapper wrapper = new QueryWrapper<>();
    34. //设置查询条件
    35. wrapper.like("email","itcast");
    36. List userList = userMapper.selectList(wrapper);
    37. for (User user : userList) {
    38. System.out.println(user);
    39. }
    40. }
    41. @Test
    42. //测试分页查询
    43. public void testSelectPage() {
    44. Page page = new Page<>(1,1);//查询第一页,查询一条数据
    45. //有参构造相当于设置了下面的这两个属性值
    46. /*page.setCurrent(1);
    47. page.setSize(1);*/
    48. QueryWrapper wrapper = new QueryWrapper<>();
    49. //设置查询条件
    50. wrapper.like("email","itcast");
    51. IPage iPage = userMapper.selectPage(page, wrapper);
    52. System.out.println("数据总条数:"+iPage.getTotal());
    53. System.out.println("数据总页数:"+iPage.getPages());
    54. System.out.println("当前页数:"+iPage.getCurrent());
    55. List records = iPage.getRecords();//获取查询的数据(其实是分页之后的数据,即第几页开始,有几条,例如这里:第1页,查询1条数据,所以这里只有1条数据)
    56. //只有1条数据(满足条件的不止1条,但是只有分页之后的数据)
    57. //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE (email LIKE ?) LIMIT ?
    58. for (User record : records) {
    59. System.out.println(record);
    60. }
    61. }

    (4)SQL注入的原理。

    (5)配置。 

    (5.1)基本配置。

    (5.2)进阶配置。

    (5.3)DB策略配置。

    在 Java 中,$ 符号后面跟着的数字或字符串可以指代一个内部类或内部接口。$ 后面的内部类不仅在 Java 中适用,在 Mybatis-Plus 中同样也适用。

    在实际使用中,内部类的命名规范一般是在外部类的类名后面添加 $ 符号和内部类名称。这样做的好处是,可以很容易地区分内部类和普通类,同时也方便了代码的组织和维护。

    例如 com.example.OuterClass$InnerClass 就表示 OuterClass 的一个名为 InnerClass 的内部类。

    (6)条件构造器。 

    (6.1)简介与注意事项。

    在 Mybatis-Plus 中,entity 表示实体类对象(Entity Object)。Entity Object 是指一个普通的 Java 类,用于描述数据库中的一条记录。 

    注意:如果我们既使用了实体类属性,又使用了 QueryWrapper 的一些 API 方法(例如 like()eq() 等),那么这两种方式生成的 WHERE 条件是互相独立的,不会相互影响。 

    api生成的where条件:

    QueryWrapper wrapper = new QueryWrapper<>();

    wrapper.gt("age", 18); 

    entity生成的where条件: 

    User user = new User();

    user.setAge(18);

    QueryWrapper wrapper = new QueryWrapper<>(user); 

    (6.2)allEq。 

    1. @Test
    2. public void testAllEq() {
    3. HashMap params = new HashMap<>();
    4. params.put("name", "李四");
    5. params.put("age", "20");
    6. params.put("password", null);
    7. QueryWrapper wrapper = new QueryWrapper<>();
    8. //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE (password IS NULL AND name = ? AND age = ?)
    9. //wrapper.allEq(params);
    10. //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE (name = ? AND age = ?)
    11. //wrapper.allEq(params,false);
    12. //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE (name = ? AND age = ?)
    13. wrapper.allEq((k,v) -> (k.equals("age") || k.equals("id") || k.equals("name")),params);
    14. List userList = userMapper.selectList(wrapper);
    15. for (User user : userList) {
    16. System.out.println(user);
    17. }

    (6.3)基本比较操作。 

    (6.4)模糊查询。 

    1. @Test
    2. public void testLike() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. wrapper.likeLeft("name","五");
    5. //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE (name LIKE ?)
    6. //参数:%五(String)
    7. List users = userMapper.selectList(wrapper);
    8. for (User user : users) {
    9. System.out.println(user);
    10. }
    11. }

    (6.5)排序。

    1. @Test
    2. public void testOrderByAgeDesc() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. //按照年龄倒叙排序
    5. wrapper.orderByDesc("age");
    6. //SELECT id,user_name,name,age,email AS mail FROM tb_user ORDER BY age DESC
    7. //参数:无
    8. List users = userMapper.selectList(wrapper);
    9. for (User user : users) {
    10. System.out.println(user);
    11. }
    12. }

    (6.6)逻辑查询。

    1. @Test
    2. public void testOr() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","王五").or().eq("age",21);
    5. //SELECT id,user_name,name,age,email AS mail FROM tb_user WHERE (name = ? OR age = ?)
    6. //参数:王五(String), 21(Integer)
    7. List users = userMapper.selectList(wrapper);
    8. for (User user : users) {
    9. System.out.println(user);
    10. }
    11. }

    (6.7)select。

    1. @Test
    2. public void testSelect() {
    3. QueryWrapper wrapper = new QueryWrapper<>();
    4. wrapper.eq("name","王五")
    5. .or()
    6. .eq("age",21)
    7. .select("id","name","age");//指定查询字段
    8. //SELECT id,name,age FROM tb_user WHERE (name = ? OR age = ?)
    9. //参数:王五(String), 21(Integer)
    10. List users = userMapper.selectList(wrapper);
    11. for (User user : users) {
    12. System.out.println(user);
    13. }
    14. }

    二、Mybatis-plus需要注意的规则。

    (1)驼峰命名字段对应的表字段以_分隔。

    (2)对应mybatis-plus的update修改操作忽略字段规则。

    MyBatis-Plus 忽略修改字段的规则是通过在执行数据库更新操作时对实体对象进行解析和比较来确定的。具体规则如下:

    1. 当使用实体类对象进行数据修改时,MyBatis-Plus 会解析实体对象中的每个字段,检查其是否有值。

    2. 如果某个字段有值,则将该字段包含在更新语句中。

    3. 如果某个字段没有值,则根据字段类型的默认值规则来确定是否忽略该字段的更新操作:

      • 对于整型(Integer、Long 等)和浮点型(Float、Double 等)字段,默认值为 0;
      • 对于布尔型(Boolean)字段,默认值为 false;
      • 对于字符串类型(String)字段,默认值为 null;
      • 对于日期类型(Date、LocalDateTime 等)字段,默认值为 null。

    根据以上规则,在执行数据修改时,如果某个字段没有值(即为默认值),则会被忽略不参与更新操作。

    (3)java的属性类型与mysql表的字段类型不需要对应,只要格式符合就行。

    1.java中String类型可以存入mysql表的int类型。

    2.mysql表的varchar类型可以存入java的int类型。

    3.java的字符串可以存入mysql表的time类型。

    4.mysql表的varchar类型可以存入java的LocalTime类型。

    当然,前提是这些数据是符合格式的,比如20:20:20这种格式的字符串自然是可以存入mysql表的time类型的,如果是202020这种肯定是不行的。

    所以java和mysql的字段类型不需要完全对应,只要符合格式就行。

  • 相关阅读:
    09数据结构与算法刷题之【位运算】篇
    C语言之动态内存分配二
    D如何检查null
    springboot事务的失效场景
    [免费专栏] Andorid安全之搭建Android开发环境和基础学习指南
    读标准03-IEEE1451.5标准协议尝鲜实现
    多层感知器(神经网络)与激活函数
    未来数字化转型发展的前景如何,企业又该怎么实现?
    IDEA 在远程 Tomcat 上运行项目(亲身避坑版)
    【电脑使用】CCleaner使用的坑
  • 原文地址:https://blog.csdn.net/khmff/article/details/130817225