freemarker无法正常获取字段值

本文介绍了一种在PDF文档生成过程中遇到的问题:使用${item.sGMLabourCode?if_exists}
在写Pdf的时候:${item.sGMLabourCode?if_exists}获取到的值永远是空的(实际上是有值)
后来改为:${item.sgmLabourCode?if_exists}成功获取
### Iservice接口实现案例 在MyBatis-Plus中,`IService`接口提供了一系列通用的业务逻辑方法,可减少重复代码。以黑马商城项目为例,定义了`IUserService`接口继承自`IService<User>`,并在`UserServiceImpl`类中实现该接口。以下是具体代码: ```java // 定义接口 public interface IUserService extends IService<User> { void deductBalance(Long id, Integer money); } // 实现接口 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { @Override public void deductBalance(Long id, Integer money) { // 查询用户 User user = getById(id); // 校验用户状态 if (user == null || user.getStatus() == 2) { throw new RuntimeException("用户状态异常!"); } // 校验余额 if (user.getBalance() < money) { throw new RuntimeException("用户余额不足!"); } // 扣减 baseMapper.deductBalance(id, money); } } ``` 这里的`IService`接口为`User`实体提供了基础的CRUD方法,而`UserServiceImpl`类不仅实现了这些基础方法,还添加了自定义的`deductBalance`方法 [^3]。 ### Lambda应用 MyBatis-Plus的Lambda表达式主要用于构造查询条件,使代码更加简洁和类型安全。例如: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(User::getAge, 20); List<User> userList = userMapper.selectList(wrapper); ``` 上述代码使用Lambda表达式构造了一个查询条件,查询年龄等于20的用户列表。 ### 批量新增 为提高批处理性能,可使用`IService`的`saveBatch`方法。以下是一个批量插入10万条数据的示例: ```java @Test void testSaveBatch() { // 准备10万条数据 List<User> list = new ArrayList<>(1000); long b = System.currentTimeMillis(); for (int i = 1; i <= 100000; i++) { list.add(buildUser(i)); // 每1000条批量插入一次 if (i % 1000 == 0) { userService.saveBatch(list); list.clear(); } } long e = System.currentTimeMillis(); System.out.println("耗时:" + (e - b)); } ``` 该代码将数据每1000条进行一次批量插入,可有效提高插入效率 [^1]。 ### 代码生成 MyBatis-Plus提供了代码生成器工具,可自动生成实体类、Mapper接口、Service接口及实现类等代码。以下是一个简单的代码生成示例: ```java FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "password") .globalConfig(builder -> { builder.author("author") // 设置作者 .outputDir("D://mybatis-plus-generator"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.example") // 设置父包名 .moduleName("module") // 设置模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, "D://mybatis-plus-generator/xml")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("user") // 设置需要生成的表名 .addTablePrefix("t_", "c_"); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); ``` ### 静态工具 MyBatis-Plus提供了一些静态工具类,如`Wrappers`,可用于快速创建查询条件。例如: ```java List<User> userList = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getAge, 20)); ``` 上述代码使用`Wrappers`工具类的`lambdaQuery`方法创建了一个Lambda查询条件。 ### 逻辑删除 逻辑删除是指在删除数据时,并非真正从数据库中删除,而是通过修改数据的某个字段来标记该数据已删除。在MyBatis-Plus中,可通过注解和配置实现逻辑删除。首先,在实体类的字段上添加`@TableLogic`注解: ```java @TableLogic private Integer deleted; ``` 然后,在配置文件中进行如下配置: ```yaml mybatis-plus: global-config: db-config: logic-delete-field: deleted logic-not-delete-value: 0 logic-delete-value: 1 ``` 这样,当调用`delete`方法时,实际上是将`deleted`字段更新为1。 ### 通用枚举 MyBatis-Plus支持通用枚举,可将数据库中的映射为Java枚举类型。在配置文件中加入以下配置: ```yaml mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler ``` 同时,定义枚举类: ```java public enum UserStatus { NORMAL(1, "正常"), DISABLED(2, "禁用"); private final int value; private final String desc; UserStatus(int value, String desc) { this.value = value; this.desc = desc; } public int getValue() { return value; } public String getDesc() { return desc; } } ``` 在实体类中使用该枚举: ```java private UserStatus status; ``` ### JSON类型处理器 可通过配置JSON类型处理器来处理JSON数据。在配置文件中加入如下配置: ```yaml mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler ``` 这样,MyBatis-Plus会使用`FastjsonTypeHandler`来处理JSON类型的数据 [^2]。 ### 生成秘钥 生成秘钥通常使用Java的加密库,与MyBatis-Plus本身并无直接关联。以下是一个使用`KeyGenerator`生成AES秘钥的示例: ```java import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; public class KeyGeneratorExample { public static void main(String[] args) throws NoSuchAlgorithmException { KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); SecretKey secretKey = keyGenerator.generateKey(); byte[] keyBytes = secretKey.getEncoded(); System.out.println("生成的秘钥:" + bytesToHex(keyBytes)); } private static String bytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte b : bytes) { result.append(String.format("%02x", b)); } return result.toString(); } } ``` ### 分页插件原理及使用 分页插件的原理是通过拦截SQL语句,在原SQL的基础上添加分页参数,实现分页查询。在MyBatis-Plus中,使用分页插件非常简单。首先,配置分页插件: ```java @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` 然后,在代码中使用分页查询: ```java Page<User> page = new Page<>(1, 10); IPage<User> userPage = userMapper.selectPage(page, Wrappers.<User>lambdaQuery().eq(User::getAge, 20)); List<User> userList = userPage.getRecords(); ``` 上述代码查询了第一页,每页10条,年龄等于20的用户数据。 ### MybatisPlus使用规定 #### 依赖添加 在Maven项目中,可在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> ``` #### 继承关系 在开发中,Service接口通常继承自`IService`接口,Service实现类继承自`ServiceImpl`类,Mapper接口继承自`BaseMapper`接口。例如: ```java // Mapper接口 public interface UserMapper extends BaseMapper<User> { } // Service接口 public interface IUserService extends IService<User> { } // Service实现类 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { } ``` #### 常用方法 MyBatis-Plus提供了许多常用方法,如`selectList`、`insert`、`update`、`delete`等。例如: ```java // 查询列表 List<User> userList = userMapper.selectList(null); // 插入数据 userMapper.insert(user); // 更新数据 userMapper.updateById(user); // 删除数据 userMapper.deleteById(1); ``` ### 常用注解 - `@TableName`:用于指定实体类对应的数据库表名。 ```java @TableName("user") public class User { // ... } ``` - `@TableId`:用于指定主键字段。 ```java @TableId(type = IdType.AUTO) private Long id; ``` - `@TableField`:用于指定字段对应的数据库列名,或设置字段是否为数据库表字段。 ```java @TableField("user_name") private String username; ``` ### 常见配置 常见的配置包括数据库连接配置、日志配置、分页插件配置等。以下是一个简单的配置示例: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:mapper/*.xml global-config: db-config: id-type: auto ``` ### 条件构造器 条件构造器用于构造复杂的查询条件。MyBatis-Plus提供了`QueryWrapper`和`LambdaQueryWrapper`等条件构造器。例如: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("age", 20).like("name", "张"); List<User> userList = userMapper.selectList(wrapper); ``` 上述代码使用`QueryWrapper`构造了一个查询条件,查询年龄等于20且姓名包含“张”的用户列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值