Java的Mybatis框架
思路来源
整理
(一)架构层次
- 接口层(Mapper 接口)
-
Mapper 接口是 MyBatis 中定义数据操作接口的地方。它是一个普通的 Java 接口,接口中的方法对应于数据库的操作,如查询、插入、更新、删除等。这些方法的返回值可以是单个对象、对象列表或者受影响的行数等。例如,一个用户管理系统的 UserMapper 接口可能包含如下方法:
public interface UserMapper { User selectUserById(int id); List<User> selectAllUsers(); void insertUser(User user); void updateUser(User user); void deleteUser(int id); } -
Mapper 接口中的方法与 SQL 映射文件中的 SQL 语句是一一对应的。MyBatis 会在运行时根据接口和映射文件的配置,动态地生成接口的实现类,从而使得开发者可以通过调用接口方法来完成数据库操作。
2. SQL 映射层(Mapper XML 文件)
-
Mapper XML 文件是 MyBatis 中定义 SQL 映射的地方。它是一个 XML 文件,用于将 Mapper 接口中的方法与具体的 SQL 语句进行映射。在 XML 文件中,每个
<select>、<insert>、<update>、<delete>等标签对应于 Mapper 接口中的一个方法。例如,与上面的 UserMapper 接口对应的 XML 文件可能如下:<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" parameterType="int" resultType="com.example.model.User"> SELECT * FROM users WHERE id = #{id} </select> <select id="selectAllUsers" resultType="com.example.model.User"> SELECT * FROM users </select> <insert id="insertUser" parameterType="com.example.model.User"> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert> <update id="updateUser" parameterType="com.example.model.User"> UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete> </mapper> -
在 XML 文件中,
namespace属性指定了对应的 Mapper 接口的全限定名,id属性对应于接口中的方法名,parameterType属性指定了方法的参数类型,resultType属性指定了返回值的类型。#{}占位符用于绑定方法参数到 SQL 语句中,MyBatis 会自动进行参数的替换和处理。
3. SQL 会话层(SqlSession)
-
SqlSession 是 MyBatis 中非常重要的一个类,它代表了一次数据库会话。通过 SqlSession,开发者可以执行 SQL 语句、获取映射器(Mapper)以及管理事务。SqlSession 是线程不安全的,因此每次使用后都应该关闭它,以释放数据库连接等资源。
-
SqlSession 提供了多种方法来执行 SQL 语句,例如
selectOne、selectList、insert、update、delete等。这些方法的底层实现会根据 Mapper XML 文件中的配置,将 SQL 语句发送到数据库执行,并返回相应的结果。例如: -
try (SqlSession session = sqlSessionFactory.openSession()) { User user = session.selectOne("com.example.mapper.UserMapper.selectUserById", 1); System.out.println(user.getName()); }
4. 配置层(SqlSessionFactory 和 SqlSessionFactoryBuilder)
-
SqlSessionFactory 是 MyBatis 中的另一个核心类,它负责创建 SqlSession 实例。SqlSessionFactory 是线程安全的,通常在整个应用程序的生命周期中只需要创建一个实例。它可以通过 SqlSessionFactoryBuilder 来构建。
-
SqlSessionFactoryBuilder 是一个用于构建 SqlSessionFactory 的工具类。它通过读取 MyBatis 的配置文件(通常是 mybatis-config.xml 文件)来初始化 MyBatis 的运行环境,包括加载映射文件、解析配置信息、初始化插件等。例如:
-
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); -
在 mybatis-config.xml 文件中,可以配置数据库连接信息、事务管理、环境设置、插件等。例如:
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration> -
在这个配置文件中,
environments节定义了数据库环境的配置,transactionManager定义了事务管理方式(这里使用的是 JDBC 自带的事务管理),dataSource定义了数据库连接池的配置。mappers节定义了 Mapper XML 文件的位置。
mybatis实际case举例
-
方法声明及参数绑定,写在dal文件夹下,mapper子文件夹内的XXXMapper.java文件内
-
具体的sql,写在resources文件夹下,mapper子文件夹下内的XXXMapper.xml内,与java文件对应
MyBatis 参数绑定用法解析
这是 MyBatis 框架中的参数绑定语法,用于将 Java 方法参数映射到 SQL 语句中。
@Param 注解作用
CrowdDocketPO selectLatestByShop(@Param("shopId") Long shopId, @Param("platform") Integer platform);
参数说明:
-
@Param("shopId")****: 将方法参数 shopId 绑定为 SQL 中的 shopId 参数
-
@Param("platform")****: 将方法参数 platform 绑定为 SQL 中的 platform 参数
对应的 SQL 使用方式:
在 XML 映射文件中,可以这样使用:
<select id="selectLatestByShop" resultType="CrowdDocketPO">
SELECT * FROM crowd_docket
WHERE shop_id = #{shopId}
AND platform = #{platform}
ORDER BY create_time DESC
LIMIT 1
</select>
功能推测:
根据方法名 selectLatestByShop**,这个方法的作用是:**
-
根据店铺ID (shopId) 和平台 (platform) 查询
-
返回最新的一条围观工单记录 (CrowdDocketPO)
-
通常按创建时间倒序排列,取第一条
为什么使用 @Param:
-
多参数场景:当方法有多个参数时,MyBatis 需要明确参数名称
-
可读性:让 SQL 中的参数名更清晰易懂
-
避免歧义:防止参数顺序错乱导致的问题
一些用法记录
sql别名
这个是类似alias的用法,用allfields替代ID,RelateID,AppType,Scenario,ShopID,Platform,Result,AccountId,AddTime,UpdateTime这一堆字段的意思
<sql id="allfields">
ID,RelateID,AppType,Scenario,ShopID,Platform,Result,AccountId,AddTime,UpdateTime
</sql>
数据库配置
Q:resources/spring/database/appcontext-datasource.xml的作用是什么?
A:spring/database/appcontext-datasource.xml文件的作用是配置应用程序的数据库连接和数据源。具体来说,它实现了以下功能:
-
定义了应用程序使用的数据源(DataSource)对象,这些对象负责管理与数据库的连接
-
配置了两个主要的数据源:
-
report.main.dataSource:主要的数据源,用于CaseDao和InfoDao等DAO访问数据库
-
credibilityAuditDataSource:用于可信度审核的数据源
-
-
使用了Zebra数据源(com.dianping.zebra.group.jdbc.GroupDataSource),这是点评内部的一个数据库中间件,提供了读写分离、分库分表等功能
-
通过${credit-case-server.dataSource.jdbcRef}这样的占位符引用外部配置,这些值通常来自Lion配置中心(点评/美团的配置管理系统)
-
配置了连接池参数,如最小连接数、最大连接数、初始连接数等,用于优化数据库连接的使用
-
创建了mysqlJdbcTemplate,这是Spring提供的JDBC操作模板,简化了JDBC操作
这个文件是Spring应用程序中数据访问层的核心配置,它将应用程序与具体的数据库实现解耦,使得应用程序可以通过配置的方式连接到不同的数据库,而不需要修改代码。
${credit-case-server.dataSource.jdbcRef}这样的值是从Lion配置中心获取的,Lion是美团点评的配置管理系统,可以集中管理各种配置项,并支持动态修改。在应用启动时,这些占位符会被Lion中实际配置的值替换。