一、增删改查

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. 使用转义字符

字符>>=<<="&
转义字符&gt;&gt;=&lt;&lt;=&quot;&apos;&amp;
where create_date_time >= #{startTime}
//改为
where create_date_time &gt;= #{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 t1
    cross join some_table t2
</select>

属性值也可以被用在 include 元素的 refid 属性里

<include refid="${include_target}"/>
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