MyBatis 源码学习之三 MyBatis开发遇过的坑

使用MyBatis过程中遇到过一些坑,遂记录下来,结合源码分析,以共享。

配置如下:



首先测试了获取sqlsession成功


one 新增记录成功,但是数据库中无记录。

实体类如下:


数据库表如下:


执行如下测试方法


执行结果:成功。


但是查看数据库没有新增的该条记录。原因是没有提交。添加提交代码后新增记录在数据库中可以查看到。


源码分析:session = ssf.openSession();创建的SqlSession是默认不是自动提交。


修改为session = ssf.openSession(true);

Two parameterType与resultType

很多开发人员在mapper中书写这两个参数的时候常常会写全名,比如


但是其实是不需要的,parameterType如果是基本类型或者java提供的数据类型,比如String,数组或者集合,MyBatis都已经事先做了处理,不需要大家是在使用的时候写全名,请看源码TypeAliasRegistry

public TypeAliasRegistry() {
    registerAlias("string", String.class);


    registerAlias("byte", Byte.class);
    registerAlias("long", Long.class);
    registerAlias("short", Short.class);
    registerAlias("int", Integer.class);
    registerAlias("integer", Integer.class);
    registerAlias("double", Double.class);
    registerAlias("float", Float.class);
    registerAlias("boolean", Boolean.class);


    registerAlias("byte[]", Byte[].class);
    registerAlias("long[]", Long[].class);
    registerAlias("short[]", Short[].class);
    registerAlias("int[]", Integer[].class);
    registerAlias("integer[]", Integer[].class);
    registerAlias("double[]", Double[].class);
    registerAlias("float[]", Float[].class);
    registerAlias("boolean[]", Boolean[].class);


    registerAlias("_byte", byte.class);
    registerAlias("_long", long.class);
    registerAlias("_short", short.class);
    registerAlias("_int", int.class);
    registerAlias("_integer", int.class);
    registerAlias("_double", double.class);
    registerAlias("_float", float.class);
    registerAlias("_boolean", boolean.class);


    registerAlias("_byte[]", byte[].class);
    registerAlias("_long[]", long[].class);
    registerAlias("_short[]", short[].class);
    registerAlias("_int[]", int[].class);
    registerAlias("_integer[]", int[].class);
    registerAlias("_double[]", double[].class);
    registerAlias("_float[]", float[].class);
    registerAlias("_boolean[]", boolean[].class);


    registerAlias("date", Date.class);
    registerAlias("decimal", BigDecimal.class);
    registerAlias("bigdecimal", BigDecimal.class);
    registerAlias("biginteger", BigInteger.class);
    registerAlias("object", Object.class);


    registerAlias("date[]", Date[].class);
    registerAlias("decimal[]", BigDecimal[].class);
    registerAlias("bigdecimal[]", BigDecimal[].class);
    registerAlias("biginteger[]", BigInteger[].class);
    registerAlias("object[]", Object[].class);


    registerAlias("map", Map.class);
    registerAlias("hashmap", HashMap.class);
    registerAlias("list", List.class);
    registerAlias("arraylist", ArrayList.class);
    registerAlias("collection", Collection.class);
    registerAlias("iterator", Iterator.class);


    registerAlias("ResultSet", ResultSet.class);:

}


也就是说在初始化的configration的时候系统就为我们声明了这么多别名供我们使用。但是像一些自定义的类需要我们自己为其取个别名,在配置文件中为其配置即可,MyBatis也是提供了灵活多变的方式供我们选择。

1.单个类逐一配置,适合于别名的类不多的情况,下图是官方文档截图


2.全包扫描:


现将两种方式都进行测试:


测试通过:

修改为包扫描


测试通过:


Three 配置项的顺序

    mybatis的配置文件中元素的顺序是有要求的,必须按照这个顺序进行配置,否则会报错误提示。例如我将typeAliases相关的配置放置在environments配置后,启动运行时会报错,错误如下:

org.xml.sax.SAXParseException; lineNumber: 47; columnNumber: 17; 元素类型为 "configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"。

重点是"configuration" 的内容必须匹配 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"。

修改我的配置文件中typeAliases的配置后,启动成功。

猜你喜欢

转载自blog.csdn.net/tony_java_2017/article/details/80770526