MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github;
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射;
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录;
好处:
1.简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2.灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
3.解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4.提供映射标签,支持对象与数据库的orm字段关系映射
5.提供对象关系映射标签,支持对象关系组建维护
6.提供xml标签,支持编写动态sql.
mybatis底层就是封装了JDBC!
原生的JDBC操作
MyBatis常用配置标签:
1.properties标签:该标签可以加载外部的properties文件<properties resource="jdbc.properties"></properties>
2.typeAliases标签: 设置类型别名<typeAlias type="com.demo.pojo.user" alias="user"></typeAlias>
3.mappers标签: 加载映射配置<mapper sesource="com/demo/mapper/userMapper.xml"></mapper>
Mybatis的代理开发
只需要定义好接口,在mapper.xml文件中映射,需要保证
1.mapper标签内的映射地址和接口是同一个;
2.方法名和sql标签的id一样,
3.参数类型一样,
4.返回值是一样,mybatis会自动将数据库返回的结果封装成java对象返回;
动态sql
在mybatis中有动态sql的一个好处,可以根据我们的业务需求来编写动态sql;<if>
条件判断
举个例子: 条件搜索 用户名和id 来查询用户信息 但是可能只传了用户名,id只是选填没有,就是在这种不确定的情况下怎么编写sql语句;
<select id="findByCondition" parameterType="user" resultType="user">
select * from User
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
如果id不为0就加上and的条件,如果id为0就不需要加上这个条件;<foreach>
循环执行sql的拼接操作
举个例子: 查询多个id的用户信息集合, 将id封装成一个数组,ids 作为参数传入,用<foreach>
标签遍历,
<select id="findByIds" parameterType="list" resultType="user">
select * from User
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
foreach标签的属性含义如下:<foreach>
标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的
<!--抽取sql片段简化编写-->
<sql id="selectUser" select * from User</sql>
<select id="findById" parameterType="int" resultType="user">
<include refid="selectUser"></include> where id=#{id}</select>
<select id="findByIds" parameterType="list" resultType="user"> <include refid="selectUser"></include>
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
:查询
:插入
:修改
:删除
:where条件
:if判断
:循环
:sql片段抽取
MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
开发步骤:
1.导入通用PageHelper的坐标
2.在mybatis核心配置文件中配置PageHelper插件
3.测试分页数据获取
MyBatis多表配置方式:
一对一配置:使用做配置
一对多配置:使用+做配置
多对多配置:使用+做配置
MyBatis的常用注解 注解开发
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
使用注解开发需要扫描注解的Mapper接口
<mappers>
<!--扫描使用注解的类-->
<mapper class="com.itheima.mapper.UserMapper">
<!--或者扫描使用注解的类所在的包-->
<!--<package name="com.itheima.mapper"></package>-->
</mapper>
</mappers>
实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置
在核心配置文件标签内的<mapper class的属性>
public interface UserMapper {
@Select("select * from user")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "birthday",column = "birthday"),
@Result(property = "roleList",column = "id",
javaType = List.class,
many = @Many(select = "com.itheima.mapper.RoleMapper.findByUid"))
})
List<User> findAllUserAndRole();}
public interface RoleMapper {
@Select("select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=#{uid}")
List<Role> findByUid(int uid);
}
来源:CSDN
作者:素颜淡笑
链接:https://blog.csdn.net/qq_45542344/article/details/104609804