您的位置:

如何开启MyBatis的驼峰命名

MyBatis是一个持久层框架,与许多其他的ORM框架一样,它可以为你访问数据库提供非常方便的API接口,提供了很多种不同的映射方法,但在默认情况下,其SQL语句生成并不会遵循Java中的命名习惯,如果不进行额外的配置,它会将数据库中的下划线命名转化为Java中的驼峰命名方式,这就使得我们需要一些额外的配置来改善这一默认设置。接下来,我们会根据以下几个方面对如何开启Mybatis的驼峰命名进行详细阐述。

一、配置文件中设置

MyBatis的配置文件XML中有可选的配置来启用和配置这种命名规范。配置文件中有两个属性“mapUnderscoreToCamelCase” 和“useGeneratedKeys ”。前者可以将数据库列名中的下划线自动转化为驼峰式,而后者则可以配置是否允许ID自动生成器来生成主键ID。这里我们需要注意,newStandardSqlSessionFactory()方法接受的参数是Configuration对象,而该对象来自于Document对象转换而成,即:它是MyBatis框架内部用于描述整个配置文件的对象。可以看代码:
  XmlConfigBuilder xmlConfigBuilder =new XmlConfigBuilder(new InputStream(){......});
  Configuration configuration=xmlConfigBuilder.parse();
  SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration);
如何设置呢?如下所示:
  

 
   
     
    
 
   


  

二、注解方式设置

除了可以使用配置文件的方式设置之外,MyBatis也提供了注解方式来生成SQL,可以通过在接口上添加@Select,@Update等注解,来代替XML配置文件。在注解中的SQL语句中也可以使用#{}的方式来引用Java对象的属性,MyBatis将会自动将比如:userName转化为比如:user_name
public interface UserMapper {
 //注解方式
 @Select("SELECT * FROM user WHERE user_id = #{userId}")
 User selectByPrimaryKey(Integer userId);
}

三、使用MyBatis Generator生成器自动生成实体类

MyBatis Generator是一个带有扩展性的代码生成器,它的运行依赖于MyBatis框架中的配置文件和Java程序,在生成代码时可以引用数据库中表的定义信息,生成Java代码。MyBatis Generator在生成Java实体类时,可以自动将数据库中的下划线型式的列名转化为Java中的驼峰命名方式,免去了我们手动编写Java实体类的烦恼。 生成的Java实体类就像这样:
public class Student {
 private Integer id;
 private String studentName;
 private String age;
 private String sex;
}

四、使用TypeHandler实现自定义转换

TypeHandler是MyBatis中的一个类型处理器,主要负责JDBC类型与Java类型之间的转换工作。当我们在进行SQL查询时,Mybatis会将查询结果集ResultSet中的数据类型根据Java的数据类型进行自动转换。但是如果ResultSet中没有直接支持的类型,MyBatis就会直接使用jdbcType进行转换,而对于自定义转换,TypeHandler就可以发挥作用。我们可以自定义实现一个TypeHandler,用来转换下划线类型的列名为驼峰类型的属性名。 自定义TypeHandler可以继承BaseTypeHandler进行实现,然后重写 setParameter() 和 getResult() 方法。具体代码如下:
public class CamelNameTypeHandler extends BaseTypeHandler {
    // 为 SQL 设置参数,下划线类型转换为驼峰类型
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
      	ps.setString(i, parameter);
    }
  
    // 根据列名,取得下划线类型的值,将其转为驼峰类型,再映射到实体类中
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return toCamelName(rs.getString(columnName));
    }
  
    // 同上,不过是根据下标
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return toCamelName(rs.getString(columnIndex));
    }
  
    // 同上,不过是根据存储过程的结果
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return toCamelName(cs.getString(columnIndex));
    }
}

  
然后,我们需要在Mapper文件中进行配置,让Mybatis能够识别并调用这个自定义的TypeHandler。
  
    
    
   

  

五、结论

通过以上五点我们可以清楚的了解到如何通过配置文件中的设置,注解方式、自动生成器、自定义TypeHandler来解决Mybatis默认生成的SQL语句中下划线型式的列名不符合Java开发规范的问题。同样的,在实际的开发中,我们也可以结合以上方法进行具体的处理,提高开发效率,减少不必要的麻烦。