前面的博客中,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文件夹下,否则会报错!