文章目录
- Maven
- 1、Maven简介
- 2、Maven基本使用
- 3、 IDEA使用Maven
- 4 、依赖管理
- MyBatis
- 1、Mybatis概述
- 2、Mybatis快速入门
- 3、Mapper代理开发
- 4、核心配置文件
- 6、配置文件实现CRUD
- 7、注解实现CRUD
Maven
1、Maven简介
-
Maven是专门用于管理和构建Java项目的工具
(1)Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档
(2)Apache 是一个开源组织
(3)官网 :http://maven.apache.org/ -
Maven主要功能
-
提供了一套标准化的项目结构
(1)每个开发工具(IDE)都有自己不同的项目结构,它们互相之间不通用
(2)Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样
-
提供了一套标准化的构建流程(编译,测试,打包,发布……)
-
提供了一套依赖管理机制
(1)依赖管理就是管理项目所依赖的第三方资源(jar包、插件)
(2)Maven使用标准的 坐标 配置来管理各种依赖,只需要简单的配置就可以完成依赖管理
-
-
Maven模型
(1)项目对象模型 (Project Object Model)
(2)依赖管理模型(Dependency)
(3)插件(Plugin)-
项目对象模型 (Project Object Model)
(1)项目对象模型就是将项目抽象成一个对象模型,有专属的坐标
-
依赖管理模型(Dependency)
(1)依赖管理模型就是使用坐标来描述当前项目依赖哪儿些第三方jar包
-
插件(Plugin)
(1)紫色框部分用于完成标准化构建流程
(2)需要编译Maven就会提供一个编译插件,需要打包,Maven就会提供了一个打包插件
-
-
仓库
-
依赖jar包存储在本地仓库中,项目运行时从本地仓库中拿需要的依赖jar包
-
仓库分类:
- 本地仓库:自己计算机上的一个目录
- 中央仓库:由Maven团队维护的全球唯一的仓库
地址: https://repo1.maven.org/maven2/ - 远程仓库(私服):一般由公司团队搭建的私有仓库
-
jar包的查找顺序
(1)当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包
(2)如果有,则在项目直接引用;如果没有,则去中央仓库中下载对应的jar包到本地仓库
(3)如果搭建了远程仓库,jar包的查找顺序会变为:本地仓库 --> 远程仓库–> 中央仓库
-
2、Maven基本使用
-
Maven 常用命令使用
(1)使用命令需要在磁盘上进入项目的 pom.xml 目录下,打开命令提示符
(2)命令使用格式:mvn 命令
(3)常用命令-
compile :编译,执行后
(1)从阿里云下载编译需要的插件的jar包,在本地仓库也能看到下载好的插件
(2)在项目下会生成一个 target 目录,编译后的字节码文件就放在该目录下
-
clean:清理,执行后
(1)从阿里云下载清理需要的插件jar包
(2)删除项目下的 target 目录 -
test:测试
(1)该命令会执行所有的测试代码。 -
package:打包
(1)从阿里云下载打包需要的插件jar包
(2)在项目的 terget 目录下有一个jar包(将当前项目打成的jar包) -
install:安装
(1)该命令会将当前项目打成jar包,并安装到本地仓库
-
-
Maven 生命周期
- Maven 构建项目生命周期描述的是一次构建过程经历经历了多少个事件
- Maven 对项目构建的生命周期划分为3套:
(1)clean :清理工作。
(2)default :核心工作,例如编译,测试,打包,安装等。
(3)site : 产生报告,发布站点等。这套声明周期一般不会使用。 - 同一套生命周期内,执行后边的命令,前面的所有命令会自动执行
例如:
默认(default)生命周期如下:
当我们执行 package (打包)命令时,它会先执行 compile 命令,再执行 test 命令,最后执行 package 命令 - 默认的生命周期也有对应的很多命令,其他的一般都不会使用,我们只关注常用的:
3、 IDEA使用Maven
-
IDEA配置Maven环境
-
在IDEA项目中选择 File --> Settings
-
搜索 maven
-
设置 IDEA 使用本地安装的 Maven,并修改配置文件路径
-
-
Maven 坐标详解
- 坐标
(1)Maven 中的坐标是资源的唯一标识
(2)使用坐标来定义项目或引入项目中需要的依赖
(3)资源可以是插件、依赖、当前项目 - Maven 坐标主要组成
(1)groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
(2)artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
(3)version:定义当前项目版本号
- 坐标
-
IDEA 创建 Maven项目
-
创建模块,选择Maven,点击Next
-
填写模块名称,坐标信息,点击finish,创建完成
-
-
IDEA 导入 Maven项目
-
选择右侧Maven面板,点击 + 号
-
选中对应项目的pom.xml文件,双击即可
-
如果没有Maven面板,选择View --> Appearance --> Tool Window Bars
-
-
IDEA中使用Maven命令
(1)可以通过下图所示进行命令的操作:
(2)Maven-Helper 插件使用命令更加快捷
- 配置 Maven-Helper 插件
(1)选择 IDEA中 File --> Settings
(2)选择 Plugins
(3)搜索 Maven,选择第一个 Maven Helper,点击Install安装,弹出面板中点击Accept
(4)重启 IDEA
- 配置 Maven-Helper 插件
4 、依赖管理
-
使用坐标引入jar包
-
使用坐标引入jar包的步骤:
(1)在项目的 pom.xml 中编写 标签
(2)在 标签中 使用 引入坐标
(3)定义坐标的 groupId,artifactId,version
(4)点击刷新按钮,使坐标生效
-
自动导入设置:省去点击刷新按钮
(1)选择 IDEA中 File --> Settings
(2)在弹出的面板中找到 Build Tools
(3)选择 Any changes,点击 ok 即可生效
-
具体的坐标可以到网站进行搜索:https://mvnrepository.com/
-
快捷方式导入jar包的坐标:
(1)在 pom.xml 中 按 alt + insert,选择 Dependency
(2)在弹出的面板中搜索对应坐标,然后双击选中对应坐标
(3)点击刷新按钮,使坐标生效
-
-
依赖范围
- 通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境
- 不指定 scope 标签时,默认就是 compile 值
(1)compile :作用于编译环境、测试环境、运行环境。
(2)test : 作用于测试环境。典型的就是Junit坐标,以后使用Junit时,都会将scope指定为该值
(3)provided :作用于编译环境、测试环境。我们后面会学习 servlet-api ,在使用它时,必须将 scope 设置为该值,不然运行时就会报错
(4)runtime : 作用于测试环境、运行环境。jdbc驱动一般将 scope 设置为该值,当然不设置也没有任何问题
第五版JDBC使用操作,手动导入jar包改为有Maven自动导入,还是七个步骤
MyBatis
1、Mybatis概述
-
Mybatis概念
(1)MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
(2)MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了googlecode,并且改名为MyBatis 。2013年11月迁移到Github
(3)官网:https://mybatis.org/mybatis-3/zh/index.html-
持久层
(1)JavaEE三层架构:表现层、业务层、持久层
(2)负责将数据到保存到数据库的那一层代码。将操作数据库的Java代码为持久层,Mybatis就是对jdbc代码进行了封装
(3)持久层框架的使用占比
-
框架
(1)框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
(2)在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
-
-
JDBC 缺点
(1)硬编码:注册驱动、获取连接;SQL语句
(2)操作繁琐:手动设置参数;手动封装结果集 -
Mybatis 优化
(1)硬编码可以配置到配置文件
(2)操作繁琐的地方mybatis都自动完成
2、Mybatis快速入门
- 案例
-
(2)创建模块,导入坐标
在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标<dependencies> <!--mybatis 依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--mysql 驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--junit 单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- 添加slf4j日志api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <!-- 添加logback-classic依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- 添加logback-core依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> </dependencies>
注意:需要在项目的 resources 目录下创建logback的配置文件
-
(3)编写 MyBatis 核心配置文件 – > 替换连接信息 解决硬编码问题
在模块下的 resources 目录下创建mybatis的配置文件 mybatis-config.xml ,内容如下:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="com.itheima.pojo"/> </typeAliases> <!-- environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的 environment --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> <mappers> <!--加载sql映射文件--> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
三点:typeAliases、environments、mappers
-
(4)编写 SQL 映射文件 --> 统一管理sql语句,解决硬编码问题
在模块的 resources 目录下创建映射配置文件 UserMapper.xml ,内容如下:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="test"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper>
-
(5)编码
(1)在 com.itheima.pojo 包下创建 User类
(2)在 com.itheima 包下编写 MybatisDemo 测试类public class MyBatisDemo { public static void main(String[] args) throws IOException { //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象,用它来执行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 执行sql List<User> users = sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id System.out.println(users); //4. 释放资源 sqlSession.close(); } }
-
将JDBC的七个步骤缩减为四个步骤
其中第一步(获取连接对象)和最后一步还是相对应(释放资源)
第二步对应原来的2、3步(定义SQL、获取pstmt对象)
第三步对应原来的4、5、6步(设置参数、执行SQL、处理结果)
第六版JDBC使用操作,使用MyBatis半成品,优化硬编码和操作繁琐问题,剩4个步骤(编码),编码前有三个步骤:1.导入坐标 2.编写MyBatis配置文件 3.编写SQL映射文件,3个准备步骤和4个编码步骤
- 解决SQL映射文件的警告提示:
-
产生的原因:Idea和数据库没有建立连接,不识别表信息。但是大家一定要记住,它并不影响程序的执行
-
解决方式:在Idea中配置MySQL数据库连接
-
IDEA中配置MySQL数据库连接
(1)点击IDEA右边框的 Database ,在展开的界面点击 + 选择 Data Source ,再选择 MySQL
(2)在弹出的界面进行基本信息的填写
第一次连接数据库需要安装驱动:设置
Driver:MySQL
(选择自己使用的数据库对应的驱动),点击测试连接会弹出下载驱动界面,点击下载,等待下载完成即可(3)点击完成后就能看到如下界面
(4)可以进行数据库的操作,也可以编写SQL语句
-
3、Mapper代理开发
- Mapper代理开发概述
(1)解决原生方式中的硬编码
(2)简化后期执行SQL - 使用Mapper代理要求
(1)定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:
(2)设置SQL映射文件的namespace属性为Mapper接口全限定名
(3)在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
- 案例代码实现
-
在 com.itheima.mapper 包下创建 UserMapper接口,代码如下:
public interface UserMapper { List<User> selectAll(); }
-
在 resources 下创建 com/itheima/mapper 目录,并在该目录下创建 UserMapper.xml 映射配置文件
<!-- namespace:名称空间。必须是对应接口的全限定名--> <mapper namespace="com.itheima.mapper.UserMapper"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper>
-
在 com.itheima 包下创建 MybatisDemo2 测试类,代码如下:
/** * Mybatis 代理开发 */ public class MyBatisDemo2 { public static void main(String[] args) throws IOException { //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象,用它来执行sql SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 执行sql //3.1 获取UserMapper接口的代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.selectAll(); System.out.println(users); //4. 释放资源 sqlSession.close(); } }
-
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将核心配置文件的加载映射配置文件的配置修改为
<mappers> <!--加载sql映射文件--> <!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>--> <!--Mapper代理方式--> <package name="com.itheima.mapper"/> </mappers>
-
第七版JDBC使用操作,利用Mapper进一步优化代码,准备步骤多了一个编写SQL映射文件同名的Mapper接口,4个准备步骤和4个编码步骤
准备步骤的1.导入坐标和2.编写MyBatis配置文件两个步骤不需要多过改动
编码步骤的1.加载配置文件、2.获取SqlSession对象、4.释放资源三个步骤基本不需要改动
需要操作的主要就是通过SQL映射文件和Mapper代理接口准备好要执行的SQL,然后在代码中使用SQL,像是回归到了在数据库上直接进行SQL语句编写,将一切无关琐碎代码去除(后面学习会进一步优化),减少因为使用JDBC带来的隔阂
4、核心配置文件
注意:各个标签有前后顺序
-
多环境配置
在核心配置文件的 environments 标签中其实是可以配置多个 environment ,使用 id 给每段环境起名,在environments 中使用 default=‘环境id’ 来指定使用哪儿段配置。我们一般就配置一个 environment 即可 -
类型别名
在映射配置文件中的 resultType 属性需要配置数据封装的类型(类的全限定名)。而每次这样写是特别麻烦的,Mybatis提供了 类型别名 (typeAliases) 可以简化这部分的书写。
首先需要现在核心配置文件中配置类型别名,也就意味着给pojo包下所有的类起了别名(别名就是类名),不区分大小写。<typeAliases> <!--name属性的值是实体类所在包--> <package name="com.itheima.pojo"/> </typeAliases>
通过上述的配置,我们就可以简化映射配置文件中 resultType 属性值的编写
<mapper namespace="com.itheima.mapper.UserMapper"> <select id="selectAll" resultType="user"> select * from tb_user; </select> </mapper>
6、配置文件实现CRUD
通过案例演示
-
环境准备
- 数据库表(tb_brand)及数据准备
- 实体类 Brand
在 com.itheima.pojo 包下创建 Brand 实体类(SQL语句返回值类型resultType) - 编写测试用例
测试代码需要在 test/java 目录下创建包及测试用例。项目结构如下:
- 安装 MyBatisX 插件
- MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。
- 主要功能
(1)XML映射配置文件 和 接口方法 间相互跳转
(2)根据接口方法生成 statement
-
查询所有数据
-
实现步骤(三个关键操作步骤)
- 编写接口方法
- 编写SQL语句
- 编写测试方法
-
(1)编写接口方法
在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。并在该接口中定义 List< Brand> selectAll() 方法public interface BrandMapper { /** * 查询所有 */ List<Brand> selectAll(); }
-
(2)编写SQL语句
在 reources 下创建 com/itheima/mapper 目录结构,并在该目录下创建名为 BrandMapper.xml 的映射配置文件<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.BrandMapper"> <select id="selectAll" resultType="brand"> select * from tb_brand; </select> </mapper>
-
(3)编写测试方法
在 MybatisTest 类中编写测试查询所有的方法@Test public void testSelectAll() throws IOException { //1. 加载配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 执行方法 //3.1 获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); List<Brand> brands = brandMapper.selectAll(); System.out.println(brands); //5. 释放资源 sqlSession.close(); }
-
实体类属性名 和 数据库表列名 不一致,不能自动封装数据
解决办法:
(1)给字段起别名
(2)使用resultMap定义字段和属性的映射关系 -
起别名
-
方法一:在SQL语句中直接起别名
缺点:代码不够精炼,只能用一次 -
方法二:使用SQL片段起别名
缺点:相比方法一提高了复用性,但还是不够灵活,不同查询组合要创建不同SQL片段<sql id="brand_column"> id, brand_name as brandName, company_name as companyName, ordered, description, status </sql> <select id="selectAll" resultType="brand"> select <include refid="brand_column" /> from tb_brand; </select>
-
-
resultMap
将字段名和属性名不同的进行映射,SQL语正常编写<!-- id: 唯一标识 type:映射的类型,支持别名 --> <resultMap id="brandResultMap" type="brand"> <result column="brand_name" property="brandName"/> <result column="company_name" property="companyName"/> </resultMap> <select id="selectAll" resultMap="brandResultMap"> select * from tb_brand; </select>
-
-
查询详情
-
参数占位符
mybatis提供了两种参数占位符:- #{} :执行SQL时,会将 #{} 占位符替换为?,底层使用的是PreparedStatement
- ${} :拼接SQL,底层使用的是 Statement ,会存在SQL注入问题
-
使用parameterType
<select id="selectById" parameterType="int" resultMap="brandResultMap"> select * from tb_brand where id = ${id}; </select>
对于有参数的mapper接口方法,在映射配置文件中可以配置 ParameterType 来指定参数类型。可以省略配置
-
特殊字段处理
- 转义字符
<
就是 < 的转义字符 - <![CDATA[ 内容 ]]>:CD提示
- 转义字符
-
-
多条件查询
- 编写测试方法
@Test public void testSelectByCondition() throws IOException { //接收参数 int status = 1; String companyName = "华为"; String brandName = "华为"; // 处理参数 companyName = "%" + companyName + "%"; brandName = "%" + brandName + "%"; //1. 获取SqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //2. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //3. 获取Mapper接口的代理对象 BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); //4. 执行方法 //方式一 :接口方法参数使用 @Param 方式调用的方法 //List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName); //方式二 :接口方法参数是 实体类对象 方式调用的方法 //封装对象 /* Brand brand = new Brand(); brand.setStatus(status); brand.setCompanyName(companyName); brand.setBrandName(brandName);*/ //List<Brand> brands = brandMapper.selectByCondition(brand); //方式三 :接口方法参数是 map集合对象 方式调用的方法 Map map = new HashMap(); map.put("status" , status); map.put("companyName", companyName); map.put("brandName" , brandName); List<Brand> brands = brandMapper.selectByCondition(map); System.out.println(brands); //5. 释放资源 sqlSession.close(); }
-
动态SQL
-
需求:用户在输入条件时,可能会不填一些条件,导致代码报错
-
动态SQL就是会随着用户的输入或外部条件变化而变化的SQL语句
-
Mybatis对动态SQL有很强大的支撑:
-
if 标签:条件判断
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand where <if test="status != null"> status = #{status} </if> <if test="companyName != null and companyName != '' "> and company_name like #{companyName} </if> <if test="brandName != null and brandName != '' "> and brand_name like #{brandName} </if> </select>
上面代码还是存在问题,当第一个条件没有参数时,会导致后面判断条件前面多了
and
- where 标签
作用:
(1)替换where关键字
(2)会动态的去掉第一个条件前的 and
(3)如果所有的参数没有值则不加where关键字
<select id="selectByCondition" resultMap="brandResultMap"> select * from tb_brand <where> <if test="status != null"> and status = #{status} </if> <if test="companyName != null and companyName != '' "> and company_name like #{companyName} </if> <if test="brandName != null and brandName != '' "> and brand_name like #{brandName} </if> </where> </select>
注意:需要给每个条件前都加上 and 关键字
不使用where标签也可以解决:在原来的where 后加上恒等式 1=1,就可以消除多余的and
where标签的原理就是使用了恒等式抵消and -
-
单个条件(动态SQL)
- 需求:用户任意选择 品牌名称 、 当前状态 、 企业名称 这三个条件中的一个
- 可以使用choose(when,otherwise)标签 实现, 而 choose 标签类似于Java 中的switch语句
<select id="selectByConditionSingle" resultMap="brandResultMap"> select * from tb_brand <where> <choose><!--相当于switch--> <when test="status != null"><!--相当于case--> status = #{status} </when> <when test="companyName != null and companyName != '' "><!--相当于case--> company_name like #{companyName} </when> <when test="brandName != null and brandName != ''"><!--相当于case--> brand_name like #{brandName} </when> </choose> </where> </select>
注意:不加上where标签,当输入为空时会导致程序报错
这里where标签的作用可以用otherwise代替,类似于default<otherwise> 1 = 1 </otherwise>
-
添加数据
-
需求:在数据添加成功后,有时候需要获取插入数据库数据的主键(主键是自增长)
-
主键返回
<insert id="add" useGeneratedKeys="true" keyProperty="id"> insert into tb_brand (brand_name, company_name, ordered, description, status) values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status}); </insert>
在 insert 标签上添加如下属性:
useGeneratedKeys:能够获取自动增长的主键值。true表示获取
keyProperty :指定将获取到的主键值封装到哪个属性里
-
-
修改
- set 标签可以用于动态包含需要更新的列,忽略其它不更新的列
<update id="update"> update tb_brand <set> <if test="brandName != null and brandName != ''"> brand_name = #{brandName}, </if> <if test="companyName != null and companyName != ''"> company_name = #{companyName}, </if> <if test="ordered != null"> ordered = #{ordered}, </if> <if test="description != null and description != ''"> description = #{description}, </if> <if test="status != null"> status = #{status} </if> </set> where id = #{id}; </update>
- set 标签可以用于动态包含需要更新的列,忽略其它不更新的列
-
批量删除
- foreach 标签
用来迭代任何可迭代的对象(如数组,集合)- collection 属性:mybatis会将数组参数,封装为一个Map集合
(1)默认:array = 数组
(2)可以使用@Param注解改变map集合的默认key的名称 - item 属性:本次迭代获取到的元素
- separator 属性:集合项迭代之间的分隔符
foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符 - open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
- close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
<delete id="deleteByIds"> delete from tb_brand where id in <foreach collection="array" item="id" separator="," open="(" close=")"> #{id} </foreach> ; </delete>
- collection 属性:mybatis会将数组参数,封装为一个Map集合
- foreach 标签
-
Mybatis参数传递
- Mybatis 接口方法中可以接收各种各样的参数
- 多个参数:接口参数是多个时,在每个参数上都使用 @Param 注解,这样代码的可读性更高
- 单个参数:
- POJO 类型:直接使用。要求 属性名 和 参数占位符名称 一致
- Map 集合类型:直接使用。要求 map集合的键名 和 参数占位符名称 一致
- Collection 集合类型:使用 @Param 注解替换map集合中默认的 arg 键名
- List 集合类型:使用 @Param 注解替换map集合中默认的 arg 键名
- Array 类型:使用 @Param 注解替换map集合中默认的 arg 键名
- 其他类型:参数占位符名称 叫什么都可以。尽量做到见名知意
7、注解实现CRUD
-
使用注解开发会比配置文件开发更加方便
@Select(value = "select * from tb_user where id = #{id}") public User select(int id);
注解是用来替换映射配置文件方式配置的,所以使用了注解,就不需要再映射配置文件中书写对应的 statement
-
Mybatis 针对 CURD 操作都提供了对应的注解,已经做到见名知意
- 查询 :@Select
- 添加 :@Insert
- 修改 :@Update
- 删除 :@Delete
-
注解完成简单功能,配置文件完成复杂功能