MyBatis 基础学习与优化技巧解析

news/2024/12/13 21:02:07/

1. 引言

        在当今的软件开发领域,数据库操作是至关重要的一环。MyBatis 作为一款优秀的持久层框架,简化了 JDBC 代码,为开发者提供了高效、灵活的数据访问方式。在之前的学习中,我们已经对 MyBatis 有了一定的了解,今天将深入探讨 MyBatis 的一些高级特性和优化技巧,包括注解模式、优化策略、特殊字符处理、多参数传递、主键递增值获取以及模糊查询等内容。通过对这些知识的学习,我们能够更好地运用 MyBatis 框架,提升项目的开发效率和性能。

2. MyBatis 基础回顾

2.1 MyBatis 简介

        MyBatis 是一款持久层框架,专注于数据库操作,极大地简化了 JDBC 代码的编写。它通过配置文件和映射文件,将 SQL 语句与 Java 代码解耦,使得代码结构更加清晰,易于维护。

2.2 使用步骤

  1. 引入依赖:在项目中引入 MyBatis 和 MySQL 的相关依赖。
  2. 配置文件:编写配置文件,包含数据源信息和映射文件路径等。
  3. 映射文件:在映射文件中编写 SQL 语句,实现与数据库的交互。

2.3 接口绑定模式

        定义一个 DAO 接口,在映射文件中确保 namespace 与接口对应,标签 id 与接口方法对应。

3. 注解模式

3.1 简介

        除了传统的映射文件方式,MyBatis 还支持注解模式编写 SQL 语句。这种方式在某些场景下更加简洁直观,特别适合单表的简单操作。

3.2 代码示例

java">public interface TeacherDao {// 根据id查询教师信息@Select(value = "select * from tbl_teacher where id=#{id}")public Teacher getById(int id);// 插入教师信息@Insert(value = "insert into tbl_teacher(name,age,salary) values(#{name},#{age},#{salary})")public int add(Teacher teacher);// 查询所有教师信息@Select(value = "select * from tbl_teacher")public List<Teacher> selectAll();// 根据id删除教师信息public int delete(int id);
}

3.3 注意事项

  1. 注解模式适用于简单的 SQL 操作,对于复杂的查询和关联查询,映射文件可能更加灵活。
  2. 如果同时使用了注解和 XML 映射文件,在配置文件中引入映射文件时需注意。

4. MyBatis 优化

4.1 添加 MyBatis 的 SQL 日志

  1. 作用:在控制台显示 SQL 执行语句,方便检查 SQL 是否编写正确。
  2. 实现步骤
    • 引入 log4j 依赖
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
  • 创建日志文件 log4j.properties 并放在 resources 目录下
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

4.2 为实体类起别名

  1. 作用:简化映射文件中返回类型的书写,提高代码可读性。
  2. 实现方式
    在映射文件中使用<typeAliases>标签为实体类起别名
<typeAliases><typeAlias type="com.ykq.entity.Teacher" alias="Teacher"/>
</typeAliases>

        之后在 SQL 语句中可以使用别名代替全路径类名

<select id="getById" resultType="Teacher">select * from tbl_teacher where id=#{id}
</select>

4.3 把数据源信息提取到属性文件中

  1. 好处:方便管理和修改数据源信息,提高配置的灵活性。
  2. 操作方法
    • 创建属性文件 db.properties,格式为 key=value
jdbc.username=root
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day1211
jdbc.password=root
  • 在 MyBatis 配置文件中引入属性文件
<configuration><properties resource="db.properties"/><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></dataSource></environment></environments>
</configuration>

5. MyBatis 处理多个参数

5.1 问题描述

        当接口方法有多个参数时,MyBatis 默认会使用 param1、param2 等作为参数名,容易导致参数绑定错误。

5.2 解决方法

        使用@Param注解为多参起名称,使 MyBatis 能够正确识别参数。

java">public interface UserInfoDao {Userinfo selectByNameAndPwd(@Param("name") String name, @Param("password") String password);
}

5.3 代码示例

<select id="selectByNameAndPwd" resultType="com.ykq.entity.Userinfo">select * from tbl_userinfo where name=#{name} and password=#{password}
</select>

6. XML 出现特殊字符

6.1 问题场景

        在 XML 映射文件中编写 SQL 语句时,可能会遇到特殊字符,如<>&等,这些字符在 XML 中有特殊含义,直接使用会导致语法错误。

6.2 解决方案

  1. 使用转义符:将特殊字符转换为对应的转义序列,如<转换为&lt;>转换为&gt;&转换为&amp;等。
  2. 使用 CDATA 标签:将包含特殊字符的 SQL 语句包裹在<![CDATA[ ]]>中,使 XML 解析器忽略其中的特殊字符。
