zoukankan      html  css  js  c++  java
  • 重学Mybatis从入门到源码之四---配置修改/别名/映射器

    前面的博客中,mysql的驱动,数据源用户名密码这些都是直接写在核心配置文件mybatis-config.xml中的,现在可以改成从外部properties文件中读取。

    首先在resources(classpath目录)下新建db.properties文件,内容:

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username=root
    password=root

    然后在mybatis-config.xml中通过properties节点引用该文件:

    <properties resource="db.properties"/>
    environment节点中将property的值改成${}的方式引用:
        <properties resource="db.properties"/>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>

    environments 下可以配置多套数据库信息,但是同一时间只能使用一套,通过default指定使用哪一套。

    如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单:

    • 每个数据库对应一个 SqlSessionFactory 实例

    为了指定创建哪种环境,只要将它(environment)作为可选的参数传递给 SqlSessionFactoryBuilder 即可:

     SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);

    如果没有这个参数就会使用default指定的那一套。

    environment中还需要注意一些点:

    • 默认的环境 ID(比如:default="development")。
    • 每个 environment 元素定义的环境 ID(比如:id="development")。
    • 事务管理器的配置(比如:type="JDBC")(Mybatis中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"))。
    • 数据源的配置(比如:type="POOLED")(type="[UNPOOLED|POOLED|JNDI]")。


    其中properties节点里面也可以写property信息,例如:

    <properties resource="org/mybatis/example/config.properties">
      <property name="username" value="dev_user"/>
      <property name="password" value="F2Fa3!33TYyg"/>
    </properties>

    这样如果在db.properties文件里面配置了,在properties节点下也配置的比如name/password 就会使用properties节点下的。

    也就是说:

    • 在 properties 元素体内指定的属性首先被读取。
    • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
    • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

    我们上面使用User类的时候都是通过完整的包名类名的方式引用,这样的话比较麻烦,可以通过起别名的方式直接使用别名,

    使用的是typeAliases,alias中是别名,可以用在任何需要使用com.candice.pojo.User的地方。

      <typeAliases>
          <typeAlias type="com.candice.pojo.User" alias="User" > 
          </typeAlias>
      </typeAliases>

    但是这种方式每增加一个类就需要增加一个配置,似乎是有点麻烦,所以还有一种方式就是指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean。

    <typeAliases>
      <package name="com.candice.pojo"/>
    </typeAliases>

    这个包下的所有的Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 

    com.candice.pojo.User

     的别名为 user;这种方式就是默认的,如果想起一个别的名字可以使用注解的方式,若有注解,则别名为其注解值。如:

        @Alias("author")
        public class Author {
            ...
        }

    对于一些常用的Java 类型内建了相应的类型别名。它们都是大小写不敏感的

    别名映射的类型
    _byte byte
    _long long
    _short short
    _int int
    _integer int
    _double double
    _float float
    _boolean boolean
    string String
    byte Byte
    long Long
    short Short
    int Integer
    integer Integer
    double Double
    float Float
    boolean Boolean
    date Date
    decimal BigDecimal
    bigdecimal BigDecimal
    object Object
    map Map
    hashmap HashMap
    list List
    arraylist ArrayList
    collection Collection
    iterator Iterator

    所以如果我们返回参数是map直接写

    resultType="map" 即可。


    映射器:告诉 MyBatis 到哪里去找到SQL语句。以使用相对于类路径的资源引用,或类名和包名等。比如:
        <!--路径-->
      <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers>
    <!-- Using mapper interface classes -->
    <mappers>
      <mapper class="org.mybatis.builder.AuthorMapper"/>
    </mappers>
    <!-- Register all interfaces in a package as mappers -->
    <mappers>
      <package name="org.mybatis.builder"/>
    </mappers>

    后面两种方式要求接口和xml配置文件在同一个包下,比如UserMapper.java与UserMapper.xml都位于mapper文件夹下,否则会报错!



  • 相关阅读:
    eclipse常用快捷键
    .net操作Excel快速
    treeview使用sort以后取消排序
    行转列,参数是文本类型
    easyui分页控件汉化扩展
    在子页面中获取父frameset中元素
    easyui-datagrid自定义分页控件样式
    字符串和图片转换
    VS2012设置随笔
    DevExpress之GridControl
  • 原文地址:https://www.cnblogs.com/yunyunde/p/13826085.html
Copyright © 2011-2022 走看看