一、增删改查
1. 增:给数据库增加一个用户
<insert id="addUser" parameterType="User">insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
2. 删:根据id删除一个用户
<delete id="deleteUser" parameterType="int">delete from user where id = #{id}
</delete>
3. 改:修改用户的信息
<update id="updateUser" parameterType="User">update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>
4. 查:根据id查询用户
<select id="selectUserById" resultType="User">select * from user where id = #{id}
</select>
二、参数的传递
1. 直接在方法中传递参数
- 在接口方法的参数前加 @Param属性,Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型。接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!
User selectUserById(@Param("id") Int id);
User selectUserByNP(@Param("username") String username,@Param("pwd") String pwd);
- 如果参数是pojo类,那么就不用加@Param属性
int addUser(User user);
参数直接传递时,对应的mapper.xml语句和上面的一样
2. 使用万能的Map
如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
User selectUserByNP2(Map<String,Object> map);
使用map传参时,对应的mapper.xml需要对应修改:
<select id="selectUserByNP2" parameterType="map" resultType="User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
三、大于小于和xml标签解析冲突的写法
1. 使用转义字符
字符 | > | >= | < | <= | " | ’ | & |
---|---|---|---|---|---|---|---|
转义字符 | > | >= | < | <= | " | ' | & |
where create_date_time >= #{startTime}
//改为
where create_date_time >= #{startTime}
2. 将sql语句写在 <![CDATA[...]]> 中, 其中的特殊符号不进行解析.
where create_date_time <![CDATA[ >= ]]> #{startTime}
四、#{}和${}的区别
- #{}是预编译处理,${}是字符串替换。
- Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;
- Mybatis 在处理${}时,就是把${}替换成变量的值。
- 使用#{}可以有效的防止 SQL 注入,提高系统安全性
- 在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。
五、sql标签的使用
sql元素标签用来定义可重复使用的SQL代码片段,使用时只需要用include元素标签引用即可,最终达到SQL语句重用的目的;同时它可以被静态地(在加载参数) 参数化,不同的属性值通过包含的实例变化,比如:
方式一:
//建立sql片段
<sql id="query_user_where"><if test="id!=null and id!=''">and id=#{id}</if><if test="username!=null and username!=''">and username like '%${username}%'</if>
</sql>//使用include引用sql片段
<select id="findUserList" parameterType="user" resultType="user">select * from user<where><include refid="query_user_where"/></where>
</select>//引用其它mapper.xml的sql片段
<include refid="namespace.sql片段"/>
方式二:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
这个 SQL 片段可以被包含在其他语句中,例如:
<select id="selectUsers" resultType="map">select<include refid="userColumns"><property name="alias" value="t1"/></include>,<include refid="userColumns"><property name="alias" value="t2"/></include>from some_table t1cross join some_table t2
</select>
属性值也可以被用在 include 元素的 refid 属性里
<include refid="${include_target}"/>