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基本操作
<!-- ***封装多行多列*** -->
<!-- 封装成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>
<!-- ***封装单行多列** -->
<!-- 返回一个值可以不用封装直接返回 -->
<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>
<!-- ***参数传入*** -->
<!-- 如果参数是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>
<!--
#{} 与 ${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>
方法一
<!-- ***数据保存时返回生成的主键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>
<!--
<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相对应