MyBatis 是一个优秀的持久化框架,其底层也是通过 JDBC 实现对数据库的操作。下面,我们就来详细讲解一下 MyBatis 如何执行一条 SQL 语句的完整攻略。
1. 读取 XML 配置文件
首先,MyBatis 会读取类路径下的 mybatis-config.xml
(或者其他指定的配置文件)文件,该文件中包含了 MyBatis 的全局配置信息,其中比较重要的是数据源的配置和 MyBatis 映射文件的路径配置。
示例:
<?xml version="1.0" encoding="UTF-8" ?>
<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/mybatis_demo?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- MyBatis 映射文件路径配置 -->
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
2. 解析映射文件
接下来,MyBatis 会解析映射文件中定义的 SQL 语句,并将其保存至 Configuration 对象中。这些 SQL 语句可以是通过 <select>
、<insert>
、<update>
和 <delete>
等标签定义的,也可以是通过 <statement>
标签自定义的。
示例:
<?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.example.mapper.UserMapper">
<!-- 自定义 SQL 语句 -->
<statement id="getUser" statementType="STATEMENT" resultSetType="FORWARD_ONLY">
SELECT * FROM user WHERE id = #{id}
</statement>
<!-- 使用标签定义 SQL 语句 -->
<select id="getUserById" parameterType="int" resultType="com.example.pojo.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
3. 构建 SQL 语句
MyBatis 会根据解析得到的 SQL 语句和参数,通过 SQL 语句构建器构建一条完整的 SQL 语句,其中包含了参数占位符 ?
和具体的参数值。
示例:
假设我们有一条查询用户信息的 SQL 语句:
<select id="getUserById" parameterType="int" resultType="com.example.pojo.User">
SELECT * FROM user WHERE id = #{id}
</select>
通过传入的参数值 1
,该 SQL 语句将被构建成:
SELECT * FROM user WHERE id = ?
同时,MyBatis 会将参数值 1
保存到执行器执行的 Statement 对象中,以便在执行时将其替换到占位符 ?
的位置。
4. 创建 Connection 对象
MyBatis 会基于配置信息创建 JDBC 的 Connection 对象,其中会包含连接数据库所需的基本信息,如数据库地址、用户名、密码、协议等。
5. 创建 Statement 对象
接下来,MyBatis 会根据传递的参数信息和 SQL 语句构建完成的结果,创建一个 Statement 对象,并把该对象绑定到创建的 Connection 对象上。
6. 执行 SQL 语句
MyBatis 会通过创建的 Statement 对象,执行 SQL 语句。在执行过程中,MyBatis 会自动将占位符 ?
替换成具体的参数值,然后将语句发送给数据库执行。
7. 处理返回结果
最后,MyBatis 会从数据库中获取执行结果,并将其解析成相应的 Java 对象,以便后续进行进一步的处理。
示例:
public interface UserMapper {
/**
* 查询用户信息
* @param id 用户 id
* @return 用户信息
*/
User getUserById(Integer id);
/**
* 查询用户信息
* @param id 用户 id
* @return 用户信息
*/
User getUser(Integer id);
}
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user1 = userMapper.getUserById(1);
User user2 = userMapper.getUser(1);
在这个示例中,我们看到了两个方法 getUserById
和 getUser
都可以用来查询用户信息,它们的 SQL 语句都是相同的。但是,在方法上定义的参数和返回值类型不同,会影响 MyBatis 的 SQL 语句构建和结果处理方式。
以上就是 MyBatis 如何执行一条 SQL 语句的完整攻略,希望可以对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈MyBatis 如何执行一条 SQL语句 - Python技术站