下面是详细的攻略,包括自动映射字段和typeHandler的注意点及示例说明。
1. 什么是mybatis-plus的自动映射字段
Mybatis-Plus中的自动映射字段指的是ORM框架通过对象和表结构的映射关系,在数据操作时自动完成对象属性和表字段之间的映射。即当我们使用Mybatis-Plus进行数据库操作时,我们不需要手动编写SQL语句,只需要编写Java代码就可以进行CRUD操作。
2. 注意点
在使用Mybatis-Plus中的自动映射字段时需要注意以下几点:
2.1 数据库字段名和Java实体类属性名的映射规则
Mybatis-Plus默认的映射规则为驼峰式和下划线式的互相转换。例如,一个字段名为user_name,在Java实体类中的对应属性名为userName。可以通过在实体类的属性上使用注解来指定字段名和属性名的映射关系:
@TableName("t_user")
public class User implements Serializable {
private static final long serialVersionUID = -5593099211726283450L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("user_name")
private String userName;
private String password;
@TableField(exist = false)
private String email;
// ... getter and setter
}
2.2 关于类型转换
当Java实体类属性的类型和数据库表中字段类型不对应时,需要使用typeHandler来进行类型转换。
2.3 自动映射有可能会造成列名冲突
当表中有两列名称相同时,Mybatis-Plus的自动映射会抛出org.apache.ibatis.executor.ExecutorException:TooManyResultsException..
异常。这种情况下需要手动处理。
3. 关于typeHandler
typeHandler主要用于数据类型的转换,Mybatis-Plus中扩展了很多类型的typeHandler,这些typeHandler可以实现自定义的类型转换。使用typeHandler可以大大简化代码和提高开发效率,但需要注意一些细节。
Mybatis-Plus提供了默认的typeHandler,如下所示:
默认类型处理器(typeHandler) | 对应的JavaType |
---|---|
BooleanTypeHandler | Boolean |
ByteTypeHandler | Byte |
DateTypeHandler | Date |
DoubleTypeHandler | Double |
FloatTypeHandler | Float |
IntegerTypeHandler | Integer |
LongTypeHandler | Long |
ShortTypeHandler | Short |
StringTypeHandler | String |
BlobTypeHandler | Blob |
ClobTypeHandler | Clob |
如果我们需要使用自定义类型转换器,需要实现相应的类型转换器和这个类型转换器对应的Java类型,使用方式如下所示:
3.1 自定义typeHandler
@MappedTypes({MyEnum.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class MyEnumTypeHandler extends BaseTypeHandler<MyEnum> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, MyEnum parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.getValue());
}
@Override
public MyEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return StringUtils.isEmpty(value) ? null : MyEnum.getEnum(value);
}
@Override
public MyEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return StringUtils.isEmpty(value) ? null : MyEnum.getEnum(value);
}
@Override
public MyEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return StringUtils.isEmpty(value) ? null : MyEnum.getEnum(value);
}
}
3.2 注册typeHandlers
使用自定义的typeHandler需要在Mybatis配置文件
中配置,在Mybatis-Plus中可以使用注解@MybatisPlusConfigurer
通过一个Java配置类来配置typeHandler:
@Configuration
@MapperScan("com.example.demo.mapper*")
@MybatisPlusConfigurer
public class MybatisPlusConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new MybatisPlusCustomizers();
}
static class MybatisPlusCustomizers implements ConfigurationCustomizer {
@Override
public void customize(Configuration configuration) {
configuration.setDefaultEnumTypeHandler(MyEnumTypeHandler.class);
}
}
}
4. 示例说明
下面以一个实际的例子来说明如何使用自动映射字段和typeHandler:
4.1 数据库表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`gender` varchar(2) DEFAULT NULL,
`phone` varchar(15) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
4.2 Java实体类
@Data
@NoArgsConstructor
@Table("user")
@ApiModel(description = "用户信息")
public class User implements Serializable {
public enum Gender {
MALE("男"),
FEMALE("女");
private final String desc;
Gender(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
private static final long serialVersionUID = -5593099211726283450L;
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "用户ID", position = 1)
private Long id;
@TableField(value = "user_name", el = "userName")
@NotNull
@Length(max = 255)
@ApiModelProperty(value = "用户名", position = 2)
private String userName;
@TableField
@ApiModelProperty(value = "密码", position = 3)
private String password;
@TableField(value = "email", el = "email")
@ApiModelProperty(value = "邮箱", position = 4)
private String email;
@TableField(value = "gender", typeHandler = MyEnumTypeHandler.class)
@ApiModelProperty(value = "性别", position = 5)
private Gender gender;
@TableField(value = "phone", el = "phone")
@ApiModelProperty(value = "手机号", position = 6)
private String phone;
}
4.3 Mybatis-Plus操作数据库
@SpringBootTest
@RunWith(SpringRunner.class)
public class MybatisPlusTest {
@Autowired
private UserMapper userMapper;
@Test
public void testAutoMapping() {
// INSERT
User user = new User();
user.setUserName("张三");
user.setPassword("123");
user.setEmail("zhangsan@qq.com");
user.setGender(User.Gender.MALE);
user.setPhone("12345678910");
int count = userMapper.insert(user);
Assert.assertEquals(1, count);
// SELECT
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("id", user.getId());
User result = userMapper.selectOne(wrapper);
Assert.assertEquals(user.getUserName(), result.getUserName());
Assert.assertEquals(user.getPassword(), result.getPassword());
Assert.assertEquals(user.getEmail(), result.getEmail());
Assert.assertEquals(user.getGender(), result.getGender());
Assert.assertEquals(user.getPhone(), result.getPhone());
// UPDATE
User updateUser = new User();
updateUser.setId(user.getId());
updateUser.setUserName("李四");
int updateCount = userMapper.updateById(updateUser);
Assert.assertEquals(1, updateCount);
User updatedUser = userMapper.selectById(user.getId());
Assert.assertEquals(updateUser.getUserName(), updatedUser.getUserName());
Assert.assertEquals(user.getPassword(), updatedUser.getPassword());
Assert.assertEquals(user.getEmail(), updatedUser.getEmail());
Assert.assertEquals(user.getGender(), updatedUser.getGender());
Assert.assertEquals(user.getPhone(), updatedUser.getPhone());
// DELETE
int deleteCount = userMapper.deleteById(user.getId());
Assert.assertEquals(1, deleteCount);
}
}
通过上面的例子可以看出,使用自动映射字段和自定义typeHandler可以大大简化代码和提高开发效率。同时需要注意上面提到的注意点。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis-plus之自动映射字段(typeHandler)的注意点及说明 - Python技术站