mybatis——你想知道什么

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>
了解一个框架源码,先从它的使用开始吧。


猜你喜欢

转载自blog.csdn.net/wgp15732622312/article/details/79774401