mysql数据库字段类型int,mybatis返回long或者int

最近在做项目的时候,发现一个问题,以及解决方法。分享出来供大家参考。

在mysql数据库里有个type字段,类型为int,但是项目中mybatis查询结果集里,使用map.get("type")获取,并用Integer强转时,报错,错误说明是long类型不能转为Integer。what?怎么会变成long类型了?后来查了下,貌似mybatis偶尔会抽风,数据库里int类型的字段会时不时的被转成long或者int,所以强转就有问题了。

那怎么办呢,有个思路,是不管什么类型,统统转为string类型,然后再解析为Integer或者Long。所以可以使用以下方法:

Integer type = Integer.parseInt(map.get("type").toString());

OK ,完美解决!有遇到相同问题的同学,可以参考。

### MyBatisMySQL Geometry 类型字段的映射与处理 在 MyBatis 中处理 MySQL 的 `Geometry` 类型字段,通常需要自定义类型处理器 (`TypeHandler`) 来实现数据类型的转换。以下是详细的解决方案: #### 1. 自定义 TypeHandler 为了支持 MySQL 的 `Geometry` 类型字段,可以编写一个继承自 `BaseTypeHandler<Geometry>` 的类来完成几何对象的序列化和反序列化。 ```java import com.vividsolutions.jts.geom.Geometry; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class MysqlGeoPointTypeHandler extends BaseTypeHandler<Geometry> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Geometry parameter, JdbcType jdbcType) throws SQLException { ps.setObject(i, parameter); } @Override public Geometry getNullableResult(ResultSet rs, String columnName) throws SQLException { return (Geometry) rs.getObject(columnName); } @Override public Geometry getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return (Geometry) rs.getObject(columnIndex); } @Override public Geometry getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return (Geometry) cs.getObject(columnIndex); } } ``` 此代码片段展示了如何通过 JDBC 对象操作 `Geometry` 数据[^4]。 #### 2. 注册 TypeHandler 为了让 MyBatis 使用上述自定义的 `TypeHandler`,需将其注册到 MyBatis 的配置文件或 Java 配置中。 如果使用 XML 配置: ```xml <typeHandlers> <typeHandler handler="com.example.MysqlGeoPointTypeHandler" javaType="com.vividsolutions.jts.geom.Geometry"/> </typeHandlers> ``` 如果是基于 Spring Boot 的项目,则可以通过如下方式动态注册: ```java @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 注册自定义 TypeHandler sessionFactory.setTypeHandlers(new TypeHandler[]{new MysqlGeoPointTypeHandler()}); return sessionFactory.getObject(); } ``` 这一步骤确保了 MyBatis 能够识别并正确解析 `Geometry` 类型的数据[^5]。 #### 3. 实体类设计 在实体类中声明 `Geometry` 类型字段,并提供相应的 Getter 和 Setter 方法。 ```java import com.vividsolutions.jts.geom.Geometry; public class Location { private Long id; private String name; private Geometry geometry; // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Geometry getGeometry() { return geometry; } public void setGeometry(Geometry geometry) { this.geometry = geometry; } } ``` 该部分描述了如何构建能够映射数据库表结构的实体类[^2]。 #### 4. Mapper 接口定义 最后,在 Mapper 文件中定义 SQL 查询语句时无需特别关注 `Geometry` 字段的具体细节,因为这些已经由自定义的 `TypeHandler` 完成处理。 ```xml <select id="selectLocationById" resultType="com.example.Location"> SELECT * FROM location WHERE id = #{id} </select> <insert id="insertLocation"> INSERT INTO location(name, geometry) VALUES(#{name}, ST_GeomFromText(#{geometry.wkt})) </insert> ``` 这里需要注意的是,对于插入操作可能需要用函数如 `ST_GeomFromText()` 将 WKT(Well-Known Text)字符串转化为实际的几何对象[^3]。 --- ### 总结 以上方案涵盖了从自定义 `TypeHandler` 到其注册过程以及最终实体类的设计等多个方面,从而实现了 MyBatis 对于 MySQL `Geometry` 类型的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值