一、opensession方法
openSession(): 无参,获取非自动提交事务的sqlSession对象
openSession(true): 获取自动提交事务的sqlSession对象
openSession(false): 获取非自动提交事务的sqlSession对象
二、线程安全
//SqlSession对象是非线程安全的,需要在方法内部使用,作为局部变量。执行完Sql语句后,必须关闭它sqlSession.close(),这样才能保证其是线程安全的。
三、paramterType属性
<select id="selectStudentById" resultType="com.dh.domain.Student" parameterType="java.lang.Integer">
select id,name,age,sex from t_student where id=#{a};
</select>
//paramterType是dao接口中方法参数的数据类型
//paramterType的值是java数据类型的全限定名称或者是mybatis自定义的别名,如:java.lang.Integer的别名是int
//paramterType可以不写,因为mybatis会通过反射机制能够自动发现接口中的参数类型
四、getMapper()方法
//动态代理的方式:我们不用去实现这个接口,就可获得这个接口的引用,再用这个引用直接调用这个接口中的方法。
StudentDao dao=sqlSession.getMapper(StudentDao.class);
//StudentDao.class:interface com.dh.dao.StudentDao
五、向sql语句中传参
传参的方式
-
@param注解方式 (掌握)
-
java对象的方式 (掌握)
-
按位置传参,位置坐标从0开始(了解)
-
Map集合的方式传参(了解)
$与#的区别
#: 占位符,底层使用的是PrepareStatement对象执行sql语句
$: 字符串替换,告诉mybatis使用$包含的字符串替换所在位置。底层是使用Statement对象把sql语句和${}中的内容连接起来
select * from t_student where name=${myname};
//此时从测试类中传一个“张三”进来
"select * from t_student where name=" + "张三";
六、对输出结果进行封装
resultType结果类型
<select id="..." resultType="...">
......
</select>
-
封装为java对象:resultType=java类的全限定名称(一般为自定义的javabean规范的实体类)
-
封装为简单类型:返回值只有一个时,resultType=类型的全限定名称,比如:resultType=java.lang.Integer
-
分装为Map集合:resultType=java.util.HashMap
//使用Map集合时,最多只能返回一行记录,多出就报错,但记录依然会显示在控制台上
resultMap结果映射
//结果映射:即指定(自定义)java对象的属性与列名的关系;若是列名与属性名不一样,就只能用resultMap
当列名与属性名不同
-
使用resultMap结果映射解决
-
使用别名
//resultType的默认规则:同名的列值赋给同名的java属性(不然就报错);即在sql语句中给列名改名,和java属性名一样
select id as javaid,name as javaname......from t_student;
七、自定义别名
-
第一种方式
<typeAliases>
<typeAlias type="com.dh.domain.Student" alias="stu"/>
</typeAliases>
//type:自定义类型的全限定名称; alias:自定义的别名
-
第二种方式
<typeAliases>
<package name="com.dh.domain"/>
</typeAliases>
//package:包名,在这个包中的所有类。类名就是别名(类名不区分大小写)
八、动态sql
-
if标签
<select id="SelectLikeOne" resultType="com.dh.domain.Student">
select id,name,age,sex from t_student
where
<if test="判断语句">
name=#{name};
</if>
</select>
//判断语句的内容:使用参数java对象的属性值作为判断条件,语法:属性值=xxx值
//如果判断语句为true,则将if标签体中的sql语句片段拼接到其所在的sql语句中。可以有多个<if/>标签,在同一个sql语句中。但当所有if标签的返回值都是false时 ,报错,因为where后面没有东西,造成语法错误
-
where标签
<select id="SelectLikeOne" resultType="com.dh.domain.Student">
select id,name,age,sex from t_student
<where>
<if test="">
name=#{name}
</if>
<if test="">
or age=#{age}
</if>
</where>
</select>
//where标签中包含多个if标签,当所有if标签中至少有一个成立时,自动添加where关键字,并去掉多余的and,or等
-
foreach标签
//循环java中的数组,list集合。主要用于sql中in语句
<select id="SelectLikeOne" resultType="com.dh.domain.Student">
select id,name,age,sex from t_student where id in
<foreach collection="list" item="a" open="(" close=")" separator=",">
#{a}
</foreach>
</select>
//collection:表示接口中的方法参数类型,若是数组,这里要写array;list集合就写list
//item:自定义的,表示数组或集合中的成员(单个元素)
//open,close:循环开始或结束时的字符
//separator:数组或集合成员之间的分隔符
-
sql代码片段
//用标签封装一部分sql代码片段,以便其他标签复用
<sql id="自定义名称,唯一性">
代码片段 (假如这里是:id,name,age,sex)
</sql>
使用:select <include refid="封装的代码片段的id值"> from t_student
九、mybatis主配置文件
配置properties文件
//在resources目录下创建一个xxx.properties文件
//大多数情况下会有多个数据源,所以key的值一般为多级目录,便于区分不同的数据源
//在mybatis主配置文件中,使用<properties>标签指定文件的位置。在需要使用的地方,使用${key}
指定多个mapper文件的方式
-
一个sql映射文件对应一个<mapper>标签
-
使用包名
<mappers>
<package name="com.dh.dao"/>
</mappers>
//name:sql映射文件所在的包名,这个包中的所有xml文件一次全部都加载个mybatis
//使用package要求
a. mapper的文件名必须和接口的名称一样,大小写也要保持一致
b. mapper文件和dao接口必须在同一目录下
十、分页插件(PageHelper)
//其底层就是采用limit关键字
-
依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
-
在mybatis主配置文件中加入插件,在<environments>标签之前加
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
-
在映射文件中
<select id="SelectAllStudent" resultType="com.dh.domain.Student">
select id,name,age,sex from t_student
</select>
//注意:在sql语句后不能加 “;”,因为该插件是在该sql语句的末尾加limit,加上分号就会有语法错误
-
在测试程序中
PageHelper.startPage(1,3);
List<Student> list2=dao.SelectAllStudent();
for (Student stu: list2){
System.out.println(stu);
}
//第一个参数代表第几页,从1开始;第二个参数代表一页有多少个数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)