一口折

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

一、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语句中传参

传参的方式

  1. @param注解方式 (掌握)

  2. java对象的方式 (掌握)

  3. 按位置传参,位置坐标从0开始(了解)

  4. Map集合的方式传参(了解)

 

$与#的区别

#: 占位符,底层使用的是PrepareStatement对象执行sql语句

$: 字符串替换,告诉mybatis使用$包含的字符串替换所在位置。底层是使用Statement对象把sql语句和${}中的内容连接起来

select * from t_student where name=${myname};

//此时从测试类中传一个“张三”进来

"select * from t_student where name=" + "张三";

 

 

 

六、对输出结果进行封装

 

resultType结果类型

<select id="..." resultType="...">
    ......
</select>
  1. 封装为java对象:resultType=java类的全限定名称(一般为自定义的javabean规范的实体类)

  2. 封装为简单类型:返回值只有一个时,resultType=类型的全限定名称,比如:resultType=java.lang.Integer

  3. 分装为Map集合:resultType=java.util.HashMap

    //使用Map集合时,最多只能返回一行记录,多出就报错,但记录依然会显示在控制台上

 

resultMap结果映射

//结果映射:即指定(自定义)java对象的属性与列名的关系;若是列名与属性名不一样,就只能用resultMap

 

当列名与属性名不同

  1. 使用resultMap结果映射解决

  2. 使用别名

//resultType的默认规则:同名的列值赋给同名的java属性(不然就报错);即在sql语句中给列名改名,和java属性名一样

select id as javaid,name as javaname......from t_student;

 

七、自定义别名

  1. 第一种方式

<typeAliases>
   <typeAlias type="com.dh.domain.Student" alias="stu"/>
</typeAliases>

//type:自定义类型的全限定名称; alias:自定义的别名

 

  1. 第二种方式

<typeAliases>
   <package name="com.dh.domain"/>
</typeAliases>

//package:包名,在这个包中的所有类。类名就是别名(类名不区分大小写)

 

 

八、动态sql

  1. 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后面没有东西,造成语法错误

 

  1. 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等

 

  1. 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:数组或集合成员之间的分隔符

 

  1. 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文件的方式

  1. 一个sql映射文件对应一个<mapper>标签

  2. 使用包名

<mappers>
   <package name="com.dh.dao"/>
</mappers>

//name:sql映射文件所在的包名,这个包中的所有xml文件一次全部都加载个mybatis

//使用package要求

a. mapper的文件名必须和接口的名称一样,大小写也要保持一致

b. mapper文件和dao接口必须在同一目录下

 

 

 

十、分页插件(PageHelper)

//其底层就是采用limit关键字

 

  1. 依赖

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper</artifactId>
   <version>5.1.10</version>
</dependency>

 

  1. 在mybatis主配置文件中加入插件,在<environments>标签之前加

<plugins>
   <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

 

  1. 在映射文件中

<select id="SelectAllStudent" resultType="com.dh.domain.Student">
  select id,name,age,sex from t_student
</select>

//注意:在sql语句后不能加 “;”,因为该插件是在该sql语句的末尾加limit,加上分号就会有语法错误

 

  1. 在测试程序中

PageHelper.startPage(1,3);

List<Student> list2=dao.SelectAllStudent();
for (Student stu: list2){
   System.out.println(stu);
}

//第一个参数代表第几页,从1开始;第二个参数代表一页有多少个数据

 

posted on   一口折  阅读(143)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
 
点击右上角即可分享
微信分享提示