第1章至第三章
第一章
Spring Boot框架本身并不提供Spring框架的核心特性集扩展功能,初衷是为了简化Spring的配置(分布式系统的开发),提高开发效率,只是用于扩展功能,
Spring Cloud是一系列框架的有序集合,它将Spring Boot框架进行了在封装,屏蔽掉了复杂的配置和实现原理,简单易懂,易部署和易维护等特点
开闭原则(代码扩展):核心思想:软件实体应该对扩展开放,对修改关闭,不修改已有代码的情况下,通过增加新的代码来实现功能的扩展
连接数据库的JDBC的缺点:
1、数据库连接创建、释放频繁造成系统资源浪费;
2、SQL语句存在大量的硬编码,不方便维护,违反了开闭原则
3、sql参数和要传入的参数需要手动指定,不方便
4、JDBC对结果集解析存在硬编码(查询列名)
5、JDBC的API是非常繁琐的问题
解决JDBC的缺点:
1、再SqlMapConfig.xml中配置数据链接池(管理和复用连接对象的技术,可以设置最大连接池和最小连接池,实现资源复用,连接池可以再连接失效时自动重新创建新的连接),
2、MyBatis将SQL语句配置在它的的映射文件(定义一种数据结构或资源之间的映射关系,进行数据访问、转换或配置管理)中,实现了Java代码的分离
3、MyBatis自动将Java对象属性映射到SQL语句,通过Statement中的parameterType定义 输入参数的类型
4、MyBatis自动将SQL执行结果映射到Java对象,利用parameterType支持类型的自动判断
5、MyBatis的API非常精简,就只有几行代码
MyBatis(P3页)
1、MyBatis是一个支持SQL查询、存储过程以及高级映射的持久层框架,消除了JDBC的缺点,可以使用XML或注解进行配置和原始映射,使JAVA开发人员可以使用面向对象的编程思想来操作数据库
2、MyBatis框架是一个ORM(Object/Relation Mapping,对象关系映射)框架。
3、低耦合:sql语句与代码分离、结果集解析与代码分离
ORM:
解决面向对象与关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。(解决了JDBC第三点的缺点)
MyBatis环境搭建步骤:(B站)
1、创建工程
2、引入相关依赖
**2、pom.xml:(引入相关依赖)** **项目的pom.xm**l文件中导入MySQL驱动包、Junit测试包、MyBatis的核心包等相关依赖,dependencies:引入相关的依赖(比如数据库的依赖)
3、数据库准备
创建数据库
4、编写数据库连接信息配置文件
创建数据库连接信息配置文件:在Maven项目的src/main/resources目录下创建 数据库连接 的配置文件,文件名自行命名,在命名好的文件中配置数据库连接的参数
5、编写核心配置文件和映射文件
创建MyBatis的核心配置文件:创建数据库连接信息配置文件:在Maven项目的src/main/resources目录下创建 MyBatis 的核心配置文件,该文件主要用于项目的环境配置,例如数据库连接相关配置等。
MyBatis创建步骤:(学习通)
1、数据准备(导入sql数据)
2、创建POJO(普通的旧Java对象)实体类,Alt+insert:生成toString的方法
实体类就是表对应的值对象,通常可以按照以下规范去编写:
1、类名跟表名通常一致
2、实体类中的属性名字跟表字段一致
3、实体类中的属性类型跟表字段类型一致
3、编写持久层Mapper接口和实现类
4、创建映射文件
5、修改核心配置文件
6、编写测试类
MyBatis工作原理图
//1、获取核心配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //2、创建sqlSessionFactory工厂对象(包含了执行SQL语句的所有方法) SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(is); //3、创建sqlSession对象 SqlSession sqlSession = ssf.openSession(); //4、执行sql语句,sql语句的唯一标识:namespace.statementId User user=sqlSession.selectOne("con.itheima.pojo.User.findById",1); System.out.println(user); //5、释放资源 sqlSession.close()
1、getResourceAsStream(得到资源作为流):Java中的一个方法,加载资源文件(配置文件、图片、模板文件等)
2、sqlSessionFactory:是MyBatis中的核心接口,用于创建SqlSession。管理SqlSession的生命周期和配置信息。
Mybits三个核心对象:
1.1、sqlSessionFactoryBuilder:创建会话工厂 P12页
P12页
2.1:sqlSessionFactory对象是线程安全的,一旦被创建,在整个应用程序执行期间都会存在,会存在,避免资源耗尽,一个数据库只创建一个sqlSessionFactory,建议使用单例模式 P11页
单例模式:是软件设计模式,核心思想是确保一个类只有一个实例,提供一个全局访问点来获取这个实例。
sqlSession:
1、是应用程序与持久层之间执行交互的一个单线程对象,主要作用是执行持久化操作,类似于JDBC中的Connection
2、sqlSession:是MyBatis中的核心接口,用于执行数据库操作(增删改查)、管理事务(Spring那里操作)及获取Mapper接口的实例。MyBatis与数据库交互的桥梁,提供几乎所有数据库操作功能
3、每一个线程都应该有一个自己的SqlSession对象(每查询一个sql就有一个单独的SqlSession),该对象不能共享,SqlSession对象是线程不安全的,建议使用单例模式
void() commit():提交事务
void() rollback():回滚事务
void() close():关闭事务
以上三个与事务相关,因此使用完后要记得释放(关闭)
Idea编程插件:提供代码自动完成、自然语言生成代码等功能
1、通义灵码:免费使用,阿里云推出,
2、星火飞码:登录后即可使用
3、Mybatis插件:MybatisX插件的主要功能不包括自动部署到服务器
4、下载maven Helper插件:可以帮助maven代码的补充
Maven:一个项目管理工具,核心功能是项目构建、依赖管理和生命周期管理
1、它通过一个名为POM(Project Object Model)的文件,即pom.xml
2、在是settings.xml中设置MAVEN远程仓库的地址
Mapper:
1、SQL映射:定义SQL语句与Java方法之间的映射关系
2、简化数据操作:
MyBatis核心配置文件中的主要元素:P15页
configuration(配置):元素是整个XML配置文件的跟元素,相当于MyBatis各元素的管理员,它的核心配置也是通过这些子元素完成的,
注意:configuration的子元素必须按照上图由上到下的顺序进行配置,否则MyBatis在解析XML配置文件的时候会报错
properties:加载外部properties配置文件,(加载sql查询语句)
settings:改变MyBatis的一些默认行为,使用settings可以开启缓存和开启延迟加载
typeAliases:别名运算,对于MyBatis查询结果集时所封装的实体做一个运算
typeHandlers:用于处理java类型与数据库JDBC类型之间转换的机制,执行SQL语句时起到桥梁作用
objectFactory:工程对象
plugins:插件
environment:是environments的子环境,每套环境都支持事务的配置和数据源的配置
environments:配置数据库数据元数据的内容,开始数据的配置,MyBatis支持多环境配置——>environment:子元素(配置单个数据库环境) ——>子元素:1、transactionManager():可以配置两种类型的事务管理器,分别是JDBC和MANAGED
JDBC:此配置直接使用JDBC的提交和回滚设置
MANAGED:不提供的事务的连接。而是容器来管理
2、dataSource(数据源)
P19页
后期开发:Spring+MyBatis开发时,事务不需要再MyBatis中配置事务,因为Spring自带的管理器来实现事务管理,对于数据源提供了UNPOOLED、POOLED和JNDI三种数据源类型
UNPOOLED:无连接池类型,程序在每次被请求时会打开和关闭数据库连接,适用于对性能要求不高的简单应用程序,它还配置了5种属性(Driver,url, username,password,defaultTransactionLevel:默认的连接事务隔离级别)【就是初学时简单的连接数据库的配置】
POOLED:数据源为连接池类型,(书上教学使用的是POOLED)使用”池“的概念,一开始创建多个连接对象并存放起来,用则取,不用则放回去,不用进行销毁,性能比UNPOOPLED的高
JNDI:表示数据源可以在EJB或应用服务器等容器中使用(EJB:构建企业级分布式应用程序的组件模型和规范,逐渐被Spring等框架替代),提供了initial_context(在InitialContext.lookup中寻找上下文)和data_source(引用数据源对象位置的上下文路径,若提供initial_context,则在里面查找,没提供则在InitialContext中查找)两种属性,
mapper:P20页
mappers:管理的MyBatis映射文件,不正确会查询不到sql语句
mappers元素引入映射文件的4种方法:
第一种:使用相对路径引入,配置xxxMapper.xml文件的位置 <mapper resource="mapper/UserMapper.xml"/>
第二种:使用本地文件路径引入,绝对路径,不采用 <mapper url="file:///D:……"/>
第三种:使用接口类引入,就是接口的全路径(同包同名) <mapper class="com.esaybuy.mapper.UserMapper"> 第三种mapper配置的目的:将mapper.xml映射文件交给mybatis mapper映射文件的路径=位置+映射文件名 2中规范: 1、映射文件的位置必须放在接口的同包目录下 2、映射文件名必须和接口同名 配置文件中创建等级目录需要以com/esaybuy/mapper的以反斜杠形式,java中创建则可以使用com.esaybuy.mapper点的形式
以上图片,id里面的值要与接口名一致,当是接口类引入时:映射文件的namespace必须是接口的全路径(同包同名),<select id="接口名"></select>
第4种:使用包扫描名引入(适用于数据多的情况下) <mappers> <package name="com.esaybuy.mapper"/> </mappers>
Properties:属性 P15页
1步骤:properties是一个配置属性的元素,元素的作用是读取外部文件的配置信息 ,图片代码是使用(键=值)形式
2步骤:若想获取数据库连接信息,可以在MyBatis的核心配置文件mybatis-config.xml中用properties元素引入db.properties(实习动态参数配置)文件
3步骤:引入db.properties文件后,若希望动态获取db.properties文件中的数据库连接信息,可以使用property元素配置(图片当中的值是property中的键)
完成以上配置,<dataSource>元素中的连接数据库的四个属性(driver、url、username、password)值将会由db.properties文件中对应的值来动态替换。
settings(设置):P16页
1、定义:使用setting可以更改Mybatis的一些默认设置的更改,开启缓存和开启延迟加载
cacheEnabled:配置是否开启缓存,默认是True lazyLoadingEnabled:延迟加载的全局开关(懒加载) aggressiveLazyLoading:关联对象属性的延迟加载开关 multipleResultSetsEnabled:是否允许单一语句返回多结果集(需要兼容驱动) useColumnLabel:使用列标签代替列名 useGeneratedKeys:允许JDBC支持自动生成主键,需要驱动兼容 autoMappingBehavior:指定MyBatis应如何自动映射列到字段或属性 defaultExecutorType:配置默认的执行器 defaultStatementTimeout:配置超时时间,它决定驱动等待数据库响应的秒数(超时抛出异常) mapUnderscoreToCamelCase:是否开启字段驼峰命名规则(camel case)映射 jdbcTypeForNull:当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型 <configuration> //完整配置 <settings> <setting name="cacheEnabled" value="true"/> //开启缓存 <setting name="lazyLoadingEnabled" value="true"/>//是否开启延迟加载,如果开启,所有关联对象都会延迟加载 <setting name="aggressiveLazyLoading" value="false"/> <setting name="useGeneratedKeys" value="true"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="logImpl" value="SLF4J"/> <setting name="mapUnderscoreToCamelCase" value="true"/> <setting name="defaultStatementTimeout" value="30"/> </settings> </configuration>
typeAliases:(元素设置别名 ) P17页
除了<typeAliases>元素为实体类自定义别名外,MyBatis框架还为许多常见的Java类型(例如数值、字符串、日期和集合等)提供了相应的默认别名,例:_byte映射类型byte、_long映射类型long, (别名不区分大小写)
POJO:(Plain Old Java Object 普通的旧Java对象):是java开发中非常基础且重要的概念,是一种简单、灵活且易于维护的类设计方式;利用它可以更好的封装数据和行为,提高代码的可读性和可维护性
方法一:在<typeAliases>元素下,使用多个<typeAlias>元素为每一个全限定类逐个配置别名(一般实现在需要重命名少的情况下)
方法二:通过自动扫描包的形式自定义别名,默认实体类名就是别名,大小写不区分
environments:
MyBatis映射文件
<mapper>元素是映射文件的根元素 P21页
<mapper>元素中namespace属性作用:
1、区分不同的mapper,全局唯一
2、绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的全限定名查找到对应的mapper配置来执行SQL语句,因此
namespace的命名必须跟接口同名,接口中的方法与映射文件中的SQL语句id进行一致对应 P21页
MybatisUtils:简化MyBatis的初始化过程,并提供便捷的方式来获取SqlSession对象。
package com.kuige.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try{ String resource= "mybatis-config.xml"; InputStream inputStream=null; inputStream= Resources.getResourceAsStream(resource); sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e){ e.printStackTrace(); } } public static SqlSession getSession() { return sqlSessionFactory.openSession(); } }
MyBatisUtils是一个工具类:
1、加载MyBatis配置文件:通过静态代码块加载 mybatis-config.xml 配置文件
2、创建SqlSessionFactory:在类加载时初始化 SqlSessionFactory
3、提供 SqlSession:通过静态方法 getSession()提供一个获取 SqlSession的接口
业务逻辑代码中的使用:
try (SqlSession session = MybatisUtils.getSession()) { // 使用 session 执行数据库操作,如查询、插入、更新、删除等 User user = session.selectOne("getUserById", 1); System.out.println(user); }
总结:MybatisUtils是一个典型的MyBatis工具类,用于简化SqlSessionFactory的初始化和SqlSession的获取。通过静态代码块加载配置文件,提供一个静态方法 getSession(),在应用程序中可以方便的获取SqlSession对象,进行数据库的操作。
1、MyBatis映射文件中增、删、改、查:
<select>
语法:<select id="接口名" resultType="指定执行这条SQL语句返回的全限定类名或别名(查询时,resultType不可省,或使用resultMap,用来接收结果集)"> sql查询语句 </select> 常用属性:id:唯一标识,通过它调用此条查询语句 parameterType:可选属性,指定SQL语句所需参数类的全限定名或者别名 resultType: 指定执行这条SQL语句返回的全限定类名或别名,配置返回结果集类型 resultMap:表示外部resultMap的命名引用,resultMap和rasultType都是用来接收结果集,二者不能同时使用
<insert>P23页
第一种方式:支持主键自增 SELECT LAST_INSERT_ID()
第二种方式:不支持主键自增
<insert id="addUser" parameterType="user"> <selectKey keyProperty="uid" resultType="int" order="BEFORE"> SELECT FLOOR(RAND()*1000+1) //主键回写 通过随机值的写入,FLOOR:自动取整 </selectKey> INSERT into users(键名) values(#{键名}) </insert>
<update>
语法:<update id="接口名"> sql查询语句 </update>//与插入一致
<delete>
语法:<delete id="与接口名一致" parameterType="int"> (parameterType可省,MyBatis会自动分配) SQL语句 </delete>
总结:在以上增删改中,Test类方法中一定要记得提交事务。
<sql>
语法:<sql id=""> 相同的sql片段 </sql> <include refid="sql的id"> </include>
SQL:定义可复用的代码段
<resultMap>
当数据表的列和需要返回的对象的属性可能不会完全一致,MyBatis不会自动赋值,需要resultMap进行手动结果集映射
需要注意的是:在测试类MyBatisTest中,每一个用@Test注解标注的方法称为测试方法,他们的顺序为@Before—>@Test—>@After.
了解搭建时的各包的作用:
在Maven项目中,src/main/java 和 src/main/resources 是标准的目录结构
1、java目录:这个目录用于存放Java源代码文件,所有java文件放在这里,这些文件包含了项目的应用逻辑和类定义。
2、 resources目录:存放项目的资源文件。这些文件不会被编译成 .class 文件,但会被打包进最终的应用程序中。
配置文件:(如 db.properties、log4j.properties等)
静态文件: (如文本文件、图片、字体文件等)
模板文件:(如HTML 、JSP 、Thymeleaf模板等)
本地化文件:(如 message.properties等)
总结:这样有助于保持项目的组织结构清晰,便于开发和维护
深度了解数据库连接的配置文件:
1、driver=com.mysql.cj.jdbc.Driver //加载驱动
cj:是Mysql Connector/J 驱动程序的一部分,mysql官方提供用于JAva应用程序连接MySql数据库的JDBC驱动
2、url=jdbc:mysql://localhost:3306/esaybuy //连接数据库的地址
jdbc:mysql://本机地址:数据库端口号(3306)/连接的数据库名
3、username=root //用户名
4、password=123456
password=根据自己所设置的
注意:在映射配置文件中编写
resultType:指定这条SQL语句返回的类的全限定类名或别名。若属性值是集合(List),需要指定集合可以包含的类型。
parameterType:指定SQL所需参数的全限定类名或别,。可选属性。
SimpleDateFormat作用:
{ SimpleDateFormat sj=new SimpleDateFormat("yyyy-MM-dd"); Date birth=sj.parse("2004-06-10"); user.setUBirth(birth); }catch (ParseException e) { throw new RuntimeException(e); }
是Java中用于格式化的解析日期的类,属java.text包,可根据指定格式(pattern)将日期字符串转换为Date对象,或将Date对象格式化为字符串。parse方法可能会抛出ParseException,表示输入字符串不符合指定的格式
第三章 动态SQ
1、动态sql中的的元素
动态SQL是MyBatis的强大特性之一,MyBatis采用了功能强大的基于OGNL(Object Graph Navigation Language:对象导航图语言),减少了单一SQL语句的反复堆砌,提高了SQL语句的复用性
2、条件查询(if)操作
<if>元素是最常用的判断元素,类似于Java中的if条件语句,主要是实现某些简单的条件判断。有时也用于判断字符串、数字和枚举。
<choose><when><otherwise>:解决<if>元素中test属性的表达式为true而执行多条(where)条件语句。这三个元素组合一起使用,相当于Java语言中的if…else if…else。
<choose>:switch /if
<when>:case /else if
<otherwise>:default /else
P34页
使用<choose>元素进行SQL拼接时,第一个元素<when>中的条件为真时,则执行第一个动态组装SQL片段,后面的就不执行;若第一个不为True则一直往后执行寻找为True的,如果<where>实在没有则执行<otherwise>语句
代码实现
<select id="selCustomerOne" parameterType="com.esaybuy.pojo.Customer" resultType="com.esaybuy.pojo.Customer"> SELECT * FROM t_customer where 1=1 <choose> <when test="username!=null and username!=''"> and username like concat('%',#{username},'%') </when> <when test="jobs!=null and jobs!=''"> and jobs=#{jobs} </when> <otherwise> and phone is not null </otherwise> </choose> </select>
方法二:去除where 1=1条件
<select id="selCustomer" parameterType="com.esaybuy.pojo.Customer" resultType="com.esaybuy.pojo.Customer"> SELECT * FROM t_customer <where> <if test="username!=null and username!=''"> and username like concat('%',#{username},'%') </if> <if test="jobs!=null and jobs!=''"> and jobs=#{jobs} </if> </where> </select>
第二种方法中,<where>元素会自动判断由组合条件拼装的SQL语句,只有<where>元素内的某一个或多个条件成立时,才会在拼接SQL中加入where关键字,否则不会添加;即使where之后的内容有多余的“AND” 或“OR”,<where>元素也会自动将他们去除,只输出第一个匹配到的。P35-P36页
<trim>元素:删除多余的关键字(trim)
包含4个属性:
1、prefix :给SQL语句增加的前缀
2、prefixOverrides:指定SQL语句中要去掉的前缀字符串(以上两个常用)
3、suffix:给SQL语句增加后缀
4、suffixOverrides:指定SQL语句中要去掉的后缀字符串
<select id="selCustomer" parameterType="com.esaybuy.pojo.Customer" resultType="com.esaybuy.pojo.Customer"> SELECT * FROM t_customer <trim prefix="where" prefixOverrides="and"> <if test="username!=null and username!=''"> and username like concat('%',#{username},'%') </if> <if test="jobs!=null and jobs!=''"> and jobs=#{jobs} </if> </trim> </select>
3、更新操作(set)
<set>元素主要用于更新操作,可在动态SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。<set>元素与<if>元素结合可以只更新需要更新的字段。
<update id="updCustomer" parameterType="com.esaybuy.pojo.Customer"> update t_customer <set> <if test="username!=null and username!=''"> username=#{username}, </if> <if test="jobs!=null and jobs!=''"> jobs=#{jobs}, </if> <if test="phone!=null and phone!=''"> phone=#{phone}, </if> </set> where id=#{id} </update>
注意:
3.1、在映射文件中使用<set>元素和<if>元素组合进行updata语句动态SQL组装时,若<set>元素内包含的内容都为空,则出现SQL语法错误,使用<set>元素进行字段信息更新时,传入的更新字段都不能为空。
3.2、除<set>元素外,<trim>元素也可以实现更新操作,<trim>元素的prefix(SQL语句增加的前缀)属性指定要添加<trim>元素所包含内容的前缀为set,suffixOverrides(SQL语句指定要去除的后缀字符串)属性指定去除的<trim>元素所包含内容的后缀为逗号。
4、复杂查询操作
<foreach>元素中的属性:
1、item:集合中每一个元素进行迭代时的别名,必选 2、index:在**List**和**数组**中,index是**元素的序号**(下标),在**Map**(类似于python的**字典格式)**中,index是元素的**key**,可选。 3、collection:指定遍历参数的类型(Map,List,数组)。该属性必须指定,不同情况下,该属性的值是不一样的。 4、open:foreach语句代码的开始符号,(例如拼接函数时,以什么开始来拼接,)一般和close=”)“合用。常用在in条件语句中。 5、separator:元素之间的分隔符,在条件语句中,separator=" , "会自动在元素中间用" , "隔开(例:in(1,2,3) ),避免手动输入逗号导致SQL错误 6、close:foreach语句代码的关闭符号,(例如拼接函数时,以什么结束来结尾)和open合用,常用在in条件语句中,可选
collection属性:若入参为单数且参数类型是一个List,collection属性值为list。若入参为单数且参数类型是一个数组,collection属性值为array。若传入参数为多参数,就需要吧参数封装为一个Map进行处理,collectiom属性值为Map。
<foreach>关于数组的迭代:xml
<select id="selUser" parameterType="com.esaybuy.pojo.Customer" resultType="com.esaybuy.pojo.Customer"> SELECT * FROM t_customer where id in <foreach collection="array" index="index" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>
Test:
@Test public void selUserTest(){ //获取sqlSession核心对象 SqlSession session= MyBatisUtils.getSession(); Integer[] roleIds={1,2,3}; // 执行sql List<Customer> customers =session.selectList("com.esaybuy.mapper.CustomerMapper.selUser",roleIds); for (Customer c:customers){ System.out.println(c); } // 释放资源 session.close(); }
<foreach>元素迭代List:
<select id="selCustomer2" resultType="com.esaybuy.pojo.Customer"> SELECT * FROM t_customer where id in <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>
Test:
@Test public void selCustomer2(){ //获取SqlSession SqlSession session = MyBatisUtils.getSession(); //创建List集合,封装查询id List<Integer> cust=new ArrayList<>(); cust.add(1); cust.add(2); //执行SqlSession的查询方法,返回结果集 List<Customer> customers=session.selectList("com.esaybuy.mapper.CustomerMapper.selCustomer2",cust); //输出查询结果信息 for(Customer customer : customers){ 输出结果信息 System.out.println(customer); //关闭SqlSession session.close(); } }
<foreach>元素迭代Map:
xml:
<select id="selCustomarMap" resultType="com.esaybuy.pojo.Customer"> SELECT * FROM t_customer where jobs=#{jobs} and id in <foreach collection="id" item="roleMap" open="(" close=")" separator=","> #{roleMap} </foreach> </select>
Test:
@Test public void selCustomer3Test(){ SqlSession session = MyBatisUtils.getSession(); List<Integer> ids=new ArrayList<Integer>(); ids.add(1); ids.add(2); ids.add(3); Map<String, Object> conditionMap=new HashMap<String,Object>(); conditionMap.put("id",ids); conditionMap.put("jobs","meinv"); List<Customer> customers=session.selectList("com.esaybuy.mapper.CustomerMapper.selCustomarMap",conditionMap); for(Customer customer : customers){ System.out.println(customer); session.close(); }
集合类型常用场景:
1、数组:用于存储固定数量的元素,如数据库连接池中的连接数组
2、List:用于动态管理元素且元素有序,如用户会话列表、购物车中的商品列表等。
3、Map:用于根据键快速访问元素,如缓存数据、存储会话属性、映射请求参数等
案例:学生信息查询系统
(1)、多条件查询
selectList是SqlSession接口提供的一个方法,用于执行一个映射器(mapper)中定义的SQL查询,并返回一个列表类型的结果。此方法通常用于执行SELECT语句,返回多条记录。 // 语法:List<T> selectList(String ststement,Object parameter); // <T>:Java泛型,表示返回的列表可以包含任何类型的对象。 // String statement:这是映射器中定义的SQL语句的唯一标识符(ID)【com.esaybuy.mapper.SQL语句的唯一标识符(ID)】,对应于MyBatis映射文件(XML)中<select>标签的id属性。 // Object parameter:是一个可选参数,用于传递给SQL语句的参数。可以是任何类型的对象,MyBatis会根据映射文件中的定义将其属性映射为SQL语句中的参数,若没有参数,可以传递null
<mapper namespace="com.esaybuy.mapper.StudentMapper"> <!-- <choose>(<when>,<otherwise>)相当于java中的switch……case……default语句,用于多条件判断--> <select id="findStudent" resultType="com.esaybuy.pojo.Student"> select * from student where 1=1 <choose> <when test="name!=null and name!=''"> and name like concat('%',#{name},'%') </when> <when test="major!=null and major!=''"> and major=#{major} </when> <otherwise> and sno is not null </otherwise> </choose> </select> </mapper>
@Test public void setStudentTest() { SqlSession session = MyBatisUtils.getSession(); Student student = new Student(); student.setName("夏文娇"); student.setMajor("英语"); List<Student> students=session.selectList("com.esaybuy.mapper.StudentMapper.findStudent",student); for(Student student1 : students){ System.out.println(student1); } session.close(); }
(2)、单条件查询
查询出所有id值小于5的学生的信息
xml:
</select> <select id="findStudentList" resultType="com.esaybuy.pojo.Student"> select * from student where id in <foreach item="id" index="index" collection="list" open="(" separator="," close=")"> #{id} </foreach> </select>
Test:
@Test public void findStudentTest(){ SqlSession session=MyBatisUtils.getSession(); List<Integer> ids=new ArrayList<>(); // 准备查询的条件 ids.add(1); ids.add(2); ids.add(3); ids.add(4); // for(int i=1;i<5;i++){ // ids.add(i); // } // 执行查询 List<Student> students=session.selectList("com.esaybuy.mapper.StudentMapper.findStudentList",ids); for (Student s: students) { System.out.println(s); } // 释放资源 session.close(); }
使用<foreach>时,collection属性需要注意的几点:
collection属性指定了要迭代的集合:
<select id="selectUsers" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="list" item="item" open="(" close=")" separator=","> #{item} </foreach> </select>
在这个示例中,collection="list"
指定了要迭代的集合,item="item"
指定了当前元素的别名,open="("
和 close=")"
指定了生成的 SQL 片段的开始和结束部分,separator=","
指定了元素之间的分隔符。