<select id="selectByAge" resultType="com.ykq.entity.Userinfo"><![CDATA[select * from tbl_userinfo where age>#{minAge} and age<#{maxAge}]]>
</select>

7. 获取主键递增的值

7.1 功能介绍

        在向数据库插入数据时,如果表的主键是自增长的,我们可能需要获取插入后生成的主键值。

7.2 实现方式

        在<insert>标签中设置useGeneratedKeys="true"表示使用生成的主键值,keyProperty指定将主键值赋给哪个属性。

<insert id="add" useGeneratedKeys="true" keyProperty="id">insert into tbl_teacher(name,age,salary) values(#{name},#{age},#{salary})
</insert>

7.3 代码示例

java">Teacher teacher = new Teacher();
teacher.setName("张三");
teacher.setAge(30);
teacher.setSalary(5000);
teacherDao.add(teacher);
System.out.println("插入后获取的主键值:" + teacher.getId());

8. 模糊查询

8.1 需求分析

        在实际应用中,经常需要进行模糊查询,如根据关键字搜索用户信息等。

8.2 实现方法

        使用like关键字结合通配符%进行模糊查询。在 MyBatis 中,可以使用concat函数进行字符串拼接,动态生成模糊查询的条件。

<select id="selectByLike" resultType="com.ykq.entity.Teacher">select * from tbl_teacher where name like concat('%',#{name},'%')
</select>

8.3 代码示例

java">List<Teacher> teacherList = teacherDao.selectByLike("张");
for (Teacher teacher : teacherList) {System.out.println(teacher);
}

9. 解决列名和属性名不一致的问题

9.1 问题描述

        在数据库查询结果中,列名可能与 Java 实体类的属性名不一致,导致数据映射错误。

9.2 解决方案

  1. 查询时为列起别名:在 SQL 语句中为列起别名,使其与属性名一致。
<select id="selectByAge" resultType="com.ykq.entity.Userinfo"><![CDATA[select id, name as username, password, sex, birthday, age, email, address, phone, remark from tbl_userinfo where age>#{minAge} and age<#{maxAge}]]>
</select>
  1. 使用 resultMap 标签:通过<resultMap>标签手动配置列名与属性名的映射关系。
<resultMap id="baseMap" type="com.ykq.entity.Userinfo"><id column="id" property="id"/><result column="name" property="username"/><!-- 其他字段映射 -->
</resultMap><select id="selectByAge" resultMap="baseMap"><![CDATA[select * from tbl_userinfo where age>#{minAge} and age<#{maxAge}]]>
</select>

9.3 注意事项

如果在<select>标签中使用了resultMap属性,就不能再使用resultType属性。


http://www.ppmy.cn/news/1554847.html

相关文章

基于 SSM 的校园一卡通密钥管理系统的用户交互与业务功能集成

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装校园一卡通密钥管理系统软件来发挥其高效地信息处理的作用&a…

Docker 学习总结(84)—— Docker 常用运维命令

版本与信息查询 docker --version:查看安装的Docker版本。 docker info:获取Docker系统的详细配置信息。 镜像管理 docker images:列出本地所有镜像。 docker search IMAGE_NAME:搜索Docker Hub上的镜像。 docker pull IMAGE_NAME[:TAG]:从仓库下载指定镜像。 docker rmi …

C++11新特性之线程std::call_once

C std::call_once std::call_once 的定义与功能 std::call_once 是 C11 标准引入的一种工具&#xff0c;用于确保某段代码只被执行一次&#xff0c;通常用于实现线程安全的单例模式或初始化操作。它结合了 std::once_flag 使用。 核心特点&#xff1a; 线程安全性&#xff…

redis优化编码之字符串

redis 优化编码之字符串 ### 字符串优化 字符串对象是redis内部最常用的数据类型。 所有的键是字符串对象值对象除了整数之外都是使用字符串存储lpush cache:type "redis" "tair" "memcache" "leveldb"创建如上一个链表 需要创建一…

ubuntu 磁盘空间满,找不到占用文件的目录

解决方法&#xff1a; 检查磁盘空间&#xff1a; 执行 df -h 查看各分区磁盘使用情况。 查找大文件或目录&#xff1a; 执行 du -sh /* 2>/dev/null 查找根目录下的大文件或目录&#xff0c;再逐一进入子目录使用相同命令查找。 清理缓存和临时文件&#xff1a; 清理 /t…

2025年的大模型计划重点在于跨领域智能、工作流自动化、多模态能力强化

明年的计划和大模型发展方向可以围绕以下几个方面展开&#xff0c;结合实际应用场景和技术趋势&#xff0c;明确可执行的目标和期待的成果&#xff1a; 2025 年计划与展望&#xff1a;大模型能做些什么&#xff1f; 1. 更深层次的跨领域能力融合 目标&#xff1a;构建更强的跨…

ES前置定义和描述

目录 介绍说明全文检索倒排索引ES和Solr的对比数据结构&#xff08;存储非结构化数据&#xff09; 介绍说明 基于Apache Lucene构建的开源分布式搜索和分析引擎&#xff0c;专为处理大规模数据而设计。 java语言开发的web项目 全文检索 定义&#xff1a;一种非结构化数据的搜索…

github创建发布分支

创建一个名为 latest 的分支&#xff0c;并将其作为稳定版本分支。以下是操作步骤&#xff1a; 1. 创建 latest 分支 首先&#xff0c;确保你在 master 分支&#xff08;或当前的稳定版本分支&#xff09;上&#xff0c;并且已经提交了所有更改。然后&#xff0c;你可以创建一…