Mybatis学习总结一

Mybatis总结

主配置文件中常用的标签

properties标签

properties标签:可以在标签内部配置连接数据库的信息,也可以通过属性引用外部配置文件信息; resource属性:用于指定配置文件的位置,配置文件必须放在类路径下,url属性:按照Url的写法来写地址,使用file协议;

    <properties resource="jdbc.properties"></properties><properties>
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
    </properties>

environments标签

environments标签:配置数据源;

    <environments default="development">
        <environment id="development">
            <!--配置事务控制的方式-->
            <transactionManager type="JDBC"/>
            <!--配置数据库连接-->
            <dataSource type="POOLED">
           		<!--${jdbc.driver}:从properties文件中取值-->
                <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>
        </environment>
    </environments>

typeAlias标签

typeAlias标签:用来配置别名;
下面的例子给com.sks.domain.Order设置了别名order,那么在映射文件可以直接使用order,而不需要加上包名。

    <typeAliases>
        <typeAlias type="com.sks.domain.Order" alias="order"/>
    </typeAliases>

mappers标签

mappers标签:指定映射文件的位置,一般使用第二种,使用第一种的话,需要指定所有映射文件的位置

     <mappers>
<!--        <mapper resource="com/sks/dao/IUserDao.xml"/>-->
        <!--配置映射文件的位置-->
        <package name="com.sks.dao"/>
    </mappers>

主配置文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>


    <!--加载数据库连接配置文件-->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <!--配置事务控制方式-->
            <transactionManager type="JDBC"></transactionManager>
            <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>
        </environment>
    </environments>

	<!--指定映射文件的位置-->
    <mappers>
        <package name="com.sks.dao"/>
    </mappers>

</configuration>

映射文件

resultMap

resultMap标签:用来配置返回结果的别名;对于数据库表的列名和实体类属性名不一致时,可以通过这种来解决,另一种办法是通过在sql语句中使用as关键字取别名来解决;

    <!--配置返回结果的别名,配置后使用resultMap来代替resultType-->
    <resultMap id="userMap" type="com.sks.domain.User">
        <id property="id" column="id"/>
        <id property="username" column="username"/>
        <id property="password" column="password"/>
        <id property="birthday" column="birthday"/>
    </resultMap>

insert

insert标签:对应sql中insert;
有些时候数据库主键不支持自增或者需要获取上一次插入操作后获取到的id,可以通过selectKey获取插入数据后的id

    <insert id="insert" parameterType="user" >
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username, password, birthday) values (#{name}, #{password}, #{birthday});
    </insert>

动态Sql

if和where

where标签:等价于sql语句中的where,不同的是如果where标签中没有语句的话,写了where标签也查询的时候也不会带上;
if标签:在where标签中通过if标签来进行判断,如果某个参数有值,就使用它查询,没有就不使用参数查询;

    <select id="findById" resultMap="userMap" parameterType="user">
        select * from user
        <where>
            <if test="id != null">
                and id = #{id}
            </if>

            <if test="username != null">
                and username = #{username}
            </if>
        </where>
    </select>

传入username和id时输出的sql如下:
在这里插入图片描述

只传入username时输出的sql如下:
在这里插入图片描述
不传参数输出的sql如下:
在这里插入图片描述

foreach

foreach标签:标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符

    <select id="findByIds" parameterType="list" resultMap="userMap">
        select * from user
        <where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

执行代码输出的sql语句如下图所示:
在这里插入图片描述

include

sql标签:Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的;
include标签:引用sql标签中的sql语句;

对于select * from user这条sql语句,由于它在前面两个例子中都使用到到了,我们可以将其提取出来,需要使用时通过include标签引用即可。

    <sql id="selectFromUser">
        select * from user 
    </sql>

    <select id="findByMultiId" parameterType="arraylist" resultMap="userMap">
        <include refid="selectFromUser"></include>
        <where>
            <foreach collection="list" open="id in(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

多表操作

一对一查询

查询一个订单,与此同时查询出该订单所属的用户:

    <resultMap id="orderMap" type="com.itheima.domain.Order">
        <result column="uid" property="user.id"></result>
        <result column="username" property="user.username"></result>
        <result column="password" property="user.password"></result>
        <result column="birthday" property="user.birthday"></result>
    </resultMap>
    <select id="findAll" resultMap="orderMap">
        select * from orders o,user u where o.uid=u.id
    </select>

上面的resultMap也可以按照下面这种方式书写,其中使用association标签来关联查询出来的实体类

<resultMap id="orderMap" type="com.itheima.domain.Order">
    <result property="id" column="id"></result>
    <result property="ordertime" column="ordertime"></result>
    <result property="total" column="total"></result>
    <association property="user" javaType="com.itheima.domain.User">
        <result column="uid" property="id"></result>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="birthday" property="birthday"></result>
    </association>
</resultMap>

一对多查询

查询一个用户,与此同时查询出该用户具有的订单:

一对一查询中使用collection标签来关联查询出来的实体类

    <resultMap id="userOneOrderMap" type="com.sks.vo.UserOneOrderVo">
    	<!--对应user表中的属性-->
        <result property="id" column="id"/>
        <result property="birthday" column="birthday"/>
        <result property="password" column="password"/>
        <result property="username" column="username"/>
		
		<!--对应实体类中的List<Orders>集合-->
        <collection property="orderList" ofType="com.sks.domain.Order">
        	<!--对应orders表中的属性-->
            <result column="id" property="id"/>
            <result column="uid" property="uid"/>
            <result property="orderTime" column="ordertime"/>
            <result property="total" column="total"/>
        </collection>
    </resultMap>

   <select id="findAll" resultMap="userMap">
         select *,o.id oid from user u left join orders o on u.id=o.uid
    </select>

注解方式如下:
在这里插入图片描述

多对多查询

查询用户同时查询出该用户的所有角色:

    <resultMap id="roleMap" type="com.sks.domain.User">
        <result property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="birthday" column="birthday"/>
        <result property="password" column="password"/>
        <collection property="roles" ofType="com.sks.domain.Role">
            <result column="rid" property="id"></result>
            <result column="rolename" property="rolename"></result>
        </collection>
    </resultMap>

    <select id="findAllUserAndRoles" resultMap="roleMap">
        SELECT u.*,r.*,r.id rid FROM USER u LEFT JOIN sys_user_role sur ON u.id = sur.userid INNER JOIN sys_role r ON sur.roleid = r.id
    </select>

注解方式如下:
@many:一对多注解;
@Results:封装结果集,对应resultMap标签,id属性用于在其它方法中引用此resultMap;
@Result:设置数据库表的列名和实体类的字段的对应关系;图中的最后一个@result的意思是:把查询出来的Role类的id作为参数

参考

SSM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值