目录

一.MyBatis的增删改查:

二.MyBatis获取参数值的两种方式

2.1  获取单个字面量类型的参数

2.2 获取多个字面量类型的参数

2.3 map集合类型的参数

2.4 实体类类型的参数

2.5 使用@Param标识参数

三.MyBatis的各种查询功能:

3.1.查询一个实体类对象

3.2  查询一个list集合

3.3 查询单个数据

3.5 查询多条数据为map集合

四.特殊SQL的执行

4.1.模糊查询

4.2.批量删除

4.3.动态设置表名

4.4 ​​​​​​​添加功能获取自增的主键

五.动态SQL

5.1 ​​​​​​​if

5.2 where

 where和if一般结合使用:

5.3 ​​​​​​​ trim

5.4choose、when、 otherwise

5.5 foreach


一.MyBatis的增删改查

  1.1新增

<!--int insertUser();-->
<insert id="insertUser">
     insert into t_user values(null,'admin','12356','男')
</insert>

1.2删除

<!--int deleteUser();-->
<delete id="deleteUser">
    delete from t_user where id = 1001
</delete>

1.3修改

<!--int updateUser();-->
<update id="updateUser">
   update t_user set username='mike',password='321' where id = 1002
</update>

1.4查询一个实体类对象

<!--User getUserById();-->
  <select id="getUserById" resultType="mybatis.bean.User">
    select * from t_user where id = 1002
  </select>

1.5查询list集合

<!--List<User> getUserList();-->
<select id="getUserList" resultType="mybatis.bean.User"> 
    select * from t_user
</select>

ps:

查询的标签select必须设置属性resultTyperesultMap,来设置实体类和数据库表的关系.

resultType:自动映射,用于属性名和表中字段名一致的情况

resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况


二.MyBatis获取参数值的两种方式

MyBatis获取参数值的两种方式:${}#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

${}: 

     1.#{}实现的是向prepareStatement中的预处理语句中设计参数值,sql语句中#{}表示一个占位符即?

     2.使用占位符#{}可以有效的防止sql注入,在使用时不需要关心参数值的类型,MyBatis会自动进行java类型和jdbc类型的转换。

    3.#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或是其他名称

#{}:

   1.通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换

   2.${}可以接收简单型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

   3.使用${}不能防止sql注入

ps: 

     ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;

     #{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时, 可以自动添加单引号


2.1  获取单个字面量类型的参数

mapper接口中的方法参数为单个的字面量类型

此时可以使用${}#{}以任意的名称获取参数的值,注意${}需要手动加单引号

2.2 获取多个字面量类型的参数

mapper接口中的方法参数为多个字面量类型时,

此时MyBatis会自动将这些参数放在一个map集合中,

arg0,arg1...为键,以参数为值;以param1,param2...为键,以参数为值;

因此只需要通过${}#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

2.3 map集合类型的参数

mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在

map

只需要通过${}#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

2.4 实体类类型的参数

mapper接口中的方法参数为实体类对象时

可以使用${}#{},通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号

2.5 使用@Param标识参数

可以通过@Param注解标识mapper接口中的方法参数

将这些参数放在map集合中,

@Param注解的value属性值为键,以参数为值;以param1,param2...为键,以参数为值;只需要通过${}#{}访问map集合的键就可以获取相对应的值,

注意${}需要手动加单引号


三.MyBatis的各种查询功能

3.1.查询一个实体类对象

/**

  *根据用户id查询用户信息

  *@param id

  *@return

*/

User getUserById(@Param("id") int id);
<!--User getUserById(@Param("id") int id);-->
<select id="getUserById" resultType="User"> 
    select * from t_user where id = #{id}
</select>

3.2  查询一个list集合

/**
  *查询所有用户信息
  *@return
*/
List<User> getUserList();
<!--List<User> getUserList();-->
<select id="getUserList" resultType="User"> 
   select * from t_user
</select>

ps:

当查询的数据为多条时,不能使用实体类作为返回值,

否则会抛出异常TooManyResultsException;

若查询的数据只有一条,可以使用实体类或集合作为返回值

3.3 查询单个数据


/**
*查询用户的总记录数
*@return
*在MyBatis中,对于Java中常用的类型都设置了类型别名
*例如: java.lang.Integer-->int|integer
*例如: int-->_int|_integer
*例如: Map-->map,List-->list
*/
int getCount();
<!--int getCount();-->
<select id="getCount" resultType="_integer"> 
  select count(id) from t_user
</select>

3.4 查询一条数据为map集合

/**
*根据用户id查询用户信息为map集合
*@param id
*@return
*/
Map<String, Object> getUserToMap(@Param("id") int id);
<!--Map<String, Object> getUserToMap(@Param("id") int id);-->
<!--结果: {password=123456, sex=男 , id=1, age=23, username=admin}-->
<select id="getUserToMap" resultType="map"> 
  select * from t_user where id = #{id}
</select>

3.5 查询多条数据为map集合

     ①方式一

/**
  *查询所有用户信息为map集合
  *@return
  *将表中的数据以map集合的方式查询,一条数据对应一个map;
  *若有多条数据,就会产生多个map集合,
  *此时可以将这些map放在一个list集合中获取
*/
List<Map<String, Object>> getAllUserToMap();

<!--Map<String, Object> getAllUserToMap();-->
<select id="getAllUserToMap" resultType="map"> 
   select * from t_user
</select>

       ②方式二
 

