Mybatis_day02

1.MyBatis主配置文件编写

<!-- mybatis的主配置文件 -->
<configuration>

    <!--  读取resoures目录中的properties文件  -->
    <properties resource="jdbc.config.properties"></properties>

    <!--  设置延迟开关/默认为false  -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

    <!--  批量取别名 当返回javaBean或参数传入javaBean时不需要再写包名  -->
    <typeAliases>
        <package name="cn.itcast.domain"/>
    </typeAliases>


    <environments default="ds">
        <environment id="ds">
            <!--    配置事务提交的类型        -->
            <transactionManager type="JDBC"></transactionManager>
            <!--    配置数据库连接池/pooled是mabatis自带的连接池    -->
            <dataSource type="POOLED">
                <!--    通过${}引入键值对            -->
                <property name="driver" value="${driver}"/>
                <property name="url"    value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <!--   批量加载xml文件    -->
        <package name="cn.itcast.dao"/>
    </mappers>

</configuration>

2.MyBatis基本操作

  1. 封装行选
<!--   ***封装多行多列***    -->

   <!--   封装成List<Book>  -->
   <select id="find2" resultType="book">
       select bookname,price,price*3 as prices from book
   </select>

   <!--  封装成List<Map>  -->
   <select id="find3" resultType="map">
       select bookname,price,price*3 as prices from book
   </select>

   <!--  封装成Object[]  【此种方式只能封装一个字段不推荐使用】 -->
   <select id="find4" resultType="object">
       select bookname,price,price*3 as prices from book
   </select>
  1. 封装单行数据
<!--   ***封装单行多列**    -->

   <!--  返回一个值可以不用封装直接返回  -->
   <select id="find5" resultType="int">
       select count(*)  from book
   </select>

   <!--    封装成javaBean时如果有新生成的字段需要借助xxxVO来实现  -->
   <select id="find" resultType="book">
        select count(*) as total,ceil(count(*)/3) as pages from book
    </select>

   <!--    封装成map集合时  别名即是键名无需生成xxxVO   -->
   <select id="findByBook" resultType="map">
        select count(*) as a,ceil(count(*)/3) as b,bookname from book
    </select>
  1. 参数传入
<!-- ***参数传入***   -->

   <!-- 如果参数是list集合  固定写法list[]  -->
   <select id="findByCase2" parameterType="list" resultType="book">
       select * from book where bookname=#{list[0]} or
        bookname=#{list[1]}  or bookname=#{list[2]}
   </select>


   <!-- 如果参数是数组  固定写法array[]  -->
   <select id="findByCase3" parameterType="String" resultType="book">
       select * from book where bookname=#{array[0]} or
        bookname=#{array[1]}  or bookname=#{array[2]}
   </select>


   <!-- 如果参数是map  #{}中填写map的键名  -->
   <select id="findByCase4" parameterType="map" resultType="book">
       select * from book where company=#{company} and price>#{p}
   </select>
  1. ${}与#{}区别
<!--
   #{} 与 ${value} 区别
  #{} 1.预处理执行效率高      占位符赋值      不会引起sql注入
  ${} 2.执行效率低            字符串的拼接    会引起sql注入
-->
<select id="findByCompany" parameterType="string" resultType="book">
       select  * from book where company like #{company}
</select>

<select id="findByCompany" parameterType="string" resultType="book">
       select  * from book where company like '%${value}%'
</select>
  1. 返回主键列

方法一

<!-- ***数据保存时返回生成的主键id***   -->
<insert id="save" parameterType="cn.itcast.domain.Book">
   <!--keyProperty 将返回的主键列保存到javaBean中的哪个属性中-->
   <!--resultType  主键id以怎样的数据类型返回         -->
   <!--order       是在insert语句之前执行还是之后执行 -->
   <selectKey keyProperty="id" resultType="int" order="AFTER">
       select last_insert_id()
   </selectKey>
   insert into book values(null,#{bookName},#{author},#{company},
   #{price},#{kind_id})
</insert>

方法二

<!--
   keyProperty      将返回的主键列保存到javaBean中的哪个属性中
   useGeneratedKeys 设置为true时自动返回主键列 默认为false
-->
<insert id="save" parameterType="book" keyProperty="price" useGeneratedKeys="true">
    insert into book values(null,#{bookName},#{author},#{company},#{price},#{kind_id})
</insert>
  1. 标签的使用
<!--
   <if>标签使用
   细节1:parameterType为javaBean时 <if>标签中的test属性填入javaBean中的【属性名】
   细节2:parameterType为List时     <if>标签中的test属性填入list[0]...
   细节3:parameterType为map时      <if>标签中的test属性填入键名
   细节4:parameterType为普通类型时  <if>标签中的test属性填入_parameter

   <where>标签 相当于 where 1=1
-->

<select id="findByCase" parameterType="book" resultType="book">
   select * from book
      <where>
       <!-- parameterType为原始类型时  固定写为_parameter -->
       <if test="bookName!=null and bookName!=''">
           and bookname=#{bookName}
       </if>
   </where>
</select>



<!--
   <foreach> 标签
   细节1: collection 指定传递过来的集合  List或数组     例:List写成list    数组写成array
   细节2: open       指定               条件至括号处    例:id in(
   细节3: item       指定               条件别名
   细节4: separator  指定               拼接符号
   细节5: close      指定               反括号
-->
<select id="findByCase1" parameterType="list" resultType="Book">
   <!-- select * from book where id in(1,3,5)  -->
   select * from book
   <where>
       <foreach collection="list" open="id in(" item="id" separator="," close=")">
           #{id}
       </foreach>
   </where>
</select>

3.一对一数据封装

第1步存在于数据库中的kind表和book表 首先映射成实体类!在这里插入图片描述在这里插入图片描述
第2步 在book实体中要多生成一个对象kind用于数据库kind表中的数据封装
在这里插入图片描述
方法1
在这里插入图片描述
此方法只需要手动封装kind表的数据,book表的数据自动完成封装可不作处理
解释:标签中
id属性:唯一标识可自定义
type属性:返回类型
标签中
columnn属性:sql语句中的字段名
property属性:需要封装到实体类中的属性名

方法2
在这里插入图片描述
此方法需要手动封装kind表的数据和book表的数据
解释:标签中
property属性: 表示标签中所包夹的字段封装到哪个实体中,如
想把kname封装到kind这个对象中,则填写property=“kind”
和下图的实体属性要对应上
在这里插入图片描述
javaType属性:表示property属性中的对象类型,详见下图
在这里插入图片描述

4.一对多数据封装

在这里插入图片描述在这里插入图片描述
在kind实体中要多生成一个集合用于封装book表的数据

方法1
在这里插入图片描述
此方法需要手动封装kind表的数据和book表的数据
解释:标签中
property属性:表示< collection >标签中所包夹的字段封装到哪个实体中,如
想把bookname封装到book这个集合中,则填写property=“book”
和下图的实体属性要对应上
在这里插入图片描述
ofType属性:表示book集合中的泛型

方法2
在这里插入图片描述
此方法自动封装kind表的数据和book表的数据且该方法会自动延迟加载如想立即加载则在的标签中加属性fetctType=’eager’即可
解释:标签中
select属性:标签的id属性,详见下图在这里插入图片描述
column属性:于标签中的parameterType相对应在这里插入图片描述

5.一对多方法映射2原理解析在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值