Mybatis框架(一)-- 快速入门
Mybatis框架(二)-- 原理解析
Mybatis框架(三)-- 详细配置参数
Mybatis框架(四)-- 其他配置
Mybatis框架(五)-- 多表查询
Mybatis框架(六)-- 延迟加载
Mybatis框架(七)-- 缓存
Mybatis框架(八)-- 注解开发
文章目录
IUser增删改查举例
首先给出一个简单例子,在后面给出配置的解释
IUserDao接口
public interface IUserDao {
//插入数据,并将自增长id返回到User对象的ID属性
void saveUser(User user);
//根据ID更新User
void updateUser(User user);
//根据ID删除User
void deleteUser(int UserID);
//根据ID查找并返回指定User
User findByID(int UserID);
//模糊查询--like
List<User> findByName(String name);
//聚合函数
int findTotal();
}
Sql语句基础可参考–MySql语句-DQL-基本查询
IUserDao.xml配置文件
<mapper namespace="com.yy.dao.IUserDao">
<insert id="saveUser" parameterType="com.yy.domain.User">
<!--将自增长id返回到User对象的ID属性-->
<selectKey resultType="Integer" keyProperty="id" keyColumn="id" order="AFTER">select last_insert_id()</selectKey>
insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})
</insert>
<update id="updateUser" parameterType="com.yy.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<delete id="deleteUser" parameterType="java.lang.Integer">
/*只有一个参数Integer #{任意占位符即可}*/
delete from user where id=#{onePara}
</delete>
<select id="findByID" parameterType="Integer" resultType="com.yy.domain.User">
select * from user where id=#{uid}
</select>
<select id="findByName" parameterType="String" resultType="com.yy.domain.User">
select * from user where username like #{NAME}
</select>
<select id="findTotal" resultType="Integer">
select count(*) from user
</select>
</mapper>
Mybatis参数详解
Mapper配置参数
Mapper是一个接口的配置文件
Mapper的namespace对应全限定类名(接口)
增删改查分别对应四个标签<insert> <delete> <update> <select>
共有属性id 是接口中配置的方法名
还有输入参数parameterType 和 返回值resultType
parameterType 配置参数
接口内方法的传入参数–parameterType
- 基本类型和 String 我们可以直接写类型名称 ,也可以使用包名 . 类名的 方式 ,例如 :java.lang.String。
如上例:
<delete id="deleteUser" parameterType="java.lang.Integer">
亦可
<delete id="deleteUser" parameterType="Integer">
<delete id="deleteUser" parameterType="Int">
意思为:配置com.yy.dao.IUserDao的deleteUser方法的传入参数为Integer
- 传递 pojo 包装对象,使用#{属性}传递。
如上例:
<update id="updateUser" parameterType="com.yy.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
意思为:配置 com.yy.dao.IUserDao 的 updateUser 方法的传入参数为 com.yy.domain.User 对象,并可以在Sql语句中引用该对象的属性:通过 #{username} 就代表com.yy.domain.User对象的username属性
当parameterType="Integer"这种只有一个参数的情况时,#{任意占位符} 都代表该参数。
比如:
<delete id="deleteUser" parameterType="java.lang.Integer">
/*只有一个参数Integer #{任意占位符即可}*/
delete from user where id=#{onePara}
</delete>
当传入参数中包含其他的引用类型时,用.分割
username=#{para.user.username}
resultType 配置结果类型
支持基本类型和实体类类型(可以是一个,也可以是一个List),它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
- 可以通过别名的方式为不统一的实体类中属性名称和查询语句列名建立映射。
Select 列名 as 别名 from table;
resultMap 配置结果映射
- 也可以通过resultMap(Mapper的子元素) 配置 列名和属性名的映射关系
<resultMap id="userMap" type="com.yy.domain.User">
主键字段
<id property="属性名" column="主键字段"></id>
非主键字段
<reuslt property="属性名" column="列字段"></result>
<reuslt property="属性名" column="列字段"></result>
<reuslt property="属性名" column="列字段"></result>
</resultMap>
并在方法配置中 将resultType 替换为 resultMap = userMap(resultMap的id)
Configuration配置参数(SqlMapConfig.xml)
typeAliases配置别名
<!--使用typeAliases配置别名,它只能配置domain中类的别名 -->
<typeAliases>
<!--typeAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就再区分大小写-->
<typeAlias type="com.yy.domain.User" alias="user"></typeAlias>
<!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
<package name="com.yy.domain"></package>
</typeAliases>
package指定dao接口的包
在Mappers中指定dao接口的包,并将每个接口的对应配置文件置于resources的同级目录,命名为接口名.xml,便可自动建立接口和配置文件的映射。
<mappers>
<!--<mapper class="com.yy.dao.IUserDao"></mapper>-->
<package name="com.yy.dao"/>
</mappers>