Java EE(SSM)笔记

第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():可以配置两种类型的事务管理器,分别是JDBCMANAGED

JDBC:此配置直接使用JDBC的提交和回滚设置

MANAGED:不提供的事务的连接。而是容器来管理

2、dataSource(数据源)

P19页

后期开发:Spring+MyBatis开发时,事务不需要再MyBatis中配置事务,因为Spring自带的管理器来实现事务管理,对于数据源提供了UNPOOLEDPOOLEDJNDI三种数据源类型

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="," 指定了元素之间的分隔符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值