MyBatis
========================================================================
MyBatis/Ibatis中#和$的区别
1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:order by #{user_id},如果传入的值是666,那么解析成sql时的值为order by "666",
如果传入的值是id,则解析成的sql为order by "id".
2.$将传入的数据直接显示生成在sql中。
如:order by ${user_id},如果传入的值是888,那么解析成sql时的值为order by 888,
如果传入的值是id,则解析成的sql为order by id.
3.#方式能够很大程度防止sql注入;$方式无法防止Sql注入。
4.$方式一般用于传入数据库对象,例如传入表名、字段名.
5.一般能用#的就别用$.
ps:在使用mybatis中还遇到<![CDATA[ ]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,
比如sql中有大于号>比较时;要执行一个存储过程时等
========================================================================
========================================================================
MyBatis insert操作返回主键
MyBatis insert语句默认返回的是插入的记录条数;
int userAdd(UserEntit user); //dao mapper层
<insert id="add" parameterType="UserEntity" useGeneratedKeys="true" keyProperty="id">
insert into ......
</insert>
返回值为插入的记录条数
user.getId()为插入记录的主键id
========================================================================
MyBatis in
1. 当查询的参数只有一个时
1.1 如果参数的类型是List, 则在使用时,collection属性要必须指定为 list
findByIds(List<Long> ids)
findByIds(Long[] ids)
这种情况需要特别注意,在传参数时,一定要改用Map方式,这样在collection属性可以指定名称,下面是一个示例
Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("ids", ids);
mapper.findByIdsMap(params);
========================================================================
MyBatis/Ibatis中#和$的区别
1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:order by #{user_id},如果传入的值是666,那么解析成sql时的值为order by "666",
如果传入的值是id,则解析成的sql为order by "id".
2.$将传入的数据直接显示生成在sql中。
如:order by ${user_id},如果传入的值是888,那么解析成sql时的值为order by 888,
如果传入的值是id,则解析成的sql为order by id.
3.#方式能够很大程度防止sql注入;$方式无法防止Sql注入。
4.$方式一般用于传入数据库对象,例如传入表名、字段名.
5.一般能用#的就别用$.
ps:在使用mybatis中还遇到<![CDATA[ ]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,
比如sql中有大于号>比较时;要执行一个存储过程时等
========================================================================
========================================================================
MyBatis insert操作返回主键
MyBatis insert语句默认返回的是插入的记录条数;
int userAdd(UserEntit user); //dao mapper层
<insert id="add" parameterType="UserEntity" useGeneratedKeys="true" keyProperty="id">
insert into ......
</insert>
返回值为插入的记录条数
user.getId()为插入记录的主键id
========================================================================
========================================================================
MyBatis insert批量插入
int batchInsert(@Param("list") List<User> userList);
<insert id="batchInsert" parameterType="java.util.List">
insert into t_user(username,password,age)
values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.username},#{item.password},age)
</foreach>
</insert>
========================================================================
MyBatis in
1. 当查询的参数只有一个时
1.1 如果参数的类型是List, 则在使用时,collection属性要必须指定为 list
findByIds(List<Long> ids)
<select id="findByIdsMap" resultMap="BaseResultMap">
Select
<include refid="Base_Column_List" />
from t_user where ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
1.2 如果参数的类型是Array,则在使用时,collection属性要必须指定为 array
findByIds(Long[] ids)
<select id="findByIdsMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_user where ID in
<foreach item="item" index="index" collection="array" open="(" separator="," close=")">
#{item}
</foreach>
</select>
2. 当查询的参数有多个时,例如 findByIds(String name, Long[] ids)
这种情况需要特别注意,在传参数时,一定要改用Map方式,这样在collection属性可以指定名称,下面是一个示例
Map<String, Object> params = new HashMap<String, Object>(2);
params.put("name", name);
params.put("ids", ids);
mapper.findByIdsMap(params);
<select id="findByIdsMap" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from tabs where ID in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</select>
========================================================================