/**
*查询所有用户信息为map集合
*将表中的数据以map集合的方式查询,一条数据对应一个map;
*若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据。
*此时需要通过@MapKey注解设置map集合的键,值是每条数据所对应的map集合
*/ 
@MapKey("id")
Map<String, Object> getAllUserToMap();

<!--Map<String, Object> getAllUserToMap();-->
<!--
  {
    1={password=123456, sex=男, id=1, age=23, username=admin}, 
    2={password=123456, sex=男, id=2, age=23, username=张三},
    3={password=123456, sex=男, id=3, age=23, username=张三}
  }
-->
<select id="getAllUserToMap" resultType="map"> 
   select * from t_user
</select>

四.特殊SQL的执行

4.1.模糊查询

/**
 *测试模糊查询
 *@param mohu
 *@return
*/
List<User> testMohu(@Param("mohu") String mohu);

<!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultType="User">
  <!--select * from t_user where username like '%${mohu}%'-->
  <!--select * from t_user where username like concat('%',#{mohu},'%')--> 
  select * from t_user where username like "%"#{mohu}"%"
</select>

4.2.​​​​​​​批量删除


/**
  *批量删除
  *@param ids
  *@return
*/
int deleteMore(@Param("ids") String ids);

<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
   delete from t_user where id in (${ids})
</delete>

4.3.动态设置表名

/**
  *动态设置表名,查询所有的用户信息
  *@param tableName
  *@return
*/
List<User> getAllUser(@Param("tableName") String tableName);
<!--List<User> getAllUser(@Param("tableName") String tableName);-->
  <select id="getAllUser" resultType="User"> 
    select * from ${tableName}
  </select>

4.4 ​​​​​​​添加功能获取自增的主键


/**
 *添加用户信息
 *@param user
 *@return
 *useGeneratedKeys:设置使用自增的主键
 *keyProperty:因为增删改有统一的返回值是受影响的行数,
 *因此只能将获取的自增的主键放在传输的参 数user对象的某个属性中
*/
int insertUser(User user);
<!--int insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
 insert into t_user values(null,#{username},#{password},#{age},#{sex})
</insert>

五.动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了 解决 拼接SQL语句字符串时的痛点问题。

5.1 ​​​​​​​if

    if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之 标签中的内容不会执行
​​​​​​​


<!--List<Emp> getEmpListByCondition(Emp emp);-->
<select id="getEmpListByMoreTJ" resultType="Emp"> 
   select * from t_emp where 1=1
  <if test="ename != '' and ename != null"> 
     and ename = #{ename}
  </if>
  <if test="age != '' and age != null"> 
     and age = #{age}
  </if>
  <if test="sex != '' and sex != null"> 
     and sex = #{sex}
   </if>
</select>

5.2 where

 whereif一般结合使用:

1.where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字

2.where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and去掉

注意:where标签不能去掉条件最后多余的and

<select id="getEmpListByMoreTJ2" resultType="Emp"> select * from t_emp
<where>
  <if test="ename != '' and ename != null"> 
    ename = #{ename}
  </if>
  <if test="age != '' and age != null"> 
    and age = #{age}
  </if>
  <if test="sex != '' and sex != null"> 
    and sex = #{sex}
  </if>
</where>
</select>

5.3 ​​​​​​​ trim

trim用于去掉或添加标签中的内容

常用属性:

prefix:在trim标签中的内容的前面添加某些内容

prefixOverrides:在trim标签中的内容的前面去掉某些内容s

uffix:在trim标签中的内容的后面添加某些内容suffix

Overrides:在trim标签中的内容的后面去掉某些内容

<select id="getEmpListByMoreTJ" resultType="Emp">
   select * from t_emp
 <trim prefix="where" suffixOverrides="and">
   <if test="ename != '' and ename != null">
     ename = #{ename} and
   </if>
   <if test="age != '' and age != null"> 
     age = #{age} and
   </if>
   <if test="sex != '' and sex != null"> 
     sex = #{sex}
   </if>
 </trim>
</select>

5.4choosewhenotherwise

这三个相当于if...else if..else


<!--List<Emp> getEmpListByChoose(Emp emp);-->
<select id="getEmpListByChoose" resultType="Emp">
  select <include refid="empColumns"></include> from t_emp
  <where>
  <choose>
  <when test="ename != '' and ename != null"> 
    ename = #{ename}
  </when>
  <when test="age != '' and age != null"> 
    age = #{age}
  </when>
  <when test="sex != '' and sex != null"> 
    sex = #{sex}
  </when>
  <when test="email != '' and email != null"> 
    email = #{email}
  </when>
</choose>
</where>
</select>

5.5 foreach

<!--int insertMoreEmp(List<Emp> emps);-->
<insert id="insertMoreEmp"> 
  insert into t_emp values
<foreach collection="emps" item="emp" separator=","> (
   null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)
</foreach>
</insert>

<!--int deleteMoreByArray(int[] eids);-->
  <delete id="deleteMoreByArray"> 
    delete from t_emp where
  <foreach collection="eids" item="eid" separator="or"> 
    eid = #{eid}
  </foreach>
  </delete>
<!--int deleteMoreByArray(int[] eids);-->
  <delete id="deleteMoreByArray"> 
    delete from t_emp where eid in
  <foreach collection="eids" item="eid" separator="," open="(" close=")">
   #{eid}
  </foreach>
</delete>

5.6​​​​​​​ SQL片段

sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入


<sql id="empColumns"> 
   eid,ename,age,sex,did
</sql>
select <include refid="empColumns"></include> from t_emp

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