mybatis一套半ORM的框架。你想知道写什么内容呢,来吧来吧。一起讨论下。是映射文件呢,还是类型处理器呢,还是objectFactory呢
映射文件,专为接口的动态代理sql而生。
动态代理部分需要进一步去研究 ,未完待续
Handler
这个一般都是采用继承 BaseTypeHandler 或者实现TypeHandler接口,来自定义自己的Handler。那么问题来了,自定义Handler有什么意义呢。先拿官方的例子来说话。
UserEntity类有一个枚举类型的字段。那么在存入数据库时,我是不可能存入一个枚举类型啊。这个时候就需要写自己的枚举类型处理器了。而mybatis给我们提供了多种多样的配置方案。
public class UserEntity extends BaseEntity { private String userName; private String passWord; private String phone; private String email; private String userInfo; private SexEnums sex;
在mybatis的全局配置文件里添加自己的Handler
<typeHandlers> <typeHandler javaType="com.ssm.mybatis.typeenum.SexEnums" handler="com.ssm.mybatis.typehandler.SexEnumHandler"/> </typeHandlers>
也可以这样配置,在插入时指定Handler
#{sex,typeHandler=com.ssm.mybatis.typehandler.SexEnumHandler},
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> insert into tb_user <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id!=null"> id, </if> <if test="userName!=null"> username, </if> <if test="passWord!=null"> password, </if> <if test="phone!=null"> phone, </if> <if test="email!=null"> email, </if> <if test="sex!=null"> sex, </if> created, updated </trim> <trim prefix="values(" suffix=")" suffixOverrides=","> <if test="id!=null"> #{id,jdbcType=VARCHAR}, </if> <if test="userName!=null"> #{userName,jdbcType=VARCHAR}, </if> <if test="passWord!=null"> #{passWord,jdbcType=VARCHAR}, </if> <if test="phone!=null"> #{phone,jdbcType=VARCHAR}, </if> <if test="email!=null"> #{email,jdbcType=VARCHAR}, </if> <if test="sex!=null"> #{sex,typeHandler=com.ssm.mybatis.typehandler.SexEnumHandler}, </if> SYSDATE(), SYSDATE() </trim> </insert>经过本人亲自测试,以上两种方式第二种优先级高。也就是说针对不同的插入,可以在insert里指定不同的handler。
objectFactory
我的想法是用于查询。怎么说呢,我的实体有一个userInfo属性,是userName和password的连接,那么我可以在自己的ObjectFactory里重写create方法,给userInfo赋值。自我感觉这个自定义的objectFactory一般不会用到它。
public class MyObjectFactory extends DefaultObjectFactory { @Override public void setProperties(Properties properties) { super.setProperties(properties); } @Override public <T> T create(Class<T> type) { T t = super.create(type); if(t!=null){ if(t.getClass().equals(UserEntity.class)){ ((UserEntity)t).setUserName("武刚鹏"); ((UserEntity) t).setPassWord("1"); ((UserEntity)t).setUserInfo(((UserEntity)t).getPassWord()+((UserEntity) t).getUserName()); } } return t; } @Override public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) { return super.create(type,constructorArgTypes,constructorArgs); } @Override public <T> boolean isCollection(Class<T> type) { return super.isCollection(type); } }
当然了,有了自己的objectFactory,我还要配置下mybatis的全局配置文件。
<objectFactory type="com.ssm.mybatis.objectfactory.MyObjectFactory"/>
获取主键
有这样的需求,插入数据到数据库时,需要得到插入时的自增长ID。可以这么写insert元素的语句,参照该博文上方的insert语句。useGeneratedKeys =true keyProperty = "id"
插入语句:在最后输出下userEntity的id,你会发现它是有值的。这是mybatis自动给UserEntity附上值的。
public void insertUser(SqlSession session){ UserEntity userEntity = new UserEntity(); userEntity.setUserInfo("我的信息"); userEntity.setUserName("武刚鹏2"); userEntity.setPassWord("123456"); userEntity.setEmail("[email protected]"); userEntity.setSex(SexEnums.MALE); UserMapper userMapper = session.getMapper(UserMapper.class); Integer a = userMapper.insertUser(userEntity); System.out.println(userEntity.getId()); System.out.println(a); }
最后附上自己的mybatis版本和mysql连接的版本
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>了解一个框架源码,先从它的使用开始吧。