力扣MyBatis框架 三万多字干货,来了解一下?(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 力扣MyBatis框架 三万多字干货,来了解一下?

2.3 删除用户


mapper层接口

删除、修改、查询原理同增加用户

// 删除用户
int deleteUser(@Param("id") String id);


XML具体实现

<delete id="deleteUser" parameterType="string">
    delete from user where id = #{id};
</delete>


测试

其中删除方法deleteUser中的参数ID,根据实际情况修改

/**
* 删除用户
*/
@Test
public void testDeleteUser(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    // 根据数据库用户ID自行填写
    mapper.deleteUser("35ee11b46afa47a68be7713ecdeccd7e");
    session.commit();
    session.close();
}


日志输出

可以看出,系统执行了一条delete语句,用户成功被删除

Created connection 1473981203.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@57db2b13]
==>  Preparing: delete from user where id = ?; 
==> Parameters: 35ee11b46afa47a68be7713ecdeccd7e(String)
<==    Updates: 1
Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@57db2b13]
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@57db2b13]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@57db2b13]
Returned connection 1473981203 to pool.
Process finished with exit code 0


2.4 修改用户


mapper层接口

// 指定ID查询用户
User findUserById(@Param("id") String id);


XML具体实现

<update id="updateUser" parameterType="user">
    update user set name = #{name}, age = #{age} where id = #{id};
</update>


测试

/**
* 修改用户
*/
@Test
public void testUpdateUser(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    // 根据数据库用户ID自行填写
    mapper.updateUser(new User("9e3eed6af6da4214b520535cac13f13a","ZWZ1改",18));
    session.commit();
    session.close();
}


日志输出

Created connection 454884231.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87]
==>  Preparing: update user set name = ?, age = ? where id = ?; 
==> Parameters: ZWZ1改(String), 18(Integer), 9e3eed6af6da4214b520535cac13f13a(String)
<==    Updates: 1
Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87]
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1b1cfb87]
Returned connection 454884231 to pool.
Process finished with exit code 0


2.5 单个查询


mapper层接口

其中传递非引用类型参数,建议加上@Param注解,注解中的字符串和XML文件#{}中对应

// 指定ID查询用户
User findUserById(@Param("id") String id);


XML具体实现

<select id="findUserById" resultType="user" parameterType="string">
    select * from user where id = #{id};
</select>

Select 元素的属性如下

属性 描述
id 在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType 将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap 用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。
resultType 期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
resultMap 对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
flushCache 将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
useCache 将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
timeout 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
fetchSize 这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
statementType 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
databaseId 如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
resultOrdered 这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回一个主结果行时,就不会产生对前面结果集的引用。 这就使得在获取嵌套结果集的时候不至于内存不够用。默认值:false
resultSets 这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。


测试

/**
 * 查询单个用户
 */
@Test
public void testFindUserById(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.findUserById("9e3eed6af6da4214b520535cac13f13a");
    System.out.println(user);
}


日志输出

可以看出系统执行了一条查询语句

Created connection 2113748097.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7dfd3c81]
==>  Preparing: select * from user where id = ?; 
==> Parameters: 9e3eed6af6da4214b520535cac13f13a(String)
<==    Columns: id, name, age
<==        Row: 9e3eed6af6da4214b520535cac13f13a, ZWZ1改, 18
<==      Total: 1
User(id=9e3eed6af6da4214b520535cac13f13a, name=ZWZ1改, age=18)
Process finished with exit code 0


2.6 查询全部


mapper层接口

<select id="findAllUsers" resultType="user">
    select * from user;
</select>


XML具体实现

// 查询全部用户
List<User> findAllUsers();


测试

@Test
public void testFindAllUsers(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.findAllUsers();
    for (User user : users) {
        System.out.println(user);
    }
}


日志输出

Created connection 352367347.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1500b2f3]
==>  Preparing: select * from user; 
==> Parameters: 
<==    Columns: id, name, age
<==        Row: 4e387cafc50840468c4dfeec54940e1c, ZWZ5, 18
<==        Row: 7322170480104981a58b28f51fdb2288, ZWZ2, 18
<==        Row: 9e3eed6af6da4214b520535cac13f13a, ZWZ1改, 18
<==        Row: e4993aecfd4f4322905eb6dc0cf039b9, ZWZ4, 18
<==        Row: f0d102cd857645c9aaca4ded53abb0e8, ZWZ3, 18
<==      Total: 5
User(id=4e387cafc50840468c4dfeec54940e1c, name=ZWZ5, age=18)
User(id=7322170480104981a58b28f51fdb2288, name=ZWZ2, age=18)
User(id=9e3eed6af6da4214b520535cac13f13a, name=ZWZ1改, age=18)
User(id=e4993aecfd4f4322905eb6dc0cf039b9, name=ZWZ4, age=18)
User(id=f0d102cd857645c9aaca4ded53abb0e8, name=ZWZ3, age=18)
Process finished with exit code 0



三、resultMap结果集映射


  • resultMap 是 MyBatis 中最重要最强大的元素。
  • 它可以进行一些 JDBC 不支持的操作。
  • 设计思想,对简单的语句做到零配置,对于复杂语句,只需要描述语句之间的关系


