MyBatis基础语法详解,真的全面
关于Mybatis学习的一点经验分享,简单易懂
目录
一.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必须设置属性resultType或resultMap,来设置实体类和数据库表的关系.
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
where和if一般结合使用:
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.4choose、when、 otherwise
这三个相当于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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)