项目需要:从第三方系统获取的数据是一个list,但是我需要把这个list存入数据库,存入格式是varchar。这里就需要自定义一个简单的mybatis的handler处理器;当然java代码也可以实现,就是比较麻烦。
有俩种实现的方法:
- 一、实现TypeHandler接口的实现代码;
- 二、继承baseTypeHandler
这里只展示第一种。本实例是java中的List类型的数据存入数据库转为varchar类型
1、首先写一个handler
import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import java.util.List; public class MyBatisTypeHandler implements TypeHandler> { @Override public void setParameter(PreparedStatement preparedStatement, int i, List
strings, JdbcType jdbcType) throws SQLException { StringBuilder sb = new StringBuilder(); for(String s : strings){ sb.append(s).append(","); } preparedStatement.setString(i,sb.toString().substring(0,sb.toString().length() - 1)); } @Override public List getResult(ResultSet resultSet, String s) throws SQLException { String[] arr = resultSet.getString(s).split(","); return Arrays.asList(arr); } @Override public List getResult(ResultSet resultSet, int i) throws SQLException { String[] arr = resultSet.getString(i).split(","); return Arrays.asList(arr); } @Override public List getResult(CallableStatement callableStatement, int i) throws SQLException { String[] arr = callableStatement.getString(i).split(","); return Arrays.asList(arr); } } //这里是第二种 //public class MyTypeHandler extends baseTypeHandler > { // @Override // public void setNonNullParameter(PreparedStatement preparedStatement, int i, List
list, JdbcType jdbcType) throws SQLException { // StringBuffer sb = new StringBuffer(); // for(String s : list){ // sb.append(s).append(","); // } // preparedStatement.setString(i,sb.toString().substring(0,sb.toString().length() - 1)); // } // // @Override // public List getNullableResult(ResultSet resultSet, String s) throws SQLException { // String[] arr = resultSet.getString(s).split(","); // return Arrays.asList(arr); // } // // @Override // public List getNullableResult(ResultSet resultSet, int i) throws SQLException { // String[] arr = resultSet.getString(i).split(","); // return Arrays.asList(arr); // } // // @Override // public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException { // String[] arr = callableStatement.getString(i).split(","); // return Arrays.asList(arr); // } //}
2、准备好model类和dao层
import lombok.Data;
import java.util.List;
@Data
public class Hobby {
private Integer id;
private Integer userId;
private List hobby;
}
import com.example.library.model.Hobby;
import org.springframework.stereotype.Repository;
@Repository
public interface HobbyDao {
Hobby getHobbyById(int id);
void insertHobby(Hobby hobby);
}
3、写一下xml中的配置
这里注意一下,需要指定resultMap。 select * from hobby where id = #{id} insert into hobby (id, hobby, userId) values (#{id}, #{hobby,typeHandler=com.example.library.handler.MyBatisTypeHandler,jdbcType=VARCHAR}, #{userId})
4、写一个测试类
@Test
public void testInsert() {
try {
Hobby hobby = new Hobby();
List hobbys = new ArrayList(4);
hobbys.add("打篮球");
hobbys.add("爬山");
hobbys.add("读书");
hobbys.add("旅游");
hobby.setHobby(hobbys);
hobby.setId(3);
hobby.setUserId(3);
hobbyDao.insertHobby(hobby);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
@Test
public void testSelect() {
try {
Hobby hobby = hobbyDao.getHobbyById(1);
System.out.println("爱好:"+hobby);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
5、数据库结果
比较简单,这里只展示了list和varchar的互转,其实还有很多很强大的互转,大家可以参考一下。
以下是更多的参考:
https://blog.csdn.net/qq_42402854/article/details/84374122
https://blog.csdn.net/lmb55/article/details/90380309