需要实现的功能

使用resultMap ,查询所有的User


mapper接口

mapper接口和之前一样,约束需要实现的功能

public interface UserMapper {
    List<User> findAllUsers();
}


XML具体实现

  • findAllUsers 方法配置了 resultMap
  • userMap配置了数据库列和Java实体类的关系
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="zwz.mapper.UserMapper">
    <select id="findAllUsers" resultMap="userMap">
        select * from user;
    </select>
    <resultMap id="userMap" type="user">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
    </resultMap>
</mapper>


测试

@Test
public void testResultMap(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.findAllUsers();
    for (User user : users) {
        System.out.println(user);
    }
}


日志输出

可以看到和之前一样,也实现了查询操作

Created connection 126189538.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7857fe2]
==>  Preparing: select * from user; 
==> Parameters: 
<==    Columns: id, name, age
<==        Row: 4e387cafc50840468c4dfeec54940e1c, ZWZ5, 18
<==        Row: 7322170480104981a58b28f51fdb2288, ZWZ2, 18
<==        Row: 9e3eed6af6da4214b520535cac13f13a, ZWZ1改, 18
<==        Row: e4993aecfd4f4322905eb6dc0cf039b9, ZWZ4, 18
<==        Row: f0d102cd857645c9aaca4ded53abb0e8, ZWZ3, 18
<==      Total: 5
User(id=4e387cafc50840468c4dfeec54940e1c, name=ZWZ5, age=18)
User(id=7322170480104981a58b28f51fdb2288, name=ZWZ2, age=18)
User(id=9e3eed6af6da4214b520535cac13f13a, name=ZWZ1改, age=18)
User(id=e4993aecfd4f4322905eb6dc0cf039b9, name=ZWZ4, age=18)
User(id=f0d102cd857645c9aaca4ded53abb0e8, name=ZWZ3, age=18)
Process finished with exit code 0


四、分页


4.1 XML版 limit


mapper层接口

public interface UserMapper {
    // 使用Limit语句分页
    List<User> findAllByPageLimit(@Param("startPage") int startPage,@Param("pageSize") int pageSize);
}


XML具体实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="zwz.mapper.UserMapper">
    <select id="findAllByPageLimit" resultType="user">
        select * from user limit #{startPage},#{pageSize};
    </select>
</mapper>


测试

下标从0开始,所以是输出第三个元素开始,输出三个用户

@Test
public void testFindAllByPageLimit(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.findAllByPageLimit(2, 3);
    for (User user : users) {
        System.out.println(user);
    }
}


日志输出

Created connection 1041109062.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@3e0e1046]
==>  Preparing: select * from user limit ?,?; 
==> Parameters: 2(Integer), 3(Integer)
<==    Columns: id, name, age
<==        Row: 9e3eed6af6da4214b520535cac13f13a, ZWZ1改, 18
<==        Row: e4993aecfd4f4322905eb6dc0cf039b9, ZWZ4, 18
<==        Row: f0d102cd857645c9aaca4ded53abb0e8, ZWZ3, 18
<==      Total: 3
User(id=9e3eed6af6da4214b520535cac13f13a, name=ZWZ1改, age=18)
User(id=e4993aecfd4f4322905eb6dc0cf039b9, name=ZWZ4, age=18)
User(id=f0d102cd857645c9aaca4ded53abb0e8, name=ZWZ3, age=18)
Process finished with exit code 0


4.2 Java注解版 limit


XML可以实现分页,Java直接也可以实现分页

mapper接口

public interface UserMapper {
    // 使用Java注解分页
    @Select("select * from user limit #{startPage},#{pageSize};")
    List<User> findAllByJava(@Param("startPage") int startPage,@Param("pageSize") int pageSize);
}


测试

@Test
public void testFindAllByJava(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.findAllByJava(2, 3);
    for (User user : users) {
        System.out.println(user);
    }
}


日志输出

Created connection 1825719826.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@6cd24612]
==>  Preparing: select * from user limit ?,?; 
==> Parameters: 2(Integer), 3(Integer)
<==    Columns: id, name, age
<==        Row: 9e3eed6af6da4214b520535cac13f13a, ZWZ1改, 18
<==        Row: e4993aecfd4f4322905eb6dc0cf039b9, ZWZ4, 18
<==        Row: f0d102cd857645c9aaca4ded53abb0e8, ZWZ3, 18
<==      Total: 3
User(id=9e3eed6af6da4214b520535cac13f13a, name=ZWZ1改, age=18)
User(id=e4993aecfd4f4322905eb6dc0cf039b9, name=ZWZ4, age=18)
User(id=f0d102cd857645c9aaca4ded53abb0e8, name=ZWZ3, age=18)
Process finished with exit code 0


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
SQL XML Java
35 0
|
1月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
89 12
|
2月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
173 0
|
7月前
|
Oracle 关系型数据库 Java
|
7月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
9月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
396 29
|
11月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
214 1
持久层框架MyBatisPlus
|
12月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
402 0
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
196 0
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】