【SSM_Mybatis】学习笔记04

一、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配置文件,有一个需要注意的地方是每个标签的位置要按顺序

  1. properties(读取配置文件)
  2. settings(全局配置参数)
  3. typeAliases(类型别名)
  4. typeHandlers(类型处理器)
  5. objectFactory(对象工厂)
  6. plugins(插件)
  7. environments(环境集合属性对象,与Spring框架整合后Say Good Bye)
    1. environment(环境子属性对象)
    2. transactionManager(事务管理)
    3. dataSource(数据源)
  8. mappers(配置映射器位置)

5、MyBatis输入和输出映射

  1. 输入映射parameterType;
    1. 基本类型;
    2. 自定义对象;
    3. 自定义包装类;
  2. 输出映射resultType、resultMap;
    1. resultType:
      1. 基本类型;
      2. 自定义对象;
      3. 集合;
    2. resultMap;
      1. bean对象字段与数据表字段不匹配;
      2. 自定义包装类;

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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多啦CCCC梦

你的鼓励将是我最大的创作动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值