举一个用mybatis和不用mybatis,来展示用了mybatis的好处

当然,通过对比可以更清楚地看到MyBatis带来的便利。让我们以一个简单的查询操作为例,来展示使用MyBatis和不使用MyBatis(直接使用JDBC)时的代码差异。

场景描述

假设我们有一个User表,并想查询ID为1的用户信息。

不使用MyBatis(直接使用JDBC)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcExample {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            String url = "jdbc:mysql://localhost:3306/mydatabase";
            String username = "myusername";
            String password = "mypassword";
            connection = DriverManager.getConnection(url, username, password);
            String sql = "SELECT * FROM User WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 1);
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                String name = resultSet.getString("name");
                System.out.println("User Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) { /* ignored */}
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) { /* ignored */}
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) { /* ignored */}
            }
        }
    }
}

在这个JDBC例子中,我们需要手动处理数据库连接、SQL语句的编写和执行、结果集的遍历以及异常和资源的管理。

使用MyBatis

首先,我们假设有一个User类和对应的Mapper接口UserMapper

User.java

public class User {
    private Integer id;
    private String name;
    // getters and setters
}

UserMapper.java

public interface UserMapper {
    User selectUser(int id);
}

UserMapper.xml

<mapper namespace="com.example.UserMapper">
    <select id="selectUser" parameterType="int" resultType="com.example.User">
        SELECT * FROM User WHERE id = #{id}
    </select>
</mapper>

然后,使用MyBatis进行查询:

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUser(1);
    System.out.println(user.getName());
}

对比优势

  • 简化代码:MyBatis自动处理了SQL执行、结果映射和资源管理。与直接使用JDBC相比,代码更简洁。
  • 易于维护:SQL语句与Java代码分离,在UserMapper.xml中定义。这使得SQL语句更易于管理和优化,而无需修改Java代码。
  • 减少样板代码:MyBatis自动管理了数据库连接和关闭资源,减少了出错的机会,也使得代码更加干净。
  • 类型安全:MyBatis的Mapper接口提供了类型安全的方法,减少了运行时错误。

通过对比,使用MyBatis不仅能够使代码变得更加简洁,而且还提高了开发效率和应用程序的可维护性。

就是如果不用jdbc的话每种情况的查找都要写一遍sql语句吗,而如果用了mybatis不管是什么情况就只需要调用事先写好的接口就行了嘛

是的,你的理解基本正确。让我进一步阐述一下。

不使用MyBatis(直接使用JDBC)

当直接使用JDBC时,你需要为每种数据库操作手动编写SQL语句创建和管理数据库连接准备语句(PreparedStatement)、执行SQL、处理结果集(ResultSet)、以及最后的资源清理工作。对于不同的查询或操作,即使SQL语句有轻微的变化,也通常需要重复这一流程。

举个例子,如果你想根据不同的条件来查询用户——比如根据用户名、邮箱或两者同时,每种情况可能都需要编写一个新的方法,包括相应的SQL语句和处理逻辑。

使用MyBatis

使用MyBatis后,这个过程变得更加简洁和直观。你首先定义一个Mapper接口,里面声明你需要的操作(如查询、更新等),然后在XML映射文件或通过注解中编写对应的SQL语句。当需要执行数据库操作时,只需通过SqlSession获取到Mapper接口的实例,然后调用相应的方法即可。

MyBatis负责:

  • 根据你的方法调用找到对应的SQL语句。
  • 执行SQL语句。
  • 将查询结果映射回Java对象或列表。
  • 管理数据库连接和事务。

这意味着,不论何种情况,你只需要调用事先定义好的接口方法,MyBatis会处理剩下的工作。如果查询条件变化,通常只需要添加或修改映射文件中的SQL语句,而不需要改动Java代码。

优点

  • 减少重复代码:你不需要重复编写创建连接、执行SQL、处理结果集等样板代码。
  • 分离关注点:SQL语句与Java代码分离,更易于管理和优化。
  • 提高开发效率:开发者可以将更多精力放在业务逻辑上,而不是底层的数据库操作上。
  • 类型安全:接口方法提供了类型安全的调用方式,减少了运行时错误。

总的来说,MyBatis提供了一种更为高效、清晰的方式来进行数据库操作,特别适合需要频繁执行SQL操作的应用开发。

但是如果查别的属性,就得在mapper里写出别的属性的 查找sql语句吧,而不能用原来的属性查找sql语句来接着使用吧

是的,你的理解是正确的。在MyBatis中,如果你需要根据不同的属性进行查询,通常你需要为每种查询情况编写一个对应的SQL语句。这是因为不同属性的查询可能需要不同的SQL逻辑,尽管MyBatis极大地简化了SQL操作和Java代码的整合,但它并不能自动为你生成所有可能的查询SQL语句 。让我们详细讨论一下:

定义不同的查询方法

假设你有一个用户表(User),现在需要根据不同的属性进行查询,比如根据用户名(username)、邮箱(email)或两者同时查询。你需要在Mapper接口中为每种查询定义一个方法,并在Mapper XML文件中为每个方法编写相应的SQL语句。

UserMapper.java 示例

public interface UserMapper {
    User selectUserByUsername(String username);
    User selectUserByEmail(String email);
    User selectUserByUsernameAndEmail(String username, String email);
}

UserMapper.xml 示例

<mapper namespace="com.example.UserMapper">
    <select id="selectUserByUsername" parameterType="String" resultType="User">
        SELECT * FROM User WHERE username = #{username}
    </select>
    
    <select id="selectUserByEmail" parameterType="String" resultType="User">
        SELECT * FROM User WHERE email = #{email}
    </select>
    
    <select id="selectUserByUsernameAndEmail" parameterType="map" resultType="User">
        SELECT * FROM User WHERE username = #{username} AND email = #{email}
    </select>
</mapper>

动态SQL

虽然对于每种查询都需要定义一个SQL语句,但MyBatis提供了动态SQL的功能,这可以在一定程度上减少重复的SQL定义。例如,你可以使用<if>标签来在一个查询中包含可选的查询条件。

动态SQL示例

<select id="selectUserByDynamicCondition" parameterType="map" resultType="User">
    SELECT * FROM User
    WHERE 1=1
    <if test="username != null">
        AND username = #{username}
    </if>
    <if test="email != null">
        AND email = #{email}
    </if>
</select>

在这个例子中,selectUserByDynamicCondition方法可以根据传入参数的不同(只有用户名、只有邮箱或两者都有),动态地生成不同的SQL语句。这样,你就可以使用一个方法来支持多种查询情况,而不是为每种可能的查询组合编写单独的SQL语句。

总结

尽管MyBatis要求为不同的查询条件编写不同的SQL语句,但它通过动态SQL的功能提供了一定程度上的灵活性,使得你可以更灵活地定义查询逻辑,减少代码重复。这是MyBatis与完全ORM框架相比既是优势也是不足之处,它既提供了SQL的灵活性,又保留了一定的简洁性和易用性。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值