MyBatis
笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
视频教程(P47~P60)
看前提醒:如果之前学过一些框架,只想知道mybatis怎么用,那么就不太建议看任何第三方教程,更建议直接去看官方文档,从入门到具体配置都有。如果之前没学过框架,也建议先试着去看,实在不行再继续看博客或教学视频内容。(官方文档不跟你废话,内容更加精炼)
什么是MyBatis?
- MyBatis是一款优秀的持久层框架,用于简化JDBC开发
- MyBatis本是Apache<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>的一个开源项目iBatis,<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>2010年这个项目由apache<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>softwarefoundation迁移到了google<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>code,并且改名为MyBatis。2013年11月迁移到Github
- MyBatis官方参考文档(有中文,必看):<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>https://mybatis.org/mybatis-3/zh/index.html
持久层
- 负责将数据到保存到数据库的那一层代码
- JavaEE三层架构:表现层、业务层、持久层
框架
- 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
JDBC缺点
- 硬编码(不方便设置修改<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>数据库连接和sql语句,不便于后期维护)
- 操作繁琐(很多参数需要手动设置,需要手动封装结果集)
MyBatis简化
- 硬编码<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>→<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>配置文件
- 操作繁琐<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>→MyBatis辅助,简化代码
MyBatis快速入门
参考网站:https://mybatis.org/mybatis-3/zh/getting-started.html
查询user表中所有数据
- 创建user表,添加数据
- 创建模块,导入坐标(建议先去学习maven基础)
- 编写MyBatis核心配置文件-->替换连接信息解决硬编码问题
- 编写SQL映射文件-->统一管理sql语句,解决硬编码问题
- 编码
- 定义POJO类
- 加载核心配置文件,获取<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>SqlSessionFactory<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>对象
- 获取SqISession对象,执行SQL语句
- 释放资源
具体操作
- 在mysql中创建数据表(直接用,没必要手敲)(我用的mysql-5.7.38)
- DROP<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>TABLE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>IF<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>EXISTS<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`t_user`;
- CREATE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>TABLE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`t_user`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>(
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`id`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>int(11)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NOT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>AUTO_INCREMENT,
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`username`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>varchar(20)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>CHARACTER<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SET<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>COLLATE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8_general_ci<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>DEFAULT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL,
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`password`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>varchar(20)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>CHARACTER<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SET<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>COLLATE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8_general_ci<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>DEFAULT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL,
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`age`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>int(11)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>DEFAULT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL,
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`gender`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>char(1)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>CHARACTER<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SET<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>COLLATE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8_general_ci<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>DEFAULT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL,
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`email`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>varchar(50)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>CHARACTER<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SET<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>COLLATE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8_general_ci<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>DEFAULT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>NULL,
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>PRIMARY<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>KEY<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>(`id`)<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>USING<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>BTREE
- )<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>ENGINE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>InnoDB<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>AUTO_INCREMENT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>5<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>CHARACTER<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SET<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>COLLATE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>utf8_general_ci<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>ROW_FORMAT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>Dynamic;
- INSERT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>INTO<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`t_user`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>VALUES<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>(1,<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'admin',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'123456',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>23,<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'男',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'12345@qq.com');
- INSERT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>INTO<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`t_user`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>VALUES<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>(2,<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'root',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'123',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>23,<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'男',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'12345@qq.com');
- INSERT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>INTO<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>`t_user`<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>VALUES<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>(4,<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'admin2',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'123456',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>23,<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'男',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>'12345@qq.com');
复制代码 - 创建模块,导入坐标(考虑到某些人没学过maven,这里步骤比较详细。但还是建议先去看maven入门,要不了多少时间。)
IDEA界面中:左上角<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>File(文件)-->New(新建)-->Project...(项目)
选择maven
可以看到生成的结构
将以下内容放到pom.xml中(需要注意依赖、mysql驱动版本)在resources文件夹中创建文件log4j.xml,并且写入以下内容(内容固定,拿来用就行,不需要背) - 编写MyBatis核心配置文件
在resources中创建文件mybatis-config.xml,并写入以下内容(需要根据自己数据库修改部分内容): - 编写SQL映射文件
在resources文件夹中创建sql映射文件mybatis-config.xml(可以根据自己需求命名):- <?xml<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>version="1.0"<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>encoding="UTF-8"<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>?>
- <!DOCTYPE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>mapper
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>PUBLIC<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>"-//mybatis.org//DTD<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>Mapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>3.0//EN"
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>namespace="test">
-
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><select<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>id="selectAll"<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>resultType="com.atguigu.pojo.User">
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>select<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>from<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>t_user
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases></select>
- </mapper>
复制代码 在java文件夹中创建类com.atguigu.pojo.User<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>(存放查询数据库时所返回的数据) - 编码
在java文件夹中创建类com.atguigu.MyBatisDemo<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>,内容如下(不要背,只需要理解每一步的作用):运行MyBatisDemo。出现以下内容则成功
虽然相对于学习JDBC时只是在一个文件中操作而言,看起来似乎更加麻烦,但是也需要考虑实际开发中代码量大和后续维护困难程度的问题。
Mappr代理开发
- List<User><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>users<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>sqlSession.selectList("test.selectAll");
复制代码 你可能会注意到,这种方式和用全限定名调用<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Java<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>对象的方法类似。这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>select<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>语句匹配到对应名称、参数和返回类型的方法。因此你就可以像上面那样,不费吹灰之力地在对应的映射器接口调用方法,就像下面这样:- UserMapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>userMapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>sqlSession.getMapper(UserMapper.class);
- List<User><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>users<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>userMapper.selectAll();
复制代码 第二种方法有很多优势,首先它不依赖于字符串字面值,会更安全一点;其次,如果你的<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>IDE<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>有代码补全功能,那么代码补全可以帮你快速选择到映射好的<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>SQL<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>语句。
使用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><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>selectAll();
复制代码
修改mybatis配置文件中的sql映射文件的新的路径- [/code][img]https://img2023.cnblogs.com/blog/2592433/202301/2592433-20230108193349958-382885218.png[/img]
- [*]编码
- [list=1]
- [*]通过SqlSession的<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>getMapper方法获取Mapper接口的代理对象
- [*]调用对应方法完成sql的执行
- [/list][code]//获取UserMapper接口的代理对象UserMapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>userMapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>sqlSession.getMapper(UserMapper.class);
- List<User><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>users<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>userMapper.selectAll();
复制代码
细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
方法如下:
修改mybatis配置文件mybatis-config.xml中下的内容- <mappers>
- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>
- <package<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>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的中加入下面的内容:- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>
复制代码
后面需要使用com.atguigu.pojo中的类时就只需要写类名,前面不需要附加包名。例如包中的User类:
当然,也可以对每个类进行单独的配置。但一般不使用那种方式。如想了解可以自行去官网查找。
细节:配置各个标签时,需要遵守下列的前后顺序(必须遵守,否则会报错)
配置文件完成增删改查
完成品牌数据的增删改查操作
产品原型地址:
https://www.pmdaniu.com/storages/122645/74ccff58678d80583ea43a55547173eb-1818/电商后台高保真原型(首页).html
- 要完成的功能列表清单:
- 查询
查询所有数据
查看详情
条件查询
- 添加
- 修改
修改全部字段
修改动态字段
- 删除
删除一个
批量删除
准备环境
①数据库表tb_brand- --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>删除tb_brand表drop<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>table<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>if<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>exists<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand;--<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>创建tb_brand表create<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>table<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand( --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>id主键 id<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>int<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>primary<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>key<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>auto_increment, --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>品牌名称 brand_name<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>varchar(20), --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>企业名称 company_name<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>varchar(20), --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>排序字段 ordered<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>int, --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>描述信息 description<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>varchar(100), --<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>状态∶0:禁用1∶启用 status<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>int);--<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>添加数据insert<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>into<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>(brand_name,company_name,ordered,description,status)values<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>('三只松鼠','三只松鼠股份有限公司',5,'好吃不上火',0), ('华为','华为技术有限公司',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>100,'华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界',1), ('小米','小米科技有限公司',50,'are<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>you<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>ok',<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>1);SELECT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>FROM<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand;
复制代码 ②实体类Brand(放在main/java文件夹下,位置看package)后续如果不想写数据库表对应的实体类,也可以使用自动生成,(再根据实际需求进行修改):
先连接数据库(右侧的<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Database(数据库)<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>→"+"→Data<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Source(数据源)→MySQL→配置好数据库信息→OK)
创建实体类(也可以使用之前配置好<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases><typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases><typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>右侧的<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Database(数据库)→schemas→找到表名右键→Scripted<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Extensions(脚本扩展)→Generate<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>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和接口方法相互跳转(通过点击代码区域左侧的鸟)
根据接口方法生成statement(配置文件中写sql语句的位置)
如果在接口中创建方法,但没写对应的配置文件会出现如下报错(如果不安装这个插件则不会出现):
Alt+Enter<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>它可以帮你在配置文件中帮你定义好对应的结构(事先必须要创建配置文件,它不能帮你创建)
框出的内容为它生成的(只需要手动加上sql语句)
如果写sql语句时没提示可以在<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>设置中→搜索SQL<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Dialects(SQL方言)→Global<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>SQL<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Dialect(全局SQL方言)设置为MySQL
1.<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>查询
1.1查询所有数据
和入门案例类似,以下为基本要点(一定要自己上手,可以复制之前写的代码再修改)
代码参考:- package<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>com.atguigu.mapper;import<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>com.atguigu.pojo.Brand;import<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>java.util.List;public<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>interface<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>BrandMapper<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>{<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>List<User><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>selectAll();}
复制代码- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SELECT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>FROM<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>
复制代码 运行结果:
这里可以看到<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>brandName和companyName并没有获取到数据。是因为数据库中(brand_name,company_name)和实体类字段名称(<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>brandName,companyName)不一样,对不上。需要手动设置。
方法一<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>起别名:修改sql语句,对不一样的列名起别名,让别名和实体类的属性名一样(缺点:每次查询都要定义一次别名。不推荐)
方法二<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>resultMap(结果映射):
- 定义标签
- 在标签中使用resultMap属性替换resultType属性
具体修改如下所示(注意看我的注释):现在就能正常显示了
1.2查看详情
注意其中配置文件中的#{id}与方法中的id对应,为用作传递参数的参数占位符。
参数占位符:
- #{}:会将其替换为?,为了防止SQL注入。(详细情况我在JDBC中的Statement部分内容有说明)
- ${}:拼接SQL。会存在SQL注入问题。(尽量不用)
- 使用时机:
- 参数传递的时候:#{}
- 表名或者列名不固定的情况下:${}会存在SQL注入问题
注意特殊字符需要特地处理:
例如select<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>*<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>from<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>tb_brand<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>where<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>id</ol>1.3条件查询
条件查询中经常会出现传入多个参数的情况,此时就不能只用之前的传参方式了(因为不知道怎么匹配)。
处理方法是在接口中对应方法处指出对应关系。
方式如下,主要内容已经给出(不难,我就不粘贴完整代码了,自己完成)
SQL语句设置多个参数的三种方式
- 散装参数:需要使用@Param("SQL中的参数占位符名称")
@Param("配置文件中的标识")形参(例如:@Param("status")int<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>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<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>对动态SQL有很强大的支撑,利用下列标签可以实现动态SQL:
if
choose<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>(when,<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>otherwise)
trim<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>(where,<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>set)
foreach
if
用于判断参数是否有值,使用test属性进行条件判断
使用动态<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>SQL<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>最常见情景是根据条件包含<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>where<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>子句的一部分。比如:- <typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>SELECT<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>FROM<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>WHERE<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>id<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>1<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>AND<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>status<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{status}<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>
复制代码 对于之前的题目,就能利用if判断是否有值来执行动态的SQL语句。
但是对于存在多个搜索条件的情况下,则会出现一些问题。例如:- #<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>第一个条件不需要逻辑运算符and,or等连接select<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>from<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>wherestatus<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{status}and<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>company_name<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>like<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{companyName}and<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>brand_name<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>like<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{brandName}
复制代码 对于上面的sql语句,转换为动态SQL,需要进行针对性的处理。对此有两种方法:
- 使用恒等式(加入1=1)(仅需了解,实际情况尽量不用或少用)
- select<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>from<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_brand<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>where<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>1=1<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>and<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>status<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{status}<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>and<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>company_name<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>like<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{companyName}<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases><typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>and<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>brand_name<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>like<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{brandName}
复制代码 - 使用替换where关键字(where标签很智能,如果where后面跟的有and,会自动删除。如果where后面没内容,where也会删除)
choose<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>(when,<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>otherwise)
choose有点像<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>Java<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>中的<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>switch<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>语句。2.添加
要点已给出,具体代码自行完成.(注意这里不用,使用)
有些人会出现程序运行成功,但数据库中没有数据的情况,是因为mybatis默认开启事务,只需在创建sqlSession时,传入参数true(设置是否自动提交)。或是执行后加上sqlSession.commit();实现手动提交- SqlSession<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>sqlSession<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>sqlSessionFactory.openSession(true);
复制代码 添加-主键返回
经常会出现添加数据后需要获取数据对应的主键。
可以使用实体类封装参数(例如此处的Brand<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>brand),然后将获取的主键存放到对象中(然后再访问brand中存放的主键值)。
3.修改
3.1<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>修改全部字段
3.2修改动态字段
注意此处可以用标签代替set。(可以去掉末尾的逗号,如果中没有内容,则不会加上set)
4.删除
4.1删除一个
4.2批量删除
注意:mybatis默认会将数组参数封装为一个Map集合。
- 默认key为“array”,value为数组
- 也可以使用@Param注解改变map集合的默认key的名称(例如:@Param("ids")int[]<typeAliases>
<package name="com.atguigu.pojo"/>
</typeAliases>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<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>*<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>from<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>tb_user<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>where<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>id<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>=<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>#{id}")public<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>User<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>selectByld(int<typeAliases>
- <package name="com.atguigu.pojo"/>
- </typeAliases>id);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |