一、sqlMapperConfig.xml中的标签
1、<properties>
(1)建立db.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_mybatis
jdbc.username=root
jdbc.password=root
(2)在SqlMapperConfig.xml中
添加<properties>标签,并且修改<dataSource>中的value属性
<!-- 读取配置文件 -->
<properties resource="db.properties"/>
<!-- 使用连接池连接数据库 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
Mybatis官网:http://www.mybatis.org/mybatis-3/zh/configuration.html#properties
在查Mybatis官网资料的properties属性中,有一个点是我弄了很久才搞明白的,记录下来;
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</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>
优先级的顺序是:<dataSource> 中的value属性值 > resource=""指定的配置文件 ><property>中的属性值;
2、<typeAliases>:配置别名
<typeAliases>
<!-- 推荐使用package包的形式来配置别名,包的形式会扫描
主包及子包下的所有文件以对象类名为别名,大小写不限,推荐使用小写-->
<!-- <typeAlias type="com.dunka.mybatis.User" alias="user"/> -->
<package name="com.dunka.mybatis"/>
</typeAliases>
3、<mappers>:注册映射器
<mappers>
<!-- 使用相对于类路径的资源引用 -->
<!-- <mapper resource="mapper/UserMapper.xml"/> -->
<!-- 使用完全限定资源定位符(URL) -->
<!-- <mapper url="file:\\\G:\eclipse-workspace\mybatis_test\src\mapper\UserMapper.xml"/> -->
<!-- 使用映射器接口实现类的完全限定类名 -->
<!-- <mapper class="com.dunka.mapper.UserMapper"/> -->
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<package name="com.dunka.mapper"/>
</mappers>
需要说明的是<mapper class="">中的全包名,需要把UserMapper.xml和UserMapper的接口放在同一个包下,否则会报错,因为引用class会找不到非同包下的文件
4、Mybatis的XML配置文件,有一个需要注意的地方是每个标签的位置要按顺序
- properties(读取配置文件)
- settings(全局配置参数)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象,与Spring框架整合后Say Good Bye)
- environment(环境子属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- mappers(配置映射器位置)
5、MyBatis输入和输出映射
- 输入映射parameterType;
- 基本类型;
- 自定义对象;
- 自定义包装类;
- 输出映射resultType、resultMap;
- resultType:
- 基本类型;
- 自定义对象;
- 集合;
- resultMap;
- bean对象字段与数据表字段不匹配;
- 自定义包装类;
- resultType:
6 、一对一关联查询。例如:一个公民属于一个国家。
1、UserVo类,两个表的关联类:
public class UserVo extends User{
private Country country;
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
@Override
public String toString() {
return "UserVo [country=" + country + ", getU_id()=" + getU_id() + ", getU_username()=" + getU_username()
+ ", getU_sex()=" + getU_sex()
+ "]";
}
}
2、UserMapper接口:public List<UserVo> selectUserByUserVo();
3、UserMapper.xml中查询语句的书写:
<!-- public List<UserVo> selectUserByUserVo(); -->
<resultMap type="UserVo" id="uservolist">
<id property="u_id" column="u_id"/>
<result property="u_username" column="u_username"/>
<result property="u_sex" column="u_sex"/>
<!-- 关联两表 一对一关系 -->
<association property="country" javaType="Country">
<id property="id" column="c_id"/>
<result property="c_countryname" column="c_countryname"/>
<result property="c_capital" column="c_capital"/>
</association>
</resultMap>
<select id="selectUserByUserVo" resultMap="uservolist" >
SELECT u.u_id,u.u_username,u.u_sex,c.c_id,c.c_countryname,c.c_capital
from user u left join country c
on u.u_cid=c.c_id
</select>
其中,出现了一个找不到c_id的SQLbuildException,结果是因为,我最初写出<result property="id" column="c_id"/>,后来将其改为id标签就可以运行了,查了下原因,说最好是主键用id,其它普通键用result。而写关联两表,用<association>
7、关联两表:一对多。例如:一个国家可以有多个公民。
1、CountryVo:
public class CountryVo extends Country{
private List<User> userlist;
public List<User> getUserlist() {
return userlist;
}
public void setUserlist(List<User> userlist) {
this.userlist = userlist;
}
@Override
public String toString() {
return super.toString()+"userlist:"+userlist.toString();
}
}
2、CountryMapper接口:public List<CountryVo> selectAllCountryVo();
3、CountryMapper.xml:
<!-- public List<CountryVo> selectAllCountryVo(); -->
<!-- 一对多关系查询 -->
<resultMap type="CountryVo" id="countryvo">
<id property="id" column="c_id"/>
<result property="c_countryname" column="c_countryname"/>
<result property="c_capital" column="c_capital"/>
<collection property="userlist" ofType="User">
<id property="u_id" column="u_id"/>
<result property="u_username" column="u_username"/>
</collection>
</resultMap>
<select id="selectAllCountryVo" resultMap="countryvo">
SELECT c.c_id,c.c_countryname,c.c_capital,
u.u_id,u.u_username
from country c left join user u
on u.u_cid=c.c_id
</select>
总结:在mapper.xml中,使用resultMap,对于一对一关系中对于关联表:利用<association>
而对于一对多关系中:利用<collection>