Mybatis
1.优点:
1:与JDBC相比减少了50%的代码
2:是最简单的持久化框架
3:Sql代码从程序中彻底分离
4:提供xml标签支持sql动态
5:提供映射标签支持对象与数据库的ORM字段映射
2.缺点:
1.sql语句编写工作量大
2.数据库移至性差
3.基本要素:
4.MyBatis核心对象生存周期
1:SqlSessionFactoryBuilder:
用于创建多个SqlSessionFactory实例
用过即丢生命周期只存在于创建他的方法中
2:SqlSessionFactory
作用于整个Application,生命周期与应用生命周期相同整个程序只存在一个
3:SqlSession
包含了所有的SQL执行所需的方法,对应一次数据库会话结束时必须关闭,属于线程级别不能共享
在SqlSession中可以执行多次SQL语句,但一但关闭了SqlSession就要从新创建
5.SqlSession两种用法:
1:通过SqlSession实例直接运行映射的SQL语句
2:基于Mapper借口方式操作数据
6.增删改查标签的属性:
1:传入参数:parameterType="数据类型";
2:指定返回类型:
(1):resultType="数据类型地址";
(2):resultMap="result的id";
7.得参数的两种方法#{ } ${ }
简单类型(int,String等):#{这随便写} ${value} (一个参数的情况下多个参数写属性名)
复杂类型(类,数组等):#{属性名} ${属性名}
#{ }与${ }的区别:
#{ }得参数的话会带有属性的符号 如String就会带双引号
${ }得参数的时候不会带属性符号
8.Mybatis标签
1.类型别名:
<configuration> <typeAliases> <typeAliase alias="别名" type="类型地址"/> </typeAliases> <configuration>
2.给一个包起别名(包中的类的别名就是他的类名)
<tyoeAliases> <package name="包名"/> </tyoeAliases>
3.resultMap的属性与标签:
<resultMap> <id column="数据库列名” prooerty="类的属性名" jdbctype="数据库中的类型"> </resultMap>
1:多对一的标签(一个类中有另一个类作为属性):
<association property="作为属性的类名" JavaType="类型的地址">
<id column="数据库列名” prooerty="类的属性名" jdbctype="数据库中的类型">
<result column="数据库列名” prooerty="类的属性名" jdbctype="数据库中的类型">
<result>
</association>
2:一对多标签(一个类中有另一个类的集合)
<collection property="类的集合名" oftype="类的地址"> <id column="数据库列名” prooerty="类的属性名" jdbctype="数据库中的类型"> </collection>
所有的集合都用oftype指定
4.SQL片段:
sql片段可以重复利用多次调用
<select> <include refid="sql片段id"> </select> <sql id=“名”> sql语句 </sql>
5.动态SQL语句
1:where(where会自动识别是否是第一个where如果是第一个where会自动去掉and进行拼接)
<select id="selectByParams" parameterType="map" resultType="user">
select * from user
<where>
<if test="id != null ">
id=#{id}
</if>
<if test="name != null and name.length()>0" >
and name=#{name}
</if>
</where>
</select>
2:choose(和switch很像)
<choose>
<when test="条件">-------这个和case一样
SQL语句
</when>
<otherwise>-----这个和default一样
SQL语句
</otherwise>
</choose>
3:foreach
<foreach collection="集合名" item="起个名" index="index" open="开始循环的拼接" close="结束循环的拼接" separator=",">
#{起的名}
</foreach>
4:遍历拼接:trim
<trim prefix="前缀" suffix="后缀" suffixoverrides="在每句的末尾追加内容" prefixoverrides="在每句前面追加的内容"> 内容 </trim>
5:set
<update>
update user
<set>
<if test="name != null and name.length()>0">
name = #{name},
</if>
<if test="gender != null and gender.length()>0">
gender = #{gender},
</if>
</set>
where id = #{id}
</update>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构