MyBatis/Ibatis中#和$的区别

本文详细介绍了MyBatis中#与$符号在SQL参数处理上的不同之处,包括它们如何影响SQL生成及安全性,强调了#对于防止SQL注入的重要作用。

MyBatis/Ibatis#$的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名. 
6.一般能用#的就别用$.

### MyBatis iBatis 中多表联查的实现方式 在实际开发中,单表查询通常无法满足复杂业务需求,因此需要通过多表联查来获取所需的数据。以下是基于 MyBatis iBatis 的多表联查实现方式及其示例。 #### 1. MyBatis 多表联查的方式 MyBatis 提供了多种方式进行多表联查,主要包括以下几种方法: ##### (1) 使用 XML 配置文件完成多表联查 可以通过编写 SQL 语句并结合 `<resultMap>` 映射结果集的方式来实现多表联查。下面是一个典型的例子,展示了一对多关系(如用户订单)的查询过程。 ###### 示例:用户订单的一对多关系 假设存在两个表 `users` `orders`,它们之间是一对多的关系(一个用户有多个订单)。SQL 查询如下: ```sql SELECT u.id AS userId, u.name AS userName, o.order_number AS orderNumber, o.total_amount AS totalAmount FROM users u LEFT JOIN orders o ON u.id = o.user_id; ``` 对应的 MyBatis 配置文件可以这样写: ```xml <!-- resultMap 定义 --> <resultMap id="userOrdersResultMap" type="User"> <id property="userId" column="userId"/> <result property="userName" column="userName"/> <!-- 嵌套集合映射 --> <collection property="orders" ofType="Order"> <id property="orderId" column="orderNumber"/> <result property="totalAmount" column="totalAmount"/> </collection> </resultMap> <!-- select 查询 --> <select id="getUserWithOrders" resultMap="userOrdersResultMap"> SELECT u.id AS userId, u.name AS userName, o.order_number AS orderNumber, o.total_amount AS totalAmount FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{userId}; </select> ``` 此配置实现了根据用户 ID 获取该用户的详细信息以及其所有的订单记录[^3]。 ##### (2) 使用注解方式完成多表联查 除了 XML 文件外,还可以使用注解形式简化配置。例如: ```java @Select("SELECT u.id as userId, u.name as userName, " + "o.order_number as orderNumber, o.total_amount as totalAmount " + "FROM users u LEFT JOIN orders o ON u.id = o.user_id " + "WHERE u.id = #{userId}") @Results({ @Result(property = "userId", column = "userId"), @Result(property = "userName", column = "userName"), @Result(property = "orders", javaType = List.class, column = "userId", many = @Many(select = "com.example.mapper.OrderMapper.getOrdersByUserId")) }) public User getUserWithOrders(@Param("userId") Long userId); ``` 这里需要注意的是,`many` 属性指定了子查询方法名,用于加载关联对象列表[^4]。 #### 2. iBatis 多表联查的方式 iBatisMyBatis 的前身,其实现原理基本一致,只是语法稍显不同。同样支持通过 `<resultMap>` 嵌套查询等方式完成多表联查。 ##### 示例:角色权限的多对多关系 假设有三个表 `roles`, `permissions`, 中间表 `role_permission` 构成的角色权限多对多关系。SQL 查询可能像这样: ```sql SELECT r.role_name, p.permission_code FROM roles r JOIN role_permission rp ON r.id = rp.role_id JOIN permissions p ON rp.permission_id = p.id; ``` 相应的 iBatis 配置如下所示: ```xml <resultMap id="rolePermissionsResultMap" class="Role"> <result property="roleName" column="role_name"/> <list property="permissions" column="permission_code" select="getPermissionById"/> </resultMap> <select id="getRolesWithPermissions" resultMap="rolePermissionsResultMap"> SELECT r.role_name, p.permission_code FROM roles r JOIN role_permission rp ON r.id = rp.role_id JOIN permissions p ON rp.permission_id = p.id; </select> <select id="getPermissionById" resultClass="Permission"> SELECT permission_code FROM permissions WHERE id = #id# </select> ``` 这段代码展示了如何在一个查询中同时获取角色及其所拥有的所有权限[^2]。 --- ### 总结 无论是 MyBatis 还是 iBatis,都提供了强大的工具帮助开发者轻松应对复杂的多表联查场景。推荐优先考虑使用 `<resultMap>` 来管理复杂的结果映射,并合理运用嵌套查询或联合查询提升程序可读性灵活性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值