什么网站做聚乙烯醇好的,包图网登录入口,中国建设银行招聘官网站,诚信通开了网站谁给做MyBatis 快速入门 前言什么是 MyBatis简介核心特性使用示例配置文件Mapper 接口SQL 映射文件使用 MyBatis 如果大家对以上的导读很懵怎么办#xff01;没关系 往下阅读#xff01; 1. MyBatis 介绍1.1. 什么是MyBatis1.2. 持久层1.3. 框架1.4. JDBC 弊端1.5.… MyBatis 快速入门 前言什么是 MyBatis简介核心特性使用示例配置文件Mapper 接口SQL 映射文件使用 MyBatis 如果大家对以上的导读很懵怎么办没关系 往下阅读 1. MyBatis 介绍1.1. 什么是MyBatis1.2. 持久层1.3. 框架1.4. JDBC 弊端1.5. MyBatis 简化 2. MyBatis 快速入门2.1. 查询user表中所有数据2.2. 解决 SQL 映射文件的警告提示 3. Mapper 代理开发3.1. 目的3.2. 使用 Mapper 代理方式完成入门案例 4. MyBatis 核心配置文件4.1. 类型别名typeAliasess4.2. 数据库配置连接环境信息 5. 配置文件完成增删改查5.1. 准备环境5.1.1. 数据库表 tb_brand5.1.2. 实体类 Brand5.1.3. 测试用例5.1.4. 安装MyBatiisX 插件 5.2. 查询5.2.1. 查询所有数据5.2.2. 查看详情5.2.3. 条件查询1.多条件查询2.多条件-动态条件查询3.单条件-动态条件查询 5.3. 添加5.3.1. 主键返回 5.4. 修改5.4.1. 修改全部字段5.4.2. 修改动态字段 5.5. 删除5.5.1. 删除一个5.5.2. 批量删除 6. 参数传递6.1. 单个参数6.2. 多个参数 7. 注解完成增删改查 前言
跟着B站学黑马mybatis教程全套视频教程2天Mybatis框架从入门到精通
什么是 MyBatis
简介
MyBatis 是一种开源的持久层框架它简化了数据库交互的过程使得与数据库的交互更加灵活和高效。MyBatis 通过将 SQL 语句与 Java 代码进行分离提供了一种直观的、面向对象的数据库访问方式。
核心特性 简化数据库访问MyBatis 使用简单的 XML 或注解配置将 SQL 语句和 Java 对象映射关系定义在配置文件中从而实现了数据操作的解耦。 灵活的 SQL 编写MyBatis 支持使用原生的 SQL 语句可以根据需求编写复杂的查询语句同时也提供了动态 SQL 的功能使得在运行时动态生成 SQL 语句成为可能。 对象关系映射ORM通过配置文件或注解MyBatis 能够将数据库中的记录映射到 Java 对象上实现了对象和数据库表之间的简单映射减少了手动处理数据转换的工作。 缓存机制MyBatis 提供了一级缓存和二级缓存的支持可以提高查询性能避免不必要的数据库交互。 插件机制MyBatis 允许用户编写插件扩展框架的功能例如自定义拦截器来实现日志记录、性能监控等功能。
使用示例
配置文件
!-- mybatis-config.xml --
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis/property nameusername valueroot/property namepassword valuepassword//dataSource/environment/environmentsmappersmapper resourcecom/example/mapper/UserMapper.xml//mappers
/configurationMapper 接口
// UserMapper.java
public interface UserMapper {User getUserById(int id);ListUser getAllUsers();void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}SQL 映射文件
!-- UserMapper.xml --
mapper namespacecom.example.mapper.UserMapperselect idgetUserById resultTypeUser parameterTypeintSELECT * FROM users WHERE id #{id}/selectselect idgetAllUsers resultTypeUserSELECT * FROM users/selectinsert idinsertUser parameterTypeUserINSERT INTO users (id, username, email) VALUES (#{id}, #{username}, #{email})/insertupdate idupdateUser parameterTypeUserUPDATE users SET username#{username}, email#{email} WHERE id#{id}/updatedelete iddeleteUser parameterTypeintDELETE FROM users WHERE id#{id}/delete
/mapper使用 MyBatis
// 使用 MyBatis 进行数据库操作
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession sqlSessionFactory.openSession();UserMapper userMapper sqlSession.getMapper(UserMapper.class);// 查询用户
User user userMapper.getUserById(1);
System.out.println(user);// 查询所有用户
ListUser userList userMapper.getAllUsers();
System.out.println(userList);// 插入用户
User newUser new User(4, NewUser, newuserexample.com);
userMapper.insertUser(newUser);
sqlSession.commit();// 更新用户
User updatedUser new User(4, UpdatedUser, updateduserexample.com);
userMapper.updateUser(updatedUser);
sqlSession.commit();// 删除用户
userMapper.deleteUser(4);
sqlSession.commit();// 关闭会话
sqlSession.close();以上示例演示了 MyBatis 的基本用法通过配置文件定义数据源、Mapper 接口定义数据操作以及 SQL 映射文件将 SQL 语句与 Java 方法进行映射。MyBatis 的灵活性和简洁性使得它成为许多 Java 项目中首选的持久层框架之一。 如果大家对以上的导读很懵怎么办没关系 往下阅读
1. MyBatis 介绍
1.1. 什么是MyBatis
MyBatis 是一款优秀的持久层框架用于简化 JDBC 开发MyBatis 本是 Apache 的一个开源项目 iBatis2010 年这个项目由 apache software foundation 迁移到了 google code并且改名为 MyBatis。2013 年 11 月迁移到 Github官网点击前往
1.2. 持久层
负责将数据到保存到数据库的那一层代码
JavaEE三层架构表现层、业务层、持久层
1.3. 框架
框架就是一个半成品软件是一套可重用的、通用的、软件基础代码模型在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
1.4. JDBC 弊端 1.5. MyBatis 简化 注册驱动——写到配置文件中 SQL硬编码——写到配置文件中
操作繁琐
MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作
来看看对持久层框架优化 2. MyBatis 快速入门
2.1. 查询user表中所有数据
创建user表添加数据创建模块 导入坐标编写MyBatis核心配置文件→替换连接信息解决硬编码问题编写SQL映射文件→统一管理sq|语句解决硬编码问题编码 定义POJO类加载核心配置文件获取SqlSessionFactory 对象获取SqlSession对象执行SQL语句释放资源 1创建 user 表添加数据
create database mybatis;
use mybatis;drop table if exists tb_user;create table tb_user(id int primary key auto_increment,username varchar(20),password varchar(20),gender char(1),addr varchar(30)
);INSERT INTO tb_user VALUES (1, zhangsan, 123, 男, 北京);
INSERT INTO tb_user VALUES (2, 李四, 234, 女, 天津);
INSERT INTO tb_user VALUES (3, 王五, 11, 男, 西安);2创建模块导入坐标 模块创建结束 引入mybatic
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdmybatis-demo/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependencies!--mybatis 依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.5/version/dependency!--mysql 驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.46/version/dependency!--junit 单元测试--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13/versionscopetest/scope/dependency!-- 添加slf4j日志api --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.20/version/dependency!-- 添加logback-classic依赖 --dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency!-- 添加logback-core依赖 --dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.2.3/version/dependency/dependencies/projectlogback.xml
?xml version1.0 encodingUTF-8?
configuration
!-- console表示当前日志信息是可以输出到控制台的--appender nameConsole classch.qos.logback.core.ConsoleAppenderencoderpattern[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n/pattern/encoder/appenderlogger namecom.Carter_x levelDEBUG additivityfalseappender-ref refConsole//logger
/configuration从XML中构建SqlSessionFactory 每个基纡MyBatis的应用都是以一个Sq|SessionFactory的实例为核心的。SqlSessionFactory 的实例可以通过Sq|SessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先配置的Configuration实例来构建出SqlISessionFactory实例。 从XML文件中构建SqlSessionFactory的实例非常简单,建议使用类路径下的资源文件进行配置。但也可以使用任意的输入流 (InputStream) 实例比如用文件路径字符串或fle:// URL构造的输入流。MyBatis 包含一个名叫 Resources的工具类它包含一实用方法使得从类路径或其它位置加载资源文件更加容易。 String resource org/mybatis/example/mybatis-config.xml;
InputStream inputStream Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);3编写 MyBatis 核心 XML 配置文件中包含了对 MyBatis 系统的核心设置包括获取数据库连接实例的数据源DataSource以及决定事务作用域和控制方式的事务管理器TransactionManager。后面会再探讨 XML 配置文件的详细内容这里先给出一个简单的示例 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationtypeAliasespackage namecom.itheima.pojo//typeAliases!--environments配置数据库连接环境信息。可以配置多个environment通过default属性切换不同的environment--environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLED!--数据库连接信息--property namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql:///mybatis?useSSLfalse/property nameusername valueroot/property namepassword value123456//dataSource/environmentenvironment idtesttransactionManager typeJDBC/dataSource typePOOLED!--数据库连接信息--property namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql:///mybatis?useSSLfalse/property nameusername valueroot/property namepassword value1234//dataSource/environment/environmentsmappers!--加载sql映射文件--!-- mapper resourcecom/itheima/mapper/UserMapper.xml/--!--Mapper代理方式--package namecom.itheima.mapper//mappers
/configuration4编写 SQL 映射文件统一管理 sql 语句解决编码问题
探究已映射的 SQL 语句 现在你可能很想知道 SqlSession 和 Mapper 到底具体执行了些什么操作但 SQL 语句映射是个相当广泛的话题可能会占去文档的大部分篇幅。 但为了让你能够了解个大概这里先给出几个例子。
在上面提到的例子中一个语句既可以通过 XML 定义也可以通过注解定义。我们先看看 XML 定义语句的方式事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis你应该对这个概念比较熟悉。 但相比于之前的版本新版本改进了许多 XML 的配置后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例它应该可以满足上个示例中 SqlSession 的调用。
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace:名称空间
--mapper namespacecom.itheima.mapper.UserMapper!--statement--select idselectAll resultTypeuserselect * from tb_user;/select
!-- select idselectById resultTypeuserselect *from tb_user where id #{id};/select--select idselect resultTypeuserselect *from tb_userwhereusername #{arg0}and password #{param2}/select/mapper5编码 5-1. 定义 POJO 类
package com.itheima.pojo;// alt 鼠标左键 整列编辑
public class User {private Integer id;private String username;private String password;private String gender;private String addr;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 String getGender() {return gender;}public void setGender(String gender) {this.gender gender;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr addr;}Overridepublic String toString() {return User{ id id , username username \ , password password \ , gender gender \ , addr addr \ };}
}
5-2. 加载核心配置文件获取 SqlSessionFactory 对象
//1. 获取SqlSessionFactory
String resource mybatis-config.xml;
InputStream inputStream Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);5-3. 获取 SqlSession 对象执行 SQL 语句
public class App
{public static void main( String[] args ) throws IOException {//1. 获取SqlSessionFactoryString resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession sqlSessionFactory.openSession();ListUser users sqlSession.selectList(test.selectAll);System.out.println(users);//5. 释放资源sqlSession.close();}
}5-4. 释放资源
//5. 释放资源
sqlSession.close();2.2. 解决 SQL 映射文件的警告提示 产生原因Idea 和数据库没有建立连接不识别表信息解决方式在 Idea 中配置 MySQL 数据库连接 3. Mapper 代理开发
3.1. 目的
ListUser users sqlSession.selectList(test.selectAll);test.selectAll 又写si了…
解决原生方式中的硬编码简化后期执行 SQL 3.2. 使用 Mapper 代理方式完成入门案例
定义与SQL映射文件同名的Mapper接口 并且将Mapper接口和SQL映射文件放置在同一目录下设置SQL映射文件的namespace属性为Mapper接口全限定名在Mapper接口中定义方法方法名就是SQL映射文件中sq|语句的id,并保持参数类型和返回值类型一致编码 通过SqlSession 的getMapper方法获取Mapper接口的代理对象调用对应方法完成sq的执行 1.定义与 SQL 映射文件同名的 Mapper 接口并且将 Mapper 接口和 SQL 映射文件放置在同一目录下 不方便管理 要配置文件与代码 分开那怎么办啊
那我是不是只需要建立相同层级
——注意Mapper文件的包容易出错建包时可写成 com/itheima/mapper 但是 现在我们显示的还是 我们把xml文件拖进来
编译我们发现确实在一起了 2.设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名
3.在 Mapper 接口中定义方法方法名就是 SQL 映射文件中sql语句的 id并保持参数类型和返回值类型一致 4.编码
通过 SqlSession 的 getMapper 方式获取 Mapper 接口的代理对象调用对应方法完成 sql 的执行
public class App
{public static void main( String[] args ) throws IOException {//1. 获取SqlSessionFactoryString resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession sqlSessionFactory.openSession();//3. 获取Mapper接口的代理对象UserMapper uesrmapper sqlSession.getMapper(UserMapper.class);ListUser users uesrmapper.selectAll();System.out.println(users);//5. 释放资源sqlSession.close();}
}
包扫描 到现在位置 UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace:名称空间
--mapper namespaceorg.example.mapper.UserMapper!--statement--select idselectAll resultTypeorg.example.pojo.Userselect * from tb_user;/select/mapper
mybatis-config.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationtypeAliasespackage nameorg.example.pojo//typeAliases!--environments配置数据库连接环境信息。可以配置多个environment通过default属性切换不同的environment--environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLED!--数据库连接信息--property namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql:///mybatis?useSSLfalse/property nameusername valueroot/property namepassword value1186981212xxx!//dataSource/environmentenvironment idtesttransactionManager typeJDBC/dataSource typePOOLED!--数据库连接信息--property namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql:///mybatis?useSSLfalse/property nameusername valueroot/property namepassword value1186981212xxx!//dataSource/environment/environmentsmappers!--加载sql映射文件--
!-- mapper resourceUserMapper.xml/--!--Mapper代理方式--package nameorg.example.mapper//mappers
/configuration
UserMapper.java
package org.example.mapper;import org.example.pojo.User;import java.util.List;public interface UserMapper {ListUser selectAll();
}
pom.xml
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdmybatistest/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packagingnamemybatistest/nameurlhttp://maven.apache.org/urlpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.5/version/dependency!--mysql 驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.46/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependency!-- 添加slf4j日志api --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.20/version/dependency!-- 添加logback-classic依赖 --dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency!-- 添加logback-core依赖 --dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.2.3/version/dependency/dependencies
/project
logback.xml
?xml version1.0 encodingUTF-8?
configuration!-- console表示当前日志信息是可以输出到控制台的--appender nameConsole classch.qos.logback.core.ConsoleAppenderencoderpattern[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n/pattern/encoder/appenderlogger namecom.Carter_x levelDEBUG additivityfalseappender-ref refConsole//logger
/configurationUser.java
package org.example.pojo;public class User {private Integer id;private String username;private String password;private String gender;private String addr;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 String getGender() {return gender;}public void setGender(String gender) {this.gender gender;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr addr;}Overridepublic String toString() {return User{ id id , username username \ , password password \ , gender gender \ , addr addr \ };}
}App.java
package org.example;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.example.mapper.UserMapper;
import org.example.pojo.User;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Hello world!**/
public class App
{public static void main( String[] args ) throws IOException {//1. 获取SqlSessionFactoryString resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession sqlSessionFactory.openSession();//3. 获取Mapper接口的代理对象UserMapper uesrmapper sqlSession.getMapper(UserMapper.class);ListUser users uesrmapper.selectAll();System.out.println(users);//5. 释放资源sqlSession.close();}
} 4. MyBatis 核心配置文件
配置 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下
configuration配置 properties属性settings设置typeAliases类型别名typeHandlers类型处理器objectFactory对象工厂plugins插件environments环境配置 environment环境变量 transactionManager事务管理器dataSource数据源 databaseIdProvider数据库厂商标识mappers映射器
官网点击前往
注意配置各个标签需要遵循前后顺序
4.1. 类型别名typeAliasess typeAliasespackage nameorg.example.pojo//typeAliases相当于 给POJO下的实体类起了个别名 默认的情况下 就是 类本身的名不区分大小写 且不用带包 细节:配置各个标签时需要遵守前后顺序 4.2. 数据库配置连接环境信息 5. 配置文件完成增删改查 5.1. 准备环境
数据库表tb brand实体类Brand测试用例安装MyBatisX插件
5.1.1. 数据库表 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;5.1.2. 实体类 Brand
package org.example.pojo;public class Band {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态0禁用 1启用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 };}
}当前的层级关系 5.1.3. 测试用例 我直接再主函数里写就好
5.1.4. 安装MyBatiisX 插件
MybatisX是一款基于IDEA的快速开发插件,为效率而生。主要功能: XML和接口方法相互跳转.根据接口方法生成 statement 安装: MyBatis 本身是一个用于在 Java 中进行持久性数据访问的开源框架。如果 “MyBatiisX” 是 MyBatis 的插件那么安装它可能会带来一些好处具体取决于该插件提供的功能。
一般来说MyBatis 插件可以提供以下一些好处 增强功能 插件可以扩展或增强 MyBatis 的功能为开发人员提供更多的选项和工具来简化开发过程。 性能优化 一些插件可能专注于提高 MyBatis 的性能通过优化查询或缓存策略以提高应用程序的响应速度。 简化配置 插件可能提供一些简化配置的功能使得在使用 MyBatis 的过程中更加方便。 集成其他技术 插件可以用于集成其他技术或框架使得 MyBatis 能够更好地与其他组件协同工作。 代码生成 一些插件可能提供代码生成的功能可以减少手动编写重复性代码的工作。
请注意具体的好处取决于插件的具体功能和你的项目需求。在考虑安装任何插件之前建议查看插件的文档了解它提供了什么功能以及它是否适合你的项目。此外插件的稳定性、维护情况以及社区支持也是考虑的因素之一。 5.2. 查询
5.2.1. 查询所有数据 编写接口方法: Mapper接口 参数:无结果: List BrandListBrand selectAll(); 编写SQL语句: SQL映射文件
select idselectAll resultTypebrandselect * from tb_brand;
/select执行方法测试
package org.example;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.example.mapper.UserMapper;
import org.example.pojo.Brand;
import org.example.pojo.User;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Hello world!**/
public class App
{public static void main( String[] args ) throws IOException {//1. 获取SqlSessionFactoryString resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession sqlSessionFactory.openSession();//3. 获取Mapper接口的代理对象UserMapper uesrmapper sqlSession.getMapper(UserMapper.class);ListBrand brands uesrmapper.selectAll();System.out.println(brands);//5. 释放资源sqlSession.close();}
} package org.example.pojo;public class Brand {// id 主键private Integer id;// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态0禁用 1启用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 };}
}怎么办
属性名与列名不一致
1起别名在 SQL 语句中对不一样的类名起别名别名与实体类属性名一样。可以定义 sql 片段提升复用性。
!-- * 起别名对不一样的列名起别名让别名和实体类的属性名一样* 缺点每次查询都要定义一次别名
* sql片段* 缺点不灵活
--
!-- sql片段 --sql idbrand_columnid, brand_name as brandName, company_name as companyName, ordered, description, status/sqlselect idselectAll resultTypebrandselectinclude refidbrand_column /from tb_brand;/select2resultMap定义了 resultMap 完成不一致的属性名和列名的映射。
!--id唯一标识type映射的类型支持别名
--resultMap idbrandResultMap typebrand!--id完成主键字段的映射column表的列名property实体类的属性名result完成一般字段的映射column表的列名property实体类的属性名--result columnbrand_name propertybrandName/result columncompany_name propertycompanyName/
/resultMapselect idselectAll resultMapbrandResultMapselect *from tb_brand;
/select5.2.2. 查看详情
编写接口方法: Mapper接口 参数: id结果: BrandBrand selectByld(int id); 编写SQL语句: SQL 映射文件 select idselectById parameterTypeint resultTypebrandselect * from tb_brand where id #{id};/select执行方法测试
package org.example.mapper;import org.example.pojo.Brand;import java.util.List;public interface UserMapper {ListBrand selectAll();Brand selectById(int id);
}
package org.example;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.example.mapper.UserMapper;
import org.example.pojo.Brand;
import org.example.pojo.User;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Hello world!**/
public class App
{public static void main( String[] args ) throws IOException {//1. 获取SqlSessionFactoryString resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession sqlSessionFactory.openSession();//3. 获取Mapper接口的代理对象UserMapper uesrmapper sqlSession.getMapper(UserMapper.class);//4. 执行方法Brand brand uesrmapper.selectById(1);System.out.println(brand);//5. 释放资源sqlSession.close();}
} 使用细节 参数占位符: 1) #{}: 执行SQL时会将#{}占位符替换为?,将来自动设置参数值 ${}: 拼SQL。会存在SQL注入问题 使用时机: 参数传递都使用#{}如果要对表名、列名不固定 进行动态设置只能使用${}进行sq|拼接。 parameterType: 用于设置参数类型该参数可以省略 SQL语句中特殊字符处理: 转义字符lt ![CDATA[内容]]: CD提示 5.2.3. 条件查询
1.多条件查询
编写接口方法: Mapper接口 参数:所有查询条件结果: List Brand
ListBrand selectByCondition(Param(status)int status, Param(companyName) String companyName, Param(brandName) String brandName);
ListBrand selectByCondition(Brand brand);
ListBrand selectByCondition(Map map);编写SQL语句: SQL映射文件执行方法测试
select idselectByCondition resultMapbrandResultMapselect *from tb brandwherestatus #{status}and company_ name like #{companyName}and brand_ name like #{brandName}
/selectSQL 语句设置多个参数的三种方式
1散装参数需要使用 Param SQL 中的参数占位符名称
ListBrand selectByCondition(Param(status) int status, Param(companyName) String companyName, Param(brandName) String brandName);2实体类封装参数只需要保证 SQL 中的参数名和实体类属性名对应上即可设置成功
ListBrand selectByCondition(Brand brand);3map 集合只需要保证 SQL 中的参数名和 map 集合的键的名称对应上即可设置成功
ListBrand selectByConditionSingle(Brand brand);测试代码 MyBatisTest
Testpublic void testSelectByCondition() throws IOException {//接收参数int status 1;String companyName 华为;String brandName 华为;// 处理参数companyName % companyName %;brandName % brandName %;//封装对象/* Brand brand new Brand();brand.setStatus(status);brand.setCompanyName(companyName);brand.setBrandName(brandName);*/Map map new HashMap();// map.put(status , status);map.put(companyName, companyName);// map.put(brandName , brandName);//1. 获取SqlSessionFactoryString 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. 执行方法//ListBrand brands brandMapper.selectByCondition(status, companyName, brandName);
// ListBrand brands brandMapper.selectByCondition(brand);ListBrand brands brandMapper.selectByCondition(map);System.out.println(brands);//5. 释放资源sqlSession.close();}2.多条件-动态条件查询 动态 SQL 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架你应该能理解根据不同条件拼接 SQL 语句有多痛苦例如拼接时要确保不能忘记添加必要的空格还要注意去掉列表最后一个列名的逗号。利用动态 SQL可以彻底摆脱这种痛苦。 使用动态 SQL 并非一件易事但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言MyBatis 显著地提升了这一特性的易用性。 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式MyBatis 3 替换了之前的大部分元素大大精简了元素种类现在要学习的元素种类比原来的一半还要少。 ifchoose (when, otherwise)trim (where, set)foreach
!--动态条件查询* if: 条件判断* test逻辑表达式* 问题* 恒等式 where 1 1* where 替换 where 关键字--select idselectByCondition resultMapbrandResultMapselect *from tb_brand/* where 1 1*/whereif teststatus ! nulland status #{status}/ifif testcompanyName ! null and companyName ! and company_name like #{companyName}/ifif testbrandName ! null and brandName ! and brand_name like #{brandName}/if/where/selectwhere 就是我们之前说的到的 可以灵活的去掉and 3.单条件-动态条件查询 select idselectByConditionSingle resultMapbrandResultMapselect *from tb_brandwherechoose!--相当于switch--when teststatus ! null!--相当于case--status #{status}/whenwhen testcompanyName ! null and companyName ! !--相当于case--company_name like #{companyName}/whenwhen testbrandName ! null and brandName ! !--相当于case--brand_name like #{brandName}/when/choose/where/select5.3. 添加 5.3.1. 主键返回 返回添加主键返回
insert useGeneratedKeystrue keyPropertyidinsert idaddOrderltem insert into tb_order_item (goods_name, goods_price, count,order_id)values (#{goodsName}, #{goodsPrice},#{count}, #{orderld});/insert生成了 但是没有绑定到对象上面
insert idaddOrder useGeneratedKeystrue keyPropertyidinsert into tb_order (payment, payment_type, status)Ivalues (#{payment},#{paymentType},#{status});
/insert5.4. 修改
5.4.1. 修改全部字段 编写接口方法: Mapper接口 参数:所有数据结果: voidvoid update(Brand brand); 编写SQL语句: SQL映射文件 执行方法测试
update idupdateupdate tb_brandset brand_name #{brandName},company_name #{companyName},ordered #{ordered},description #{description},status #{status}where id #{id};
/update5.4.2. 修改动态字段 编写接口方法: Mapper接口 参数:部分数据封装到对象中结果: void 编写SQL语句: SQL映射文件执行方法测试
update idupdateupdate tb_usersetusername #{username},password #{password},gender #{gender},addr #{addr}whereid #{id}
/update不能用到通用性因为只能全改 否则就是赋值成null了 到
update idupdateupdate tb_brandsetif testbrandName ! null and brandName ! brand_ name #{brandName},/ifif testcompanyName ! null and companyName !company_ name #{companyName},/ifif testordered ! nullordered #{ordered},/ifif testdescription ! null and description !description #{description},/ifif teststatus ! nullstatus #{status},/if/setwhere id #{id};
/update5.5. 删除
5.5.1. 删除一个 编写接口方法: Mapper接口 参数: id结果: voidvoid deleteByld(int id); 编写SQL语句: SQL映射文件 执行方法测试
delete iddeleteBylddelete from tb_brand where id #{id}
/delete5.5.2. 批量删除 编写接口方法: Mapper接口 参数: id数组结果: voidvoid deleteBylds(Param(ids) int[] ids); 编写SQL语句: SQL映射文件执行方法测试
delete iddeleteByldsdelete from tb_brandwhere id in (?,?,?)
/delete不知道用几个问号啊 所以要动态
!--mybatis会将数组参数封装为一个Map集合。* 默认array 数组* 使用Param注解改变map集合的默认key的名称--delete iddeleteByIdsdelete from tb_brand where idinforeach collectionarray itemid separator, open( close)#{id}/foreach;/delete6. 参数传递 建议将来都使用 Param 注解来修改 Map 集合中默认的键名并使用修改后的名称获取值这样可读性更高
6.1. 单个参数
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,数组);
map.put(array,数组);其他类型直接使用 6.2. 多个参数
多封装为Map集合,可以使用Param注解替换Map集合中默认的arg键名
map.put(arg0,参数值1)map.put(param1,参数值1)map.put(param2,参数值2)map.put(agr1,参数值2)---------------Param(username)map.put(username,参数值1)map.put(param1,参数值1)map.put(param2,参数值2)map.put(agr1,参数值2)7. 注解完成增删改查
使用注解开发会比配置文件开发更加方便
写了注解 就不需要写xml的配置文件了
Select(select * from tb_user where id #{id})
public User selectByld(int id);查询: Select添加: Insert修改: Update删除:Delete
提示:
注解完成简单功能配置文件完成复杂功能 ;
使用注解来映射简单语句会使代码显得更加简洁但对于稍微复杂一点的语句 Java 注解不仅力不从心还会让你本就复杂的SQL语句更加混乱不堪。因此, 如果你需要做一些很复杂的操作, 最好用XML来映射语句。
选择何种方式来配置映射以及认为是否应该要统映射语句定义的形式完全取决于你和你的团队。换句话说永远不要拘泥于一种方式 你可以很轻松的在基于注解和XML的语句映射方式间自由移植和切换。