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

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 代码示例

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 能够正确识别参数。

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 代码示例

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 代码示例

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属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值