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作为参数