1、首先配置mybatis的配置文件,基本配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"></properties>
<settings>
<setting name="cacheEnabled" value="true"></setting>
<setting name="lazyLoadingEnabled" value="true"></setting>
</settings>
<typeAliases>
<package name="mytyperhandler"></package>
</typeAliases>
<typeHandlers>
<package name="test_typeHandler"></package>
</typeHandlers>
<objectFactory type="myobjectfactory.MyObjectFactory">
<property name="someProperty" value="100"></property>
</objectFactory>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="User-mapper.xml"/>
</mappers>
<!--使用注解
<mappers>
<package name="mytyperhandler"></package>
</mappers>
-->
</configuration>
2、jdbc.properties数据库配置文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf-8
username = root
password = 157382
3、配置User-mapper.xml为映射文件,其代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mytyperhandler.UserMapper">
<insert id="insertUser" parameterType="user">
insert into users(name,age,hobbys) values(#{name},#{age}, #{hobbys, typeHandler=mytyperhandler.StringArrayByBaseTyperHandler})
</insert>
<select id="selectOne" parameterType="int" resultMap="getUser">
select name,age,hobbys from users where id = #{id}
</select>
<resultMap id="getUser" type="user">
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<result property="hobbys" column="hobbys" typeHandler="mytyperhandler.StringArrayByBaseTyperHandler"></result>
</resultMap>
</mapper>
4、自定义类型转换器,代码如下:
package mytyperhandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
public class StringArrayByBaseTyperHandler extends BaseTypeHandler<String[]> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
if(parameter==null){
ps.setNull(i,Types.VARCHAR);
}else {
StringBuilder stringBuilder = new StringBuilder();
for(String string:parameter){
stringBuilder.append(string+"_");
}
stringBuilder.deleteCharAt(stringBuilder.length()-1);
ps.setString(i,stringBuilder.toString());
}
}
@Override
public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
String result = rs.getString(columnName);
return getStringArrays(result);
}
@Override
public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String result = rs.getString(columnIndex);
return getStringArrays(result);
}
@Override
public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String result = cs.getString(columnIndex);
return getStringArrays(result);
}
public String[] getStringArrays(String result){
return result.split("_");
}
}
5、自定义ObjectFactory,实现结果的封装返回
package myobjectfactory;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.log4j.Logger;
import java.util.List;
import java.util.Properties;
public class MyObjectFactory extends DefaultObjectFactory {
Logger logger = Logger.getLogger(MyObjectFactory.class);
private Object temp = null;
@Override
public <T> T create(Class<T> type) {
T result = super.create(type);
logger.info("参数type的为"+type);
logger.info("创建的对象是否相同"+(temp==result));
return result;
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
T result = super.create(type, constructorArgTypes, constructorArgs);
logger.info("创建的result对象的类型"+result.getClass().getTypeName());
temp = result;
return result;
}
@Override
public void setProperties(Properties properties) {
logger.info("初始化的参数为:"+properties);
super.setProperties(properties);
}
@Override
public <T> boolean isCollection(Class<T> type) {
return super.isCollection(type);
}
}
6、定义POJO类-User类
package mytyperhandler;
public class User {
private String name;
private int age;
private String[] hobbys;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getHobbys() {
return hobbys;
}
public void setHobbys(String[] hobbys) {
this.hobbys = hobbys;
}
}
7、根据Mapper.xml文件构建UserMapper
package mytyperhandler;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
// @Insert("insert into users(name,age,hobbys) values(#{name},#{age}, #{hobbys, typeHandler=mytyperhandler.StringArrayByBaseTyperHandler})")
public void insertUser(User user);
public User selectOne(int id);
}
8、测试是否可以正常使用
package test_typeHandler;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import mytyperhandler.User;
import mytyperhandler.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.*;
import java.nio.Buffer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestStringTyperHandler {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setName("黎明");
user.setAge(12);
String[] strings = {"1","2","3"};
user.setHobbys(strings);
mapper.insertUser(user);
sqlSession.commit();
//获取用户数据
User user1 = mapper.selectOne(3);
System.out.println(user1.getName());
System.out.println(user1.getHobbys().toString());
sqlSession.close();
//jdbc链接数据库
// Class.forName("com.mysql.jdbc.Driver");
// String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
// Connection root = DriverManager.getConnection(url, "root", "157382");
//
// System.out.println(root);
// String sql = "insert into users(id,name,age,hobbys) values (3,'李龙',13,'足球')";
// PreparedStatement preparedStatement = root.prepareStatement(sql);
// int i = preparedStatement.executeUpdate();
// System.out.println(i);
}
}
9、经测试,是可以使用的Mybatis