资讯专栏INFORMATION COLUMN

Mybatis使用小札

SegmentFault / 3052人阅读

摘要:你数据库的默认值不起作用而是得到,那怎么解决这个问题呢通过使用和标签我们解决了这个问题。将和均交由该处理,但本人实测,这个好像并没有什么卵用,有用的是在文件中显式指定,如下所示。

前言

Mybatis在我所见过的持久化框架里真心是一个异类,因为它是sql-centric的,而不是基于对象和表映射的。我会在本文中讲一下Mybatis几个重要的技巧,与本文的上一篇文章Hibernate做个对比。

Mybatis配置

在ApplicationContext上加上如下配置:

XML
        
        
        
    
    
        
    
    
        


然后在mybatis-config.xml中做进一步的配置。

XML

    
        
    

    
Mybatis 分页

Mybatis不支持分页,所以我采用了PageHelper这个插件,首先在你的Mybatis配置文件里加上一下配置

XML

然后在需要分页的查询之前,加上下面一句话:

javaPageHelper.startPage(pageNum,PAGE_SIZE);
Mybatis 中的sql标签

由于Mybatis是通过文本替换组装生成SQL语句的,所以不难发现它的插入和更新同样是静态的,对象里是null的插入也是null。你数据库的默认值不起作用而是得到null,那怎么解决这个问题呢?

XML
        
            id,
            phone,
            email,
            photo,
        



        
            #{id},
            #{phone},
            #{email},
            #{photo},
        



        insert into user ()
        values ()


通过使用include和sql标签我们解决了这个问题。

Mybatis typeHandler

有时候我们常常想将Collection或者其他对象直接以Json字符串的形式存在数据库里而不是再开一张表,虽然普遍的观点是不赞同这种做法,但这种需求却是实际存在的。怎么才能在DAO中就将字符串和对象的转换做掉而不用交给上层显式地转换呢?

采用自定义的Typehandler就可以,下面给出一个例子

java@MappedJdbcTypes(JdbcType.VARCHAR)
public class JSONHandler implements TypeHandler {

    /**
      * json数据和类名的分隔符号
      * */
     private static final char SPLIT = "/"; 


     /**
      * json 转换成对象
      * */
     private Object jsonToObject(String json) throws RuntimeException{
        if (json == null) {
            return null;
        }
        int index = json.lastIndexOf(SPLIT);
        if (index < 0) {
            return null;
        }
        String key = json.substring(index + 1, json.length());
        json = json.substring(0, index);
        Class cls = null;
        try {
            cls = Class.forName(key);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("序列化成json时找不到指定的类", e);
        }
        Object ob = JSON.parseObject(json, cls);
        return ob;
    }

    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        if(parameter == null){
             ps.setString(i, null);
             return;
        }
            String json = JSON.toJSONString(parameter);
            json  = json + SPLIT + parameter.getClass().getName();
            ps.setString(i, json);

    }

    public Object getResult(ResultSet rs, String columnName) throws SQLException {
        String  json = rs.getString(columnName);
        return  jsonToObject(json);
    }

    public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
        String json=rs.getString(columnIndex);
        return jsonToObject(json);
    }

    public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String  json = cs.getString(columnIndex);
        return  jsonToObject(json);
    }


}


首先设定处理的JDBCType,显然是变长字符,然后实现给定的接口,最后在Mybatis的配置文件中加上这么一句。

XML

将Map和List均交由该handler处理,但本人实测,这个好像并没有什么卵用,有用的是在Mapper.xml文件中显式指定,如下所示。

XML
insert (tags) values (#{tags,typeHandler=sbeat.util.helper.JSONHandler})


    

Mybatis 外键查询

外键查询需要使用resultMap的association标签,如下所示

XML    
        
        
        
        
        
        
                
        
            
            
            
            
            
            
            
        
    
Mybatis 多参数

在接口定义中使用@Params注解,并在XML中不定义paramType,如下所示

javapublic List findByTradeId(@Param("tradeId") Long tradeId,@Param("ownerType") UserType ownerType);
XML    
Mybatis 逗号问题

逗号的不注意往往是使用Mybatis中出现最多的失误,可以通过使用where和set一级trim标签来尽量避免,如下所示:

XML
    id,
    phone,


    phone=#{phone},
    name=#{name},


    id=#{id}
    
        AND logic_delete=#{logic_delete}
        
            AND logic_delete=false
        
    
     AND name=#{name}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64398.html

相关文章

  • 《JavaScript设计模式与开发实践》 —— <阅读小札·一>

    摘要:阅读小札一阅读前自大学课上,就开始接触设计模式,但对设计模式却鲜有研究与实践。第二部分是核心部分,由浅到深讲解个设计模式。设计模式遵循的原则所有设计模式罪训的一条原则就是找出程序中变化的地方,并将变化封装起来。 阅读小札 · 阅读前 自大学Java课上,就开始接触设计模式,但对设计模式却鲜有研究与实践。最近向公司反映和游说技术提升,得以获得公司提供购书机会,借此认真学习前端学习之路的...

    Yangder 评论0 收藏0
  • Hibernate使用小札

    摘要:本文将由浅入深为您带来一个粗略的使用体验。当再次调用时,将得到一个新的,并重新开始这一系列工作。与此同时,提供了一套自己的,使用注解即可,主要有,,等,两种级联可以同时使用。 前言 Hibernate作为Java中最为流行的O/R映射框架,同时已经完全遵照JPA规范并作为其实现的一个超集,它能够帮助我们快速进行开发,从繁重的持久化层实现中脱离出来。本文将由浅入深为您带来一个粗略的Hi...

    starsfun 评论0 收藏0
  • MyBatis入门使用

    摘要:入门使用简介是支持普通查询存储过程和高级映射的持久层框架。一般情况下是被整合使用的,但是他也可以独立使用。独立使用步骤建立类。配置文件主要用于配置程序中可变性高的设置,中的配置文件主要封装在中。针对,注册类型的,以及用于映射接口的。 MyBatis入门使用 MyBatis简介 MyBatis是支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis消除了几乎所有的JDBC代码...

    shiyang6017 评论0 收藏0
  • MyBatis入门介绍

    摘要:入门介绍简介是支持普通查询存储过程和高级映射的持久层框架。独立使用步骤建立类。配置文件主要用于配置程序中可变性高的设置,中的配置文件主要封装在中。对应于全局配置中的的配置属性。进行测试代码实例建立类。针对,注册类型的,以及用于映射接口的。 MyBatis入门介绍 MyBatis简介 MyBatis是支持普通SQL查询、存储过程和高级映射的持久层框架。MyBatis消除了几乎所有的JDB...

    Eirunye 评论0 收藏0
  • MyBatis-Plus初步

    摘要:是最流行的关系型数据库管理系统之一,在应用方面,是最好的,关系数据库管理系统应用软件。是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 本章主要是对MyBatis-Plus的初步介绍,包括一些背景知识、环境搭建、初步使用等知识和例子。对于背景知识,主要包含对MyBatis-Plus的特性介绍、为什么使用MyB...

    娣辩孩 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<