Mybatis(二)[SqlMapConfig文件配置、输入输出参数映射解读] 菜鸟日记--day05(上)

Mybatis(二)[SqlMapConfig文件配置、输入输出参数映射解读]–day05 上

一、SqlMapConfig配置

1.properties属性配置

1)单条属性配置 不建议使用
<properties  >
		<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
2) 从配置文件中读取配置

优点:sqlMapConfig.xml 中配置信息过多,单独拆分出去便于修改
加载db.properties文件下的参数配置

<properties  resource="db.properties"></properties>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

属性名尽量用特殊写法,不易重复如:xxx.xxx.x 在原因获取属性优先级。
这里有一个还没解决的问题,如何加载指定的多个配置文件,不会插个眼

3)从Mapper.xml 文件中获取。
<select id="findTbUserById" parameterType="long"
		resultType="com.test.mybatis.pojo.TbUser">
		select * from tb_user where id=#{id}
	</select>

select * from tb_user where id=#{id}
如果这里的#{id} 写成上面 1) 2) 中配置的属性名如:jdbc.url 将会将 1) 2)中的同名属性覆盖

4) 配置加载优先级
顺序
    1 sqlMapConfig.xml 中定义的配置属性参数:1)
    2 db.properties resource引入配置 2)
    3 Mapper映射文件中的参数 3)
优先级:
引入顺序执行同时,执行的是覆盖操作,所以优先级排序正好相反 3)→2)→1)

2.settings 设置

 全局参数配置(调整运行参数:开启二级缓冲、延迟加载等 如果设置错误将会影像程序正常执行)
详细配置参数表

3.typealiases 别名配置

 在statement(Mapper映射文件 select、insert。。。 )中使用全限定名输入费劲。。可以通过定义别名的方式来简化这个输入。
定义别名(单个定义)

  <typeAlias type="com.test.mybatis.pojo.TbItem" alias="tbItem"/>

批量定义,扫描包

<package name="com.test.mybatis.pojo"/>

生成的别名就是包下的各个类的类名(首字母大小写都可以)

4.typeHandlers

 通过typeHandlers可以完成java类型和jdbc类型的转换

<select id="findTbUserById" parameterType="long" resultType="com.test.mybatis.pojo.TbUser">

比如这里的输入参数 long 实际后面sql语句执行过程中使用的是转化过的jdbc类型,这一转化功能就由typeHandlers类型处理器来实现
默认支持很多一般情况下就够用了

5.mappers

**单条映射配置:**resource 指定单个映射文件的位置

<mappers>

	<mapper resource="sqlmap/TbUser.xml" />
    //
</mappers>

**单条映射配置:**class 指定Mapper接口

	<mapper class="com.test.mybatis.mapper.TbUserMapper" />

多条映射配置(扫描包形式)

 <package name="com.test.mybatis.mapper"/>

二、包装类型输入输出映射

1.输入映射

 用于复杂的高级查询,这时候输入简单类型、HashMap或者pojo类型都无法实现查找的要求。
例如: 想要查找3天内买过指定类型商品的5位女性客户信息

显然输入简单类型、HashMap、User类、订单类。。都不合适
那么可以将用到的查询条件进行封装:将用户类,订单类,商品类、商品类型类还有查询条数这些相关信息封装在一个Vo类中。然后将查询依据的属性属性统一起来作为搜索条件。
**也可以将User类 写一个扩展类 顾客类 封装进Vo类中。

SQL 语句中

使用这个Vo类做为输入参数,Vo类中的一级属性(比如查询数目) 可以直接通过属性名来获取, 获取属性(如User)的内部属性(如sex(性别))依照User.sex 格式来写,没啥说的废话一句。

2.输出映射

1)简单类型

 只有输出结果一行一列的情况下才会使用(谁说的?(好吧视频老师说的),看好多帖子也是这样写的,我按用户名查找用户id也可以使用简单类型啊,返回List列表也是可以的说)

2)HashMap类型

 输出的列名作为key,每行结果作为value。同样接口返回类型判断如使用selectList,将会返回一个List数组HashMap作为元素。

3) pojo类型

 pojo类型对象作为返回参数类型,有如下三种情况

1)搜索结果列和pojo对象属性一样多(每行对应一个属性)。返回类型为pojo 没有异议
2)列不够用来对应每条属性。 返回的pojo类型 不全 例如 如果select 不对 name字段进行查询
3)列没有能用来和任意一条属性对应的。(不会创建pojo对象)

上面的应该没有异议
因为看的视频学习的,没有介绍查询结果列 比pojo对象属性多的情况
我来试试

首先 :最简单的 在查询结果集中随便插入一行
select A=1, * from tb_user
 这一行 (之前用sql server写)很简单的沙雕语句,居然也会出错。
 经过一番实验搜索,看到mysql二层查询给的灵感
正确语句闪亮登场。。。

select 1 A, tb_user.* from tb_user

 因为一句sql语句高兴成这样,我也是醉了。
 好了,有了这一行sql 语句可以去实验了。是爆错(pojo吃撑),还是舍弃呢

<select id="findTbUserByName" parameterType="String"
		resultType="com.test.mybatis.pojo.TbUser">
		select 1 A, tb_user.* from tb_user where username like '%${value}%'
</select>

实验结果是舍弃,并不会报错

4)ResultMap

 因为3)中的种种问题,使用ResultMap代替ResultType
记一下思路,只学到最简单常用的
1.定义resultMap和相关类型的映射
具体定义

    <resultMap type="最终映射成的java对象" id="用作唯一标识">
            <!--id指定主键列,result 对应非主键列-->
        <id column="ResultMap列名" property="Type指定的Pojo中的对应属性名" /> 
        <result。。。。。。。>
    </reultMap>

这个是引用比较完全的配置 未测试等用再看

<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id="唯一的标识" type="映射的pojo对象">
  <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
  <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
  <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
    <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
    <result  column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
  </association>
  <!-- 集合中的property须为oftype定义的pojo对象的属性-->
  <collection property="pojo的集合属性" ofType="集合中的pojo对象">
    <id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
    <result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />  
  </collection>
</resultMap>

然后就是后面statement的resultMap=“resultMap的id”
先到这,今天进度好慢,好像出了大问题。 ——_——。。
含着泪标题写的上,晚上还得加把劲。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值