解决MySQL 中使用index desc 作为字段名时Mybatis-Plus操作出现的问题

博客围绕Java与MySQL相关问题展开,介绍了报错情况,同时给出了解决方法,还涉及测试类和实体类,最终呈现了解决后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决方法
  •    再有关键字实体类属性上添加 @TableField("`表的列名`") 重点是  “`”这个符号
    
  •   # 不加的语句
      INSERT INTO test  ( index, desc )  VALUES  ( ?, ? );
      # 加的语句
      INSERT INTO test ( `index`, `desc` ) VALUES ( ?, ? ) 
    
结果
  1. 测试类

    @Autowired
    TestMapper mapper;
    @Test
    void test(){
        com.book.yomance.entity.Test test = new com.book.yomance.entity.Test();
        test.setDesc("描述")
            .setIndex(1);
        mapper.insert(test);
        System.out.println(mapper.selectById(test.getId()));
    }
    
  2. 实体类

    public class Test {
        @TableField("`index`")
        private Integer index;
        @TableField("`desc`")
        private String desc;
        @TableId(type = IdType.AUTO)
        private Integer id;
        // 省略get set
    }
    
  3. 结果

    Creating a new SqlSession
    SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@51f95f0d] was not registered for synchronization because synchronization is not active
    2021-02-27 16:53:36.436  INFO 21164 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    2021-02-27 16:53:36.663  INFO 21164 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
    JDBC Connection [HikariProxyConnection@1576526619 wrapping com.mysql.cj.jdbc.ConnectionImpl@63a9c661] will not be managed by Spring
    ==>  Preparing: INSERT INTO test ( `index`, `desc` ) VALUES ( ?, ? ) 
    ==> Parameters: 1(Integer), 描述(String)
    <==    Updates: 1
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@51f95f0d]
    Creating a new SqlSession
    SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@149c39b] was not registered for synchronization because synchronization is not active
    JDBC Connection [HikariProxyConnection@816760435 wrapping com.mysql.cj.jdbc.ConnectionImpl@63a9c661] will not be managed by Spring
    ==>  Preparing: SELECT id,`index`,`desc` FROM test WHERE id=? 
    ==> Parameters: 1(Integer)
    <==    Columns: id, index, desc
    <==        Row: 1, 1, 描述
    <==      Total: 1
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@149c39b]
    Test{index=1, desc='描述', id=1}
    
    image-20210227170032724
报错情况
```sql
org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index,
desc )  VALUES  ( 1,
'描述' )' at line 1
### The error may exist in com/book/yomance/mapper/TestMapper.java (best guess)
### The error may involve com.book.yomance.mapper.TestMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO test  ( index, desc )  VALUES  ( ?, ? )
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index,
desc )  VALUES  ( 1,
'描述' )' at line 1
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index,
desc )  VALUES  ( 1,
'描述' )' at line 1
```
<think>好的,用户现在想了解如何使用MyBatis-Plus手动创建数据库连接并执行SQL查询,或者结合QueryWrapper进行增删改查。首先,我需要回顾之前对话中的内容,用户之前询问了Spring的EmbeddedDatabaseFactory类,现在转向MyBatis-Plus,可能是在学习如何在Spring项目中整合MyBatis-Plus进行数据库操作。 首先,用户的问题分为两部分:手动创建数据库连接和执行SQL,以及使用QueryWrapper进行CRUD。可能需要分别解答这两部分,但也要考虑是否有更优的方式,比如结合Spring Boot的自动配置,或者手动配置DataSource。 用户提到“手动创建数据库连接”,这可能意味着不使用Spring Boot的自动配置,而是手动设置DataSource。这里需要注意MyBatis-Plus通常与Spring集成,所以需要配置SqlSessionFactory,使用手动创建的DataSource。可能需要提供代码示例,比如使用HikariCP作为数据源,然后配置MyBatis-Plus的相关Bean。 其次,执行SQL语句,比如select * from patlist,这里需要展示如何使用MyBatis-Plus的基类方法,比如selectList,或者使用自定义的Mapper方法。如果用户想手动执行SQL,可能需要使用SqlRunner类,但更常见的做法是通过Mapper接口和QueryWrapper。 关于QueryWrapper的增删改查,需要给出具体的例子,比如查询条件、插入、更新、删除操作,并说明如何构建QueryWrapper实例,并调用对应的方法。 另外,用户可能对MyBatis-Plus的基础配置不太熟悉,需要分步骤说明,比如添加依赖、配置数据源、创建实体类和Mapper接口,最后是使用示例。同要注意是否需要手动关闭资源,比如在非Spring管理的情况下,但通常Spring会管理这些资源,所以可能需要提醒用户如果在Spring环境中,不需要手动关闭。 还需要考虑用户可能的错误点,比如依赖是否正确,数据库连接参数是否正确,表名和实体类是否对应,以及是否需要配置MyBatis-Plus的分页插件等。此外,如果用户使用的是嵌入式数据库,可能需要结合之前提到的EmbeddedDatabaseFactory来创建DataSource,但这里用户可能更倾向于使用常规的数据库连接,比如MySQL或H2。 最后,总结步骤,确保结构清晰,代码示例正确,并提醒生产环境中的注意事项,比如使用连接池、配置参数优化等。同,区分手动创建和Spring Boot自动配置的不同场景,让用户根据自身情况选择合适的方法。</think>--- ### **手动创建数据库连接并执行SQL(基于MyBatis-Plus)** 以下分步骤说明如何手动配置数据源、创建`SqlSessionFactory`,并通过MyBatis-Plus执行SQL--- #### **1. 添加依赖** 在`pom.xml`中添加MyBatis-Plus和数据库驱动依赖(以H2数据库为例): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> ``` --- #### **2. 手动配置数据源** 使用`HikariCP`或其他连接池手动创建`DataSource`: ```java import com.zaxxer.hikari.HikariDataSource; // 手动配置H2内存数据库 HikariDataSource dataSource = new HikariDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); dataSource.setUsername("sa"); dataSource.setPassword(""); ``` --- #### **3. 配置MyBatis-Plus** 创建`SqlSessionFactory`并注入数据源: ```java import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 关联数据源 sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml")); // 加载Mapper XML // 获取SqlSession try (SqlSession session = sessionFactory.getObject().openSession()) { // 执行原生SQL List<Object> result = session.selectList("select * from patlist"); } catch (Exception e) { e.printStackTrace(); } ``` --- ### **结合QueryWrapper实现增删改查** 假设已有实体类`Patlist`和Mapper接口`PatlistMapper`: --- #### **1. 定义实体类与Mapper** ```java // 实体类(表名与字段需与数据库匹配) @Data @TableName("patlist") // 指定表名 public class Patlist { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; } // Mapper接口(需继承BaseMapper) public interface PatlistMapper extends BaseMapper<Patlist> {} ``` --- #### **2. 使用QueryWrapper操作** ```java // 初始化Mapper(实际开发中通过Spring注入) PatlistMapper patlistMapper = session.getMapper(PatlistMapper.class); // ----------- 查询 ----------- QueryWrapper<Patlist> queryWrapper = new QueryWrapper<>(); queryWrapper.select("*") // 指定字段 .eq("age", 30) // WHERE age = 30 .like("name", "张") // AND name LIKE '%张%' .orderByDesc("id"); // ORDER BY id DESC List<Patlist> list = patlistMapper.selectList(queryWrapper); // ----------- 插入 ----------- Patlist entity = new Patlist(); entity.setName("张三"); entity.setAge(30); patlistMapper.insert(entity); // ----------- 更新 ----------- UpdateWrapper<Patlist> updateWrapper = new UpdateWrapper<>(); updateWrapper.set("age", 35).eq("name", "张三"); patlistMapper.update(null, updateWrapper); // ----------- 删除 ----------- QueryWrapper<Patlist> deleteWrapper = new QueryWrapper<>(); deleteWrapper.ge("age", 50); // 删除age >= 50的记录 patlistMapper.delete(deleteWrapper); ``` --- ### **关键点说明** 1. **原生SQL执行** - 使用`SqlSession.selectList("SQL语句")`直接执行原生SQL(需注意SQL注入风险)。 - 推荐优先使用MyBatis-Plus的Wrapper条件构造器。 2. **QueryWrapper优势** - 链式调用简化条件拼接。 - 支持Lambda表达式(如`QueryWrapper<Patlist>::eq`),避免硬编码字段名。 3. **事务管理** - 手动提交事务:`session.commit();` - 回滚事务:`session.rollback();` --- ### **生产环境建议** - **连接池配置** 使用`HikariCP`或`Druid`配置合理的连接池参数(最大连接数、超间等)。 - **SQL日志调试** 在`application.yml`中开启MyBatis-Plus日志: ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` - **代码生成器** 使用`MyBatis-Plus Generator`自动生成实体类、Mapper和XML文件,减少手写工作量。 --- 通过上述步骤,即可手动集成MyBatis-Plus并实现灵活的数据操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值