1、了解用途
有什么用途了,其实就是在insert和select的时候,假设定义了两个实体,一对一的关系,而且双向关联
比如 妻子和丈夫
准备数据
create table wife(
w_id number(10) primary key,
w_name varchar(10),
h_id references husband(h_id)
)
class Wife{
private int id ;
private String name;
private Husband husband;
//getter/setter
}
create table husband(
h_id number(10) primary key,
h_name varchar(10),
w_id references wife(w_id)
)
class Husband{
private int id ;
private String name;
private Wife wife;
//getter/setter
}
当你插入数据的时候应该是这样的
首先new 一个 对象,比如就是Husband
Husband husband = new Husband(1,"husband",new Wife(10))//假设Wife有一个只传入id 构造函数
在执行之前,假设数据库里面有ID值为10的女子
paramterType 为Husband
Sql 语句 insert into Husband values(#{id},#{name},#{wife})
那么问题来了 ,这个wife的类型怎么处理,数据库表的第三个字段为number类型,此时wife是一个自定义的类型,Mybatis不知道他是什么类型,
在插入数据库的时候不知道怎么处理,他就有点为难了,所有他就报异常了
怎么处理了,这就是自定义类型处理器
问题又来了,怎么自定义了
2、创建自定义类型处理器
其实很简单,实现一个接口就ok了
TypeHandler,对就是这个接口,这是了带有泛型的接口,在实现的时候就可以传入你需要处理的类型了
先了解API
void setParameter(PreparedStatement, int, T, JdbcType)
setParameter,参数有四个,主要用到前三个,
在插入语句的时候insert into Husband values(#{id},#{name},#{wife})
Mybatis遇到Wife,发现自身没有,它就会找,所有在实现TypeHandler接口后需要在配置文件中告诉Mybatis你自己写好了这个处理器了,不要让他问难了,也就不会报异常了
接着看前三个参数
当在设置占位符的值得时候,Mybatis会找到这个处理器,调用setParameter方法,并且把本身PreparedStatement传进来,把这个类型实体也传进来,还有就是要设置的占位符的序列号也传过来,让你自己来编写,要怎么给这个占位符赋值
这就好吧了
这个方法就是这么实现的
setParameter(PreparedStatement preparedStatement, int index, Wife wife, JdbcType jdbctype){
preparedStatement.setParameter(index,wife.getId)
}
getResult(ResultSet, String)
getResult(ResultSet, int)
getResult(CallableStatement, int)
这个方法就是在返回结果的时候处理,在这个例子中好像用不到
就看看getResult(ResultSet, String)其他类似
当jdbc返回一个结果时,需要在对象中的体现形式与数控库中的不一样
就比如性别 在数据库中用1或者0来表示,而在实体类中要使用男 或者 女来体现
这个就可以这么写
Object getResult(ResultSet resultSet, String labername){
int int_sex resultSet.getInt(labername);
String str_sex;
if(int_sex==1)
str_sex ="男"
else str_sex = "女"
return str_sex;
}
有什么用途了,其实就是在insert和select的时候,假设定义了两个实体,一对一的关系,而且双向关联
比如 妻子和丈夫
准备数据
create table wife(
w_id number(10) primary key,
w_name varchar(10),
h_id references husband(h_id)
)
class Wife{
private int id ;
private String name;
private Husband husband;
//getter/setter
}
create table husband(
h_id number(10) primary key,
h_name varchar(10),
w_id references wife(w_id)
)
class Husband{
private int id ;
private String name;
private Wife wife;
//getter/setter
}
当你插入数据的时候应该是这样的
首先new 一个 对象,比如就是Husband
Husband husband = new Husband(1,"husband",new Wife(10))//假设Wife有一个只传入id 构造函数
在执行之前,假设数据库里面有ID值为10的女子
paramterType 为Husband
Sql 语句 insert into Husband values(#{id},#{name},#{wife})
那么问题来了 ,这个wife的类型怎么处理,数据库表的第三个字段为number类型,此时wife是一个自定义的类型,Mybatis不知道他是什么类型,
在插入数据库的时候不知道怎么处理,他就有点为难了,所有他就报异常了
怎么处理了,这就是自定义类型处理器
问题又来了,怎么自定义了
2、创建自定义类型处理器
其实很简单,实现一个接口就ok了
TypeHandler,对就是这个接口,这是了带有泛型的接口,在实现的时候就可以传入你需要处理的类型了
先了解API
void setParameter(PreparedStatement, int, T, JdbcType)
setParameter,参数有四个,主要用到前三个,
在插入语句的时候insert into Husband values(#{id},#{name},#{wife})
Mybatis遇到Wife,发现自身没有,它就会找,所有在实现TypeHandler接口后需要在配置文件中告诉Mybatis你自己写好了这个处理器了,不要让他问难了,也就不会报异常了
接着看前三个参数
当在设置占位符的值得时候,Mybatis会找到这个处理器,调用setParameter方法,并且把本身PreparedStatement传进来,把这个类型实体也传进来,还有就是要设置的占位符的序列号也传过来,让你自己来编写,要怎么给这个占位符赋值
这就好吧了
这个方法就是这么实现的
setParameter(PreparedStatement preparedStatement, int index, Wife wife, JdbcType jdbctype){
preparedStatement.setParameter(index,wife.getId)
}
getResult(ResultSet, String)
getResult(ResultSet, int)
getResult(CallableStatement, int)
这个方法就是在返回结果的时候处理,在这个例子中好像用不到
就看看getResult(ResultSet, String)其他类似
当jdbc返回一个结果时,需要在对象中的体现形式与数控库中的不一样
就比如性别 在数据库中用1或者0来表示,而在实体类中要使用男 或者 女来体现
这个就可以这么写
Object getResult(ResultSet resultSet, String labername){
int int_sex resultSet.getInt(labername);
String str_sex;
if(int_sex==1)
str_sex ="男"
else str_sex = "女"
return str_sex;
}