还是用原来的数据库。
第一步:添加数据库列:
ALTER TABLE teachers ADD status varchar(11)
首先添加枚举类:
public enum Status {
ON,OUT,REMOBE
}
查看枚举类:
@Test
public void testEnumTeachers() {
Status status = Status.REMOBE;
System.out.println("枚举的索引:"+status.ordinal());
System.out.println("枚举的name:"+status.name());
}
输出:
枚举的索引:2
实体类添加添加枚举属性:
private Status statusNew=Status.ON;
public Teachers(Status statusNew, String name, String gender, Integer schoolId) {
super();
this.statusNew = statusNew;
this.name = name;
this.gender = gender;
this.schoolId = schoolId;
}
mapper.xml对应的方法加上 得到自增主键的属性:
<insert id="insertSelective" parameterType="entity.Teachers" useGeneratedKeys="true" keyProperty="id">
然后将逆向工程中得到的string类型的status属性替换成枚举类的属性
<insert id="insertSelective" parameterType="entity.Teachers" useGeneratedKeys="true" keyProperty="id">
insert into teachers
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="gender != null">
gender,
</if>
<if test="schoolId != null">
school_id,
</if>
<if test="statusNew != null">
status,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
<if test="gender != null">
#{gender,jdbcType=VARCHAR},
</if>
<if test="schoolId != null">
#{schoolId,jdbcType=INTEGER},
</if>
<if test="statusNew != null">
#{statusNew,jdbcType=VARCHAR},
</if>
</trim>
</insert>
最后测试:
@Test
void test1() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
TeachersMapper teachersMapper = sqlSession.getMapper(TeachersMapper.class);
Teachers teachers = new Teachers(Status.OUT, "zz", "1", 2);
teachersMapper.insertSelective(teachers);
System.out.println("插入成功:"+teachers.getId());
sqlSession.commit();
}finally {
sqlSession.close();
}
}
还有一种保存方式:
注意:
mybatis在处理枚举对象的时候是枚举的名字 ,
使用的是EnumTypehandler处理的
保存参数的时候:
ps.setString(i, parameter.name());
我们也可以改变使用另一种方法:
EnumOrdinalTypeHandler 它保存的时候是使用枚举的索引
ps.setInt(i, parameter.ordinal());
需要到全局配置文件中添加:
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="entity.Status"/>
</typeHandlers>
问题:
你说保存一个一个名字还好 要是保存一个索引该多费解啊 所以我们自定义枚举类给它添加点说明。
package entity;
public enum Status {
ON(200,"在线"),OUT(300,"离线"),REMOBE(400,"不存在");
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
private Status(Integer id,String name) {
this.id=id;
this.name=name;
}
}
测试:
@Test
public void testEnumTeachers() {
Status status = Status.REMOBE;
System.out.println("枚举的索引:"+status.ordinal());
System.out.println("枚举的name:"+status.name());
System.out.println("状态码:"+status.getId());
System.out.println("说明:"+status.getName());
}
输出:
枚举的索引:2
枚举的name:REMOBE
状态码:400
说明:不存在
·自定义typehandler·
目的:
保存数据库的时候保存的是状态码,获取数据的时候是枚举类。
枚举类:
public enum Status {
ON(200,"在线"),OUT(300,"离线"),REMOBE(400,"不存在");
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
private Status(Integer id,String name) {
this.id=id;
this.name=name;
}
public static Status getStatus(Integer id) {
switch (id) {
case 200:
return ON;
case 300:
return OUT;
case 400:
return REMOBE;
default:
return ON;
}
}
}
自定义typehandler类: 继承TypeHandler<Status>
:
public class DiyTypeHandler implements TypeHandler<Status>{
@Override
public void setParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException {
// TODO Auto-generated method stub
System.out.println("插入的状态码是:"+parameter.getId());
ps.setString(i, parameter.getId().toString());
}
@Override
public Status getResult(ResultSet rs, String columnName) throws SQLException {
int statusId = rs.getInt(columnName);
System.out.println("得到的状态码是:"+statusId);
Status status = Status.getStatus(statusId);
return status;
}
@Override
public Status getResult(ResultSet rs, int columnIndex) throws SQLException {
int statusId = rs.getInt(columnIndex);
System.out.println("得到的状态码是:"+statusId);
Status status = Status.getStatus(statusId);
return status;
}
@Override
public Status getResult(CallableStatement cs, int columnIndex) throws SQLException {
int statusId = cs.getInt(columnIndex);
System.out.println("得到的状态码是:"+statusId);
Status status = Status.getStatus(statusId);
return status;
}
}
全局配置:
<typeHandlers>
<typeHandler handler="typehandler.DiyTypeHandler" javaType="entity.Status"/>
</typeHandlers>