笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
看前提醒:如果之前学过一些框架,只想知道mybatis怎么用,那么就不太建议看任何第三方教程,更建议直接去看官方文档,从入门到具体配置都有。如果之前没学过框架,也建议先试着去看,实在不行再继续看博客或教学视频内容。(官方文档不跟你废话,内容更加精炼)
什么是MyBatis?
持久层
框架
JDBC缺点
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时只是在一个文件中操作而言,看起来似乎更加麻烦,但是也需要考虑实际开发中代码量大和后续维护困难程度的问题。
List<User> users = sqlSession.selectList("test.selectAll");
你可能会注意到,这种方式和用全限定名调用 Java 对象的方法类似。这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的 select 语句匹配到对应名称、参数和返回类型的方法。因此你就可以像上面那样,不费吹灰之力地在对应的映射器接口调用方法,就像下面这样:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
第二种方法有很多优势,首先它不依赖于字符串字面值,会更安全一点;其次,如果你的 IDE 有代码补全功能,那么代码补全可以帮你快速选择到映射好的 SQL 语句。
定义与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"/>

编码
//获取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>
我只会介绍一些重要的部分,不可能都讲完。详细的可以去官网。
官方文档(如果需要详细了解就必须去看):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类:
当然,也可以对每个类进行单独的配置。但一般不使用那种方式。如想了解可以自行去官网查找。
细节:配置各个标签时,需要遵守下列的前后顺序(必须遵守,否则会报错)
产品原型地址:
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;} @Override public 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和接口方法相互跳转(通过点击代码区域左侧的鸟)
根据接口方法生成statement(配置文件中写sql语句的位置)
如果在接口中创建方法,但没写对应的配置文件会出现如下报错(如果不安装这个插件则不会出现):
Alt+Enter 它可以帮你在配置文件中帮你定义好对应的结构(事先必须要创建配置文件,它不能帮你创建)
框出的内容为它生成的(只需要手动加上sql语句)
如果写sql语句时没提示可以在 设置中→搜索SQL Dialects(SQL方言)→Global SQL Dialect(全局SQL方言)设置为MySQL

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

代码参考:
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>现在就能正常显示了

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

//测试方法
@Test
public 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();
}

参数占位符:
注意特殊字符需要特地处理:
例如select * from tb_brand where id<3;由于是在xml文件中“<”不能被正常识别。
转义字符
< 改为 <
CDATA区(输入CD会出现提示)
<![CDATA[ < ]]>

条件查询中经常会出现传入多个参数的情况,此时就不能只用之前的传参方式了(因为不知道怎么匹配)。
处理方法是在接口中对应方法处指出对应关系。
方式如下,主要内容已经给出(不难,我就不粘贴完整代码了,自己完成)

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
官方教程:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL
MyBatis 对动态SQL有很强大的支撑,利用下列标签可以实现动态SQL:
if
choose (when, otherwise)
trim (where, set)
foreach
用于判断参数是否有值,使用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 where
status = #{status}
and company_name like #{companyName}
and brand_name like #{brandName}
对于上面的sql语句,转换为动态SQL,需要进行针对性的处理。对此有两种方法:
使用恒等式(加入1=1)(仅需了解,实际情况尽量不用或少用)
select * from tb_brand where
1=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>
使用
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有点像 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>
要点已给出,具体代码自行完成.(注意这里不用<select>,使用<insert>)

有些人会出现程序运行成功,但数据库中没有数据的情况,是因为mybatis默认开启事务,只需在创建sqlSession时,传入参数true(设置是否自动提交)。或是执行后加上sqlSession.commit();实现手动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
添加-主键返回
经常会出现添加数据后需要获取数据对应的主键。
可以使用实体类封装参数(例如此处的Brand brand),然后将获取的主键存放到对象中(然后再访问brand中存放的主键值)。


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



注意:mybatis默认会将数组参数封装为一个Map集合。
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);

