重学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文件夹下,否则会报错!



原文地址:https://www.cnblogs.com/yunyunde/p/13826085.html