5. sqlMapConfig.xml配置文件
sqlMapConfig.xml中的配置顺序如下:
顺序 | 配置标签名称 | 说明 |
1 | properties | 属性 |
2 | settings | 配置全局参数 |
3 | typeAliases | 类型别名 |
4 | typeHandlers | 类型处理器 |
5 | objectFactory | 对象工厂 |
6 | plugins | 插件 |
7 | environments | 环境集合属性对象 |
8 | databaseIdProvider | 多数据库支持 |
9 | mappers | 映射器 |
5.1 properties(属性)
作用:加载属性文件(db.properties)和定义属性
1. db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
2. sqlMapConfig.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>
<!-- 加载属性文件:
1.resource属性:指定本地属性文件的位置
2.url属性:指定网络上的属性文件位置
3.使用内部property标签定义属性
4.加载顺序:首先加载内部property标签定义的属性,再加载属性文件中定义的属性;
如果有相同的属性,属性文件中的属性覆盖内部property标签定义的属性-->
<properties resource="db.properties" >
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<!-- 运行环境配置;default:默认使用的环境 -->
<environments default="develop">
<!-- id:环境标识 -->
<environment id="develop">
<!-- 事务配置,type="JDBC":使用JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源配置,POOLED:MyBatis框架的连接池 -->
<dataSource type="POOLED">
<!-- <property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" /> -->
<!-- 使用db.properties属性文件中的属性 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<!--加载User.xml映射文件,说明:resource属性:指定文件的位置-->
<mapper resource="sqlMap/User.xml"/>
<!-- 加载UserMapper.xml映射文件 -->
<mapper resource="sqlMap/UserMapper.xml"/>
</mappers>
</configuration>
5.2 typeAliases(类型别名)
作用:定义类型别名,使用方便
5.2.3 内置别名:
别名 | 映射类型 |
_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 |
说明:
- 内置别名可以直接使用
- 别名不区分大小写
5.2.2 自定义别名
方式一:
<?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>
<!-- 加载属性文件:
1.resource属性:指定本地属性文件的位置
2.url属性:指定网络上的属性文件位置
3.使用内部property标签定义属性
4.加载顺序:首先加载内部property标签定义的属性,再加载属性文件中定义的属性;
如果有相同的属性,属性文件中的属性覆盖内部property标签定义的属性-->
<properties resource="db.properties" >
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<!-- 配置自定义别名 -->
<typeAliases>
<!-- 配置用户的别名:
1.type属性:别名映射的类型
2.默认使用类的名称作为别名的名称
3.alias属性:指定别名的名称-->
<typeAlias type="com.yong.po.User" alias="user"/>
</typeAliases>
<!-- 运行环境配置;default:默认使用的环境 -->
<environments default="develop">
<!-- id:环境标识 -->
<environment id="develop">
<!-- 事务配置,type="JDBC":使用JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源配置,POOLED:MyBatis框架的连接池 -->
<dataSource type="POOLED">
<!-- <property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" /> -->
<!-- 使用db.properties属性文件中的属性 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<!--加载User.xml映射文件,说明:resource属性:指定文件的位置-->
<mapper resource="sqlMap/User.xml"/>
<!-- 加载UserMapper.xml映射文件 -->
<mapper resource="sqlMap/UserMapper.xml"/>
</mappers>
</configuration>
方式二:
<!-- 配置自定义别名 -->
<typeAliases>
<!-- 配置用户的别名:
1.type属性:别名映射的类型
2.默认使用类的名称作为别名的名称
3.alias属性:指定别名的名称-->
<!-- <typeAlias type="com.yong.po.User" alias="user"/> -->
<!-- 包扫描方式配置别名,说明:
1.name属性:要扫描的包
2.默认使用类的名称,作为别名
3.如果有多个包配置多个package -->
<package name="com.yong.po"/>
</typeAliases>
5.3 Mappers(映射器)
作用:加载mapper映射文件
方式一:
<!-- 加载映射文件 -->
<mappers>
<!--加载User.xml映射文件,说明:resource属性:指定文件的位置-->
<mapper resource="sqlMap/User.xml"/>
<!-- 加载UserMapper.xml映射文件 -->
<mapper resource="sqlMap/UserMapper.xml"/>
</mappers>
方式二:
<!-- 加载映射文件 -->
<mappers>
<!--加载User.xml映射文件,说明:resource属性:指定文件的位置-->
<!-- <mapper resource="sqlMap/User.xml"/> -->
<!-- 加载UserMapper.xml映射文件 -->
<!-- <mapper resource="sqlMap/UserMapper.xml"/> -->
<!-- 包扫描方式配置映射文件:
1.name属性:要扫描的包名称
2.前提必须是mapper代理开发方法
3.要求mapper映射文件,与mapper接口在同一个目录
4.要求mapper映射文件的名称,与mapper接口名称一致-->
<package name="com.yong.mapper"/>
</mappers>
6. 输入输出映射
6.1 输入映射
6.1.1 ParameterType
Java简单类型:
详情见入门程序
<!-- select标签:用于放置查询sql语句
#{}占位符,相当于jdbc中的问号?当参数传递的是java简单类型的时候,花括号中的内容可以是任意字符串 -->
<select id="queryUserById" parameterType="int" resultType="com.yong.po.User">
select * from user where id=#{id}
</select>
Pojo类型
详情见入门程序
<!-- insert标签:用于放置新增sql语句
id属性:唯一区分一条sql语句
parameterType属性:输入参数类型
resultType属性:返回值类型
#{}:占位符,当参数传递的是pojo的时候,花括号中的内容是pojo的属性
查询主键:
useGeneratedKeys="true": 使用自动生成主键
keyColumn="id":表中列名
keyProperty="id":pojo中属性名 -->
<insert id="insert" parameterType="com.yong.po.User" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
<!-- selectKey标签:查询主键,说明:
keyColumn属性:主键字段(表)
keyProperty属性:主键属性(pojo)
resultType属性:指定主键字段类型
order属性:指定在insert语句执行前还是执行后,获取主键。
AFTER:在insert语句之后
BEFORE:在insert语句之前 -->
<!-- <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey> -->
insert into user (username, sex, birthday, mobilephone, email, password) values (#{username}, #{sex}, #{birthday}, #{mobilephone}, #{email}, #{password})
</insert>
6.2 输出映射
6.2.1 resultType
Java简单类型:
1. UserMapper.xml
<select id="queryCount" resultType="int">
select count(*) from user
</select>
2. UserMapper.java
int queryCount();
3. 测试
@Test
public void queryCount() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int count = userMapper.queryCount();
System.out.println("count = " + count);
sqlSession.close();
}
Pojo类型
详情见入门程序
<!-- select标签:用于放置查询sql语句
#{}占位符,相当于jdbc中的问号?当参数传递的是java简单类型的时候,花括号中的内容可以是任意字符串 -->
<select id="queryUserById" parameterType="int" resultType="com.yong.po.User">
select * from user where id=#{id}
</select>
6.2.2 resultMap
当表的列名和pojo属性名不一样时,使用resultType时,会出现部分属性值无法成功转换。此时,我们需要使用resultMap手动设置表的列名和pojo的属性名的对应关系。
问题引入:
1. 新建UserTemp.java,将id属性名改为userId
package com.yong.po;
import java.util.Date;
public class UserTemp {
private Integer userId; // int(11) NOT NULL AUTO_INCREMENT,
private String username; // varchar(255) DEFAULT NULL,
private String sex; // varchar(255) DEFAULT NULL,
private Date birthday; // date DEFAULT NULL,
private String mobilephone; // varchar(255) DEFAULT NULL,
private String email; // varchar(255) DEFAULT NULL,
private String password; // varchar(255) DEFAULT NULL,
public UserTemp() {
super();
// TODO Auto-generated constructor stub
}
public UserTemp(Integer userId, String username, String sex, Date birthday, String mobilephone, String email,
String password) {
super();
this.userId = userId;
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.mobilephone = mobilephone;
this.email = email;
this.password = password;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getMobilephone() {
return mobilephone;
}
public void setMobilephone(String mobilephone) {
this.mobilephone = mobilephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserTemp [userId=" + userId + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday
+ ", mobilephone=" + mobilephone + ", email=" + email + ", password=" + password + "]";
}
}
2. UserMapper.java
List<UserTemp> queryUserByUsername(String username);
3. UserMapper.xml
<select id="queryUserByUsername" parameterType="string" resultType="com.yong.po.UserTemp">
select * from user where username like '%${value}%'
</select>
4. 测试
@Test
public void queryUserByUsername() {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<UserTemp> userTemps = userMapper.queryUserByUsername("Y");
System.out.println(userTemps);
sqlSession.close();
}
结果:
解决问题:
1. 修改UserMap.xml
<!-- resultMap标签:配置java对象的属性,与sql语句的字段对应
type属性:映射的类型
id属性:唯一标识,通过id引用该resultMap-->
<resultMap type="com.yong.po.UserTemp" id="userTempMap">
<!--id标签:配置主键的对应关系
column属性:主键字段(表)
property属性:主键属性(pojo) -->
<id column="id" property="userId"/>
<!--result标签:配置普通字段对应关系 -->
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="birthday" property="birthday"/>
<result column="mobilephone" property="mobilephone"/>
<result column="email" property="email"/>
<result column="password" property="password"/>
</resultMap>
<!-- <select id="queryUserByUsername" parameterType="string" resultType="com.yong.po.UserTemp">
select * from user where username like '%${value}%'
</select> -->
<select id="queryUserByUsername" parameterType="string" resultMap="userTempMap">
select * from user where username like '%${value}%'
</select>
结果: