源码:Mybatis学习源码
属性(properties)
在mybatis-config.xml中可以使用properties
标签对属性进行动态替换。
mybatis-config.xml配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 环境配置 -->
<properties>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,这里动态获取config.properties文件中的内容-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value= "${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- mapping文件路径配置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
可以看到上面将username
和password
属性进行替换。
<properties>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
下面可以直接使用属性替换。
<property name="username" value="${username}" />
<property name="password" value="${password}" />
还可以导入文件配置。
创建数据库配置文件db.properties
,其内容如下
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
username = root
password = 123456
mybatis-config.xml
内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 环境配置 -->
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,这里动态获取config.properties文件中的内容-->
<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>
<!-- mapping文件路径配置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers>
</configuration>
当db.properties
中的属性和properties
中属性冲突时,以db.properties
中为准。
两者中都有username
属性。111是错误的用户名。
<properties resource="db.properties">
<property name="username" value="111"/>
<property name="password" value="123456"/>
</properties>
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
username = root
password = 123456
依然可以运行成功
别名配置
typeAliases
标签下可以存在多个typeAlias
标签。使用typeAlias
标签可以简化全限定类名。
mybatis-config.xml
配置如下:
<typeAliases>
<typeAlias alias="User" type="org.zhang.User"/>
</typeAliases>
在以前的Mapper中resultType
要写全限定类名 ‘org.zhang.User’,现在只要写User
即可。
<select id="findAllUser" resultType="User">
select * from user
</select>
也可以导入一个包下的所有类,将使用首字母小写的非限定类名来作为它的别名。
<typeAliases>
<package name="org.zhang"/>
</typeAliases>
另外可以使用注解来给类起别名。
@Alias("aaa")
public class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
'}';
}
}
使用注解后,可以使用注解中的名字作为别名。
<select id="findById" parameterType="String" resultType="aaa">
select * from user where id = #{id}
</select>
结果集映射
假如现在实体类的属性和数据库里面的属性不一样,这时候就需要使用resultMap
映射数据库和实体类中的属性。
在resultMap标签中,type为全限定类名,如果有配置别名可以使用别名,id是resultMap的名
property为实体类中的属性,id是想要映射的数据库中的属性名。
public class User {
private String i;
private String name;
@Override
public String toString() {
return "User{" +
"i='" + i + '\'' +
", name='" + name + '\'' +
'}';
}
public User() {
}
public User(String i, String name) {
this.i = i;
this.name = name;
}
public String getI() {
return i;
}
public void setI(String i) {
this.i = i;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<resultMap id="User" type="User">
<id column="id" property="i"/>
</resultMap>
<select id="findById" resultMap="User">
select * from user where name = #{id}
</select>