基于Spring注解+MyBatis+Servlet实现数据库交换的小小Demo第一步创建web项目,这一步省略,有不会的可以参考之前发布的文档第二步配置pom.xml文件dependencies>dependency>groupId>org.springframeworkgroupId>artifactId>spring-contextartifactId>version>5.2.9.RELEASEversion>dependency>dependency>groupId>org.springframeworkgroupId>artifactId>spring-aspectsartifact
特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响。springboot整合之如何选择版本及项目搭建springboot整合之版本号统一管理 springboot整合mybatis-plus+durid数据库连接池springboot整合swaggerspringboot整合mybatis代码快速生成springboot整合之统一结果返回springboot整合之统一异常处理springboot整合之Validated参数校验 springboot整合之logback日志配置springboot整合pagehelper分页springboot
一、环境搭建1.创建一个springboot项目(勾选web)2.导入依赖org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starterorg.mybatis.spring.bootmybatis-spring-boot-starter1.3.2mysqlmysql-connector-javaruntimecom.alibabadruid1.1.12org.junit.ju
目录一MyBatis动态拼接SQL1:if标签2、where标签3:foreach标签二 MyBatisPlus条件构造器2.1使用QueryWrapper进行各种条件构造2.1.1案例一组装条件查询2.1.2、例2:组装排序条件2.1.3、例3:组装删除条件2.1.4、例4:条件的优先级2.1.5实现子查询2.2常用的QueryWrapper查询语法总结一MyBatis动态拼接SQL1:if标签andmoney>10002、where标签andmoney>1000where标签的作用是可以自动处理掉第一个and3:foreach标签#{id}二 MyBatisPlus条件构造器2.1使用Qu
我们目前正在重新实现我们的数据库层以使用MyBatis。我们有一个用XML定义的模型“User”的ResultMapper。对于一个相当复杂的搜索查询,我们希望用Java构建查询,但从用XML定义的ResultMapper获得类型化结果。我认为必须有可能获得Java中的ResultMappers,以便将它们与手工制作的Java选择查询相结合。任何人都知道我应该如何或应该尝试另一种方法吗? 最佳答案 这违背了MyBatis的目的。来自MyBatis文档:OneofthenastiestthingsaJavadeveloperwille
我尝试用MyBatis3.2.8映射集合的反向关系。看起来MyBatis会复制对象,即使它们具有相同的id。publicclassObjA{privateStringid;privateArrayListobjBs;//Getters,setters...//Equalsbasedontheidfield}publicclassObjB{privateStringid;privateObjAobjA;//Getters,setters...//Equalsbasedontheidfield}映射xml文件JUnit测试ArrayListresult=service.getAllObjA
是否可以在myBatisresultMap中映射一个嵌套的java.sql.ResultSet?例如。假设我有一个这样定义的过程映射:{callgetCarsByYear(#{year,jdbcType=INTEGER,mode=IN},#{results,jdbcType=CURSOR,mode=OUT,javaType=java.sql.ResultSet,jdbcType=CURSOR,resultMap=cars})}还有我的映射器。它返回一个汽车对象列表,还有一个经销商列表(嵌套的CURSOR):这里的问题是,当我检查生成的java对象时,dealerships是一个空列表。
我正在移植一些旧的iBatis版本2。?代码,想知道如何替换标签?我读过MyBatisuserguide,并且知道你可以做一个但我不知道如何引用参数对象?它有什么特别的名字吗?是否可以使用不同的标签? 最佳答案 原来有一个特殊的变量叫做“_parameter”。它没有出现在用户指南中,但它应该在那里accordingtoJeffButler.然后您可以测试此变量是否为空。因此它似乎是的替代品是. 关于java-MyBatis中的iBatis标签是什么?,我们在StackOverflow上
我找到了几个如何将自定义ResultHandler连接到MyBatis查询的示例:例如https://code.google.com/p/mybatis/wiki/ResultHandlerExample不幸的是,示例中给出的ResultHandler从未被调用。(如上一条评论所述)所以我搜索了一个解决方案并找到了这个:MyBatis-ResultHandlerisnotinvoked但这不太适合我的问题,因为我使用MyBatis的xml样式方式而不是API样式方式。所以就我而言,我没有SqlSessionsession=MyBatisConnectionFactory.getSqlS
我已经在一个mapper.xml文件中为表/对象编写了一个标准的选择和结果映射,我想知道是否有一种方法可以通过关联、集合上的“select”参数在另一个mapper.xml文件中使用这个选择等 最佳答案 其他映射器文件中定义的元素可以由包含映射器命名空间的完全限定标识符使用。例如,您在mapper1.xml中选择:select*formentity1可以在mapper2.xml中使用: 关于xml-Mybatis从另一个mapper.xml文件中引用sql,我们在StackOverflo