位置: IT常识 - 正文

2.MyBatis

编辑:rootadmin
MyBatis 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 视频教程(P47~P60) ==看前提醒==:如果之前学过一些框架,只想知道mybatis怎么用,那么就不太建议看任何第三方教程,更建议直接去看官方文档,从入门到具体配 ... MyBatis

推荐整理分享2.MyBatis,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

视频教程(P47~P60)

看前提醒:如果之前学过一些框架,只想知道mybatis怎么用,那么就不太建议看任何第三方教程,更建议直接去看官方文档,从入门到具体配置都有。如果之前没学过框架,也建议先试着去看,实在不行再继续看博客或教学视频内容。(官方文档不跟你废话,内容更加精炼)

什么是MyBatis?

MyBatis是一款优秀的持久层框架,用于简化JDBC开发MyBatis本是Apache 的一个开源项目iBatis, 2010年这个项目由apache softwarefoundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到GithubMyBatis官方参考文档(有中文,必看): https://mybatis.org/mybatis-3/zh/index.html

持久层

负责将数据到保存到数据库的那一层代码JavaEE三层架构:表现层、业务层、持久层

框架

框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

JDBC缺点

硬编码(不方便设置修改 数据库连接和sql语句,不便于后期维护)操作繁琐(很多参数需要手动设置,需要手动封装结果集)

MyBatis简化

硬编码 → 配置文件操作繁琐 →MyBatis辅助,简化代码MyBatis快速入门

参考网站:https://mybatis.org/mybatis-3/zh/getting-started.html

查询user表中所有数据

创建user表,添加数据

创建模块,导入坐标(建议先去学习maven基础)

编写MyBatis核心配置文件-->替换连接信息解决硬编码问题

编写SQL映射文件-->统一管理sql语句,解决硬编码问题

编码

定义POJO类

加载核心配置文件,获取 SqlSessionFactory 对象

获取SqISession对象,执行SQL语句

释放资源

具体操作

在mysql中创建数据表(直接用,没必要手敲)(我用的mysql-5.7.38)

DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `age` int(11) NULL DEFAULT NULL, `gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;INSERT INTO `t_user` VALUES (1, 'admin', '123456', 23, '男', '12345@qq.com');INSERT INTO `t_user` VALUES (2, 'root', '123', 23, '男', '12345@qq.com');INSERT INTO `t_user` VALUES (4, 'admin2', '123456', 23, '男', '12345@qq.com');

创建模块,导入坐标(考虑到某些人没学过maven,这里步骤比较详细。但还是建议先去看maven入门,要不了多少时间。)

IDEA界面中:左上角 File(文件)-->New(新建)-->Project...(项目)

选择maven

可以看到生成的结构

将以下内容放到pom.xml中(需要注意依赖、mysql驱动版本)

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>mybatis-demo</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!--mysql驱动 版本仅供参考,根据自己电脑中安装的mysql版本来--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!--junit 单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--打印日志 需要相应的配置文件--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies></project>

在resources文件夹中创建文件log4j.xml,并且写入以下内容(内容固定,拿来用就行,不需要背)

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="Encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n"/> </layout> </appender> <logger name="java.sql"> <level value="debug"/> </logger> <logger name="org.apache.ibatis"> <level value="info"/> </logger> <root> <level value="debug"/> <appender-ref ref="STDOUT"/> </root></log4j:configuration>

编写MyBatis核心配置文件

在resources中创建文件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> <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://localhost:3306/ssm"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers><!--选择需要加载的sql映射文件(存放需要执行的sql语句的配置文件),下一步会创建--> <mapper resource="UserMapper.xml"/> </mappers></configuration>

编写SQL映射文件

在resources文件夹中创建sql映射文件mybatis-config.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"><!--resultType为返回的数据所对应的类--> <select id="selectAll" resultType="com.atguigu.pojo.User"> select * from t_user </select></mapper>

在java文件夹中创建类com.atguigu.pojo.User (存放查询数据库时所返回的数据)

package com.atguigu.pojo;public class User { private Integer id; private String username; private String password; private Integer age; private String gender; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", age=" + age + ", gender='" + gender + '\'' + ", email='" + email + '\'' + '}'; }}

编码

在java文件夹中创建类com.atguigu.MyBatisDemo ,内容如下(不要背,只需要理解每一步的作用):

package com.atguigu;import com.atguigu.pojo.User;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;import java.util.List;public class MyBatisDemo { public static void main(String[] args) throws IOException { //1.加载mybatis核心配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //2.根据配置文件创建SqlSession工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.通过工厂获取SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //4.用SqlSession执行sql语句 此处的“test.selectAll”就是sql映射文件中的sql语句位置 List<User> users = sqlSession.selectList("test.selectAll"); System.out.println(users); //5.释放资源 sqlSession.close(); }}

运行MyBatisDemo。出现以下内容则成功

虽然相对于学习JDBC时只是在一个文件中操作而言,看起来似乎更加麻烦,但是也需要考虑实际开发中代码量大和后续维护困难程度的问题。

Mappr代理开发List<User> users = sqlSession.selectList("test.selectAll");

你可能会注意到,这种方式和用全限定名调用 Java 对象的方法类似。这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的 select 语句匹配到对应名称、参数和返回类型的方法。因此你就可以像上面那样,不费吹灰之力地在对应的映射器接口调用方法,就像下面这样:

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.selectAll();

第二种方法有很多优势,首先它不依赖于字符串字面值,会更安全一点;其次,如果你的 IDE 有代码补全功能,那么代码补全可以帮你快速选择到映射好的 SQL 语句。

使用Mapper代理方式完成入门案例

定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

由于maven进行编译会将java文件夹和resource文件夹下的内容都放到target/classes文件夹中,所以只需要两者对于java和resources文件夹的相对路径一致(因此此处没必要在写代码时把配置文件也放到接口同目录)(注意在resources中创建结构使用“com/atguigu/mapper”的方式,如果使用“com.atguigu.mapper”不会创建多级目录)

以下为编译后的文件结构,两者在同一目录中

设置SQL映射文件的namespace属性为Mapper接口全限定名

namespace="com.atguigu.mapper.UserMapper"

在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

List<User> selectAll();

修改mybatis配置文件中的sql映射文件的新的路径

<mapper resource="com/atguigu/mapper/UserMapper.xml"/>

编码

通过SqlSession的 getMapper方法获取Mapper接口的代理对象调用对应方法完成sql的执行//获取UserMapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.selectAll();

细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载

方法如下:

修改mybatis配置文件mybatis-config.xml中<mappers>下的内容

<!--sql映射文件--><mappers> <!--<mapper resource="com/atguigu/mapper/UserMapper.xml"/>--><package name="com.atguigu.mapper"/></mappers>MyBatis核心配置文件

我只会介绍一些重要的部分,不可能都讲完。详细的可以去官网。

官方文档(如果需要详细了解就必须去看):https://mybatis.org/mybatis-3/zh/configuration.html

mybatis-config.xml

environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment

mappers:配置sql映射文件(上面已经讲过了)

typeAliases:类型别名。可以减少需要书写的类的长度

例如:

在mybatis-config.xml的中加入下面的内容:

<!--扫描"com.atguigu.pojo"下的所有类,并取一个别名,默认为类名(不区分大小写)--><typeAliases> <package name="com.atguigu.pojo"/></typeAliases>

后面需要使用com.atguigu.pojo中的类时就只需要写类名,前面不需要附加包名。例如包中的User类:

当然,也可以对每个类进行单独的配置。但一般不使用那种方式。如想了解可以自行去官网查找。

细节:配置各个标签时,需要遵守下列的前后顺序(必须遵守,否则会报错)

configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环境变量)transactionManager(事务管理器)dataSource(数据源)databaseIdProvider(数据库厂商标识)mappers(映射器)配置文件完成增删改查完成品牌数据的增删改查操作

产品原型地址:

https://www.pmdaniu.com/storages/122645/74ccff58678d80583ea43a55547173eb-1818/电商后台高保真原型(首页).html

要完成的功能列表清单:

查询

查询所有数据

查看详情

条件查询

添加

修改

修改全部字段

修改动态字段

删除

删除一个

批量删除

准备环境

①数据库表tb_brand

-- 删除tb_brand表drop table if exists tb_brand;-- 创建tb_brand表create table tb_brand(-- id主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int,-- 描述信息description varchar(100),-- 状态∶0:禁用1∶启用status int);-- 添加数据insert into tb_brand (brand_name,company_name,ordered,description,status)values ('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0),('华为','华为技术有限公司', 100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1),('小米','小米科技有限公司',50,'are you ok', 1);SELECT * FROM tb_brand;

②实体类Brand(放在main/java文件夹下,位置看package)

package com.atguigu.pojo;public class Brand {private Integer id;//主键private String brandName;//品牌名称private String companyName;//企业名称private Integer ordered;//排序字段private String description;//描述信息private Integer status;//状态public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrandName() {return brandName;}public void setBrandName(String brandName) {this.brandName = brandName;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public Integer getOrdered() {return ordered;}public void setOrdered(Integer ordered) {this.ordered = ordered;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}@Overridepublic String toString() { return "Brand{" + "id=" + id + ", brandName='" + brandName + '\'' + ", companyName='" + companyName + '\'' + ", ordered=" + ordered + ", description='" + description + '\'' + ", status=" + status + '}';}}

后续如果不想写数据库表对应的实体类,也可以使用自动生成,(再根据实际需求进行修改):

先连接数据库(右侧的 Database(数据库) →"+"→Data Source(数据源)→MySQL→配置好数据库信息→OK)

创建实体类(也可以使用之前配置好 右侧的 Database(数据库)→schemas→找到表名右键→Scripted Extensions(脚本扩展)→Generate POHOs.grovy)

这不是MyBatis的主要内容,我就不详细说了。如果想看详细流程截图→:https://blog.csdn.net/weixin_42575720/article/details/125093184

③测试用例(放在test/java文件夹下,位置:src/test/java/com/itheima/test/MyBatisTest.java)

④安装MyBatisX插件(非必要,但开发更加方便)

MybatisX是一款基于IDEA的快速开发插件,为效率而生。

安装:

主要功能:XML和接口方法相互跳转(通过点击代码区域左侧的鸟)

2.MyBatis

根据接口方法生成statement(配置文件中写sql语句的位置)

如果在接口中创建方法,但没写对应的配置文件会出现如下报错(如果不安装这个插件则不会出现):

Alt+Enter 它可以帮你在配置文件中帮你定义好对应的结构(事先必须要创建配置文件,它不能帮你创建)

框出的内容为它生成的(只需要手动加上sql语句)

如果写sql语句时没提示可以在 设置中→搜索SQL Dialects(SQL方言)→Global SQL Dialect(全局SQL方言)设置为MySQL

1. 查询1.1查询所有数据

和入门案例类似,以下为基本要点(一定要自己上手,可以复制之前写的代码再修改)

代码参考:

package com.atguigu.mapper;import com.atguigu.pojo.Brand;import java.util.List;public interface BrandMapper { List<Brand> selectAll();}<?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.atguigu.mapper.BrandMapper"> <select id="selectAll" resultType="Brand"> SELECT * FROM tb_brand </select></mapper>package com.itheima.test;import com.atguigu.mapper.BrandMapper;import com.atguigu.pojo.Brand;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 org.junit.Test;import java.io.IOException;import java.io.InputStream;import java.util.List;public class MyBatisTest { @Test public void testSelectAll() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); List<Brand> brands = brandMapper.selectAll(); for (Brand brand : brands) { System.out.println(brand); } sqlSession.close(); }}

运行结果:

这里可以看到 brandName和companyName并没有获取到数据。是因为数据库中(brand_name,company_name)和实体类字段名称( brandName,companyName)不一样,对不上。需要手动设置。

方法一 起别名:修改sql语句,对不一样的列名起别名,让别名和实体类的属性名一样(缺点:每次查询都要定义一次别名。不推荐)

方法二 resultMap(结果映射):

定义<resultMap>标签在<select>标签中使用resultMap属性替换resultType属性

具体修改如下所示(注意看我的注释):

<?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.atguigu.mapper.BrandMapper"> <!-- id:唯一标识 type:映射的类型,支持别名 --> <resultMap id="brandResultMap" type="brand"> <!-- id:完成主键字段的映射 column:表的列名 property:实体类的属性名 result:完成一般字段的映射 column:表的列名 property:实体类的属性名 --> <result property="brandName" column="brand_name"/> <result property="companyName" column="company_name"/> </resultMap> <select id="selectAll" resultMap="brandResultMap"> SELECT * FROM tb_brand </select></mapper>

现在就能正常显示了

1.2查看详情

注意其中配置文件中的#{id}与方法中的id对应,为用作传递参数的参数占位符。

//测试方法@Testpublic void testSelectById() throws IOException { int id=1;//接收参数 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class); Brand brand = brandMapper.selectById(id); System.out.println(brand); sqlSession.close();}

参数占位符:

#{}:会将其替换为?,为了防止SQL注入。(详细情况我在JDBC中的Statement部分内容有说明)${}:拼接SQL。会存在SQL注入问题。(尽量不用)使用时机:参数传递的时候:#{}表名或者列名不固定的情况下:${}会存在SQL注入问题

注意特殊字符需要特地处理:

例如select * from tb_brand where id<3;由于是在xml文件中“<”不能被正常识别。

转义字符

< 改为 &lt;

CDATA区(输入CD会出现提示)

<![CDATA[ < ]]>

1.3条件查询

条件查询中经常会出现传入多个参数的情况,此时就不能只用之前的传参方式了(因为不知道怎么匹配)。

处理方法是在接口中对应方法处指出对应关系。

方式如下,主要内容已经给出(不难,我就不粘贴完整代码了,自己完成)

SQL语句设置多个参数的三种方式

散装参数:需要使用@Param("SQL中的参数占位符名称")

@Param("配置文件中的标识")形参(例如:@Param("status")int status)

如果不加@Param(""),mybatis就会自动命名。(mybatis会默认使用arg0,arg1,arg2....或param1,param2,param3...作为标识)

实体类封装参数

*只需要保证SQL中的参数名和实体类属性名对应上,即可设置成功将参数放到实体类对象中,直接传该对象。其中变量名对应标识,变量名对应值。(例如:此处可以把status、companyName、brandName存放到Brand对象中)

map集合

*只需要保证SQL中的参数名和map集合的键的名称对应上,即可设置成功创建hashMap。将配置文件中的标识符作为key,对应的值为value存放到其中。

但是上面这样写SQL语句在实际使用中会出现Bug。因为当存在框中内容为空的情况下,sql语句对应位置的参数就为null,因而导致查询结果错误。因此需要用到动态SQL

动态SQL

官方教程:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL

MyBatis 对动态SQL有很强大的支撑,利用下列标签可以实现动态SQL:

if

choose (when, otherwise)

trim (where, set)

foreach

if

用于判断参数是否有值,使用test属性进行条件判断

使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。比如:

<select id="selectByCondition" resultMap="brandResultMap"> SELECT * FROM tb_brand WHERE id = 1 <if test="status != null"> AND status = #{status} </if></select>

对于之前的题目,就能利用if判断是否有值来执行动态的SQL语句。

但是对于存在多个搜索条件的情况下,则会出现一些问题。例如:

# 第一个条件不需要逻辑运算符and,or等连接select * from tb_brand wherestatus = #{status}and company_name like #{companyName}and brand_name like #{brandName}

对于上面的sql语句,转换为动态SQL,需要进行针对性的处理。对此有两种方法:

使用恒等式(加入1=1)(仅需了解,实际情况尽量不用或少用)

select * from tb_brand where1=1<if test="status != null"> and status = #{status}</if><if test="companyName != null"> and company_name like #{companyName}</if><if test="brandName != null"> and brand_name like #{brandName}</if>

使用替换where关键字(where标签很智能,如果where后面跟的有and,会自动删除。如果where后面没内容,where也会删除)

select * from tb_brand<where> <if test="status != null"> and status = #{status} </if> <if test="companyName != null"> and company_name like #{companyName} </if> <if test="brandName != null"> and brand_name like #{brandName} </if><where> choose (when, otherwise)

choose有点像 Java 中的 switch 语句。

select *from tb_brand where<choose> <!--类似于switch--> <when test="status !=null"> <!--类似于case--> status= #{status} </when> <when test="companyName != null and companyName !=''"> company_name like #{companyName} </when> <when test="brandName != null and brandName !=''"> brand_name like #{brandName} </when> <otherwise> <!--类似于default--> 1=1 </otherwise></choose>2.添加

要点已给出,具体代码自行完成.(注意这里不用<select>,使用<insert>)

有些人会出现程序运行成功,但数据库中没有数据的情况,是因为mybatis默认开启事务,只需在创建sqlSession时,传入参数true(设置是否自动提交)。或是执行后加上sqlSession.commit();实现手动提交

SqlSession sqlSession = sqlSessionFactory.openSession(true);

添加-主键返回

经常会出现添加数据后需要获取数据对应的主键。

可以使用实体类封装参数(例如此处的Brand brand),然后将获取的主键存放到对象中(然后再访问brand中存放的主键值)。

3.修改3.1 修改全部字段

3.2修改动态字段

注意此处可以用<set>标签代替set。(<set>可以去掉末尾的逗号,如果<set>中没有内容,则不会加上set)

4.删除4.1删除一个

4.2批量删除

注意:mybatis默认会将数组参数封装为一个Map集合。

默认key为“array”,value为数组也可以使用@Param注解改变map集合的默认key的名称(例如:@Param("ids")int[] ids)MyBatis参数传递

MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式(MyBatis提供了ParamNameResolver类来进行参数封装)

如果想要加深理解可以去看源码或视频(源码部分笔记不好写):https://www.bilibili.com/video/BV1Qf4y1T7Hx/?p=59

单个参数:

POJO类型:直接使用,键名和参数占位符名称一致

Map集合:直接使用,键名和参数占位符名称一致

Collection:封装为Map集合,,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",collection集合);

map.put("collection",collection集合);

List:封装为Map集合,,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",list集合);

map.put("collection",list集合);

map.put("list",list集合);

Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",array集合);

map.put("array",array集合);

其他类型(例如int):直接用,#{}中写啥都能接收到

多个参数:封装为Map集合(但不推荐使用默认的,因为可读性差。过段时间再看就不知道传的是什么东西了。建议∶将来都使用@Param注解来修改Map集合中默认的键名(arg)、并使用修改后的名称来获取值,这样可读性更高!

map.put("arg0",参数1)

map.put("arg1",参数2)

map.put("param1",参数1)

map.put("param2",参数2)

---------------------------------(@Param("username")参数1,参数2)

map.put("username",参数1)

map.put("arg1",参数2)

map.put("param1",参数1)

map.put("param2",参数2)

使用注解完成增删改查

使用注解开发会比配置文件开发更加方便(仅针对完成简单的功能)

@Select("select * from tb_user where id = #{id}")public User selectByld(int id);

本文链接地址:https://www.jiuchutong.com/zhishi/309272.html 转载请保留说明!

上一篇:input与print语法(input和printf的区别)

下一篇:请文明学习手语脏话(文明手语动作)

  • 银行共管账户现在可以开设吗
  • 任意盈余公积使用范围
  • 注册资本为0的企业
  • 注销有几种方法
  • 固定资产清理期末可以有余额吗
  • 贷款 保险费
  • 企业进行股票买入的条件
  • 资产的税务处理要注意什么
  • 进口关税专用缴款书怎么做分录
  • 公司注销后如何申请强制执行
  • 耕地占用税完税证明有什么用
  • 特殊建造行业
  • 公益捐款
  • 企业所得税如何缴纳
  • 两年前的发票能开红字发票吗
  • 不开票收入是怎么回事
  • 结转成本计算方法
  • 个税系统怎么查个人申报数据明细
  • 公司注销固定资产如何处理
  • 上缴税金包括什么
  • 往来款项分为哪两类
  • 农机公司也要缴残保金吗
  • 4s店以车换车怎么算的
  • 货物装卸过程中由于操作不当或违反操作规程
  • 生产车间的窗帘怎么处理
  • ghost 安装器
  • 固定资产进项发票
  • 苹果电脑付款方式设置
  • php root
  • 增值税发票超额后税率
  • 银行贷款每个月都要还吗?
  • 外经交的个税如何计算
  • vue运行报错怎么解决
  • php框架运行原理
  • js中...的用法
  • php的foreach
  • 增值税专用发票几个点
  • 金税盘每年服务费
  • 公司安排异地培训
  • 银行转账支付中是什么状态
  • 税控盘开票机号在哪里能查到
  • 盈利和亏损怎么计算
  • 暂估成本账务处理办法
  • 出口货物退运已补税(未退税)证明
  • 处理废旧材料会计分录
  • 普通发票一般几个点
  • 企业收到个体户的普通发票还需要缴纳20%的税吗
  • 契税应该计入税金及附加吗
  • 收到银行手续费发票怎么入账
  • 网店会计做些什么
  • 招聘一年以内
  • 先清卡后报税影响申报吗
  • 开票方与付款方不一致问题
  • 认缴投资额什么意思
  • 出口的样品如何销售
  • 跨境汇款汇错
  • sql server怎么复制表
  • winxp电脑显示器亮度怎么调
  • mac的废纸篓
  • windows8怎么调整亮度
  • aix操作命令
  • win8系统怎么取消屏保
  • xp系统打不开电脑
  • 安装ubuntu后无法进入windows
  • hottray.exe是什么进程 有什么作用 hottray进程查询
  • win10锁屏界面的搜索怎么关
  • 微信小程序倒计时乱跳
  • 怎样关闭android系统的内存不足的系统通知
  • 用python进行翻译
  • 基于javaweb的物流管理系统
  • unity hover
  • javascript sort排序
  • ecmascript6教程
  • python编程入门指南
  • python标准模板库
  • 在jquery中使用什么方法获取和设置属性
  • android零基础入门教程
  • js操作dom节点的方法
  • 发票被暂停了严重吗
  • 计生法废止
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设