文章目录
MyBatis的CURD
1. Insert操作
- 普通添加
<insert id="addUsers" parameterType="com.fuful.domian.Users" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
insert into Users(uname, upwd) values (#{uname,jdbcType=VARCHAR},#{upwd,jdbcType=VARCHAR});
</insert>
- 批量添加
<!--foreach批处理-->
<insert id="addManyUsers" useGeneratedKeys="true" keyProperty="uid" keyColumn="uid">
insert into Users(uname, upwd) values
<foreach collection="list" item="item" separator=",">
(#{item.uname},#{item.upwd})
</foreach>
</insert>
2. select操作
- 条件查询
<select id="findByUserName" resultType="com.fuful.domian.Users">
SELECT <include refid="selStr" /> FROM Users where uname = #{parUserName,jdbcType=VARCHAR}
</select>
- 全部查询
<select id="findByAll" resultType="com.fuful.domian.Users">
SELECT <include refid="selStr" /> FROM Users
</select>
- 模糊查询
<!-- 第一个需要在传值的时候加%% -->
<!-- <select id="findByLikeUserName" resultType="com.fuful.domian.Users">-->
<!-- select uid,uname,upwd,addtime from Users where uname like #{parUserName,jdbcType=VARCHAR}-->
<!-- </select>-->
<select id="findByLikeUserName" resultType="com.fuful.domian.Users">
SELECT <include refid="selStr" /> FROM Users where uname like CONCAT('%',#{parUserName,jdbcType=VARCHAR},'%')
</select>
3. sql - 文字替换
- <sql>,<include>标签
- 配合<include refid = "selStr">标签使用
<!--sql替换-->
<sql id="selStr">uid,uname,upwd,addtime</sql>
<sql id="selStr2">uname,upwd</sql>
4. update操作
<update id="updateUpwd">
UPDATE Users SET upwd = #{newUpwd} where uid = #{uid}
</update>
5. delete操作
<!--foreach批处理-->
<delete id="delManyUsers">
delete from Users where uid in
<foreach collection="list" item="u" open="(" close=")" separator=",">
#{u.uid}
</foreach>
</delete>
UsersMapper接口
public interface UsersMapper {
int addUsers(Users users);
Users findByUserName(@Param("parUserName") String parUserName);
List<Users> findByAll();
List<Users> findByLikeUserName(@Param("parUserName") String parUserName);
int updateUpwd(@Param("uid") int uid,@Param("newUpwd") String newUpwd);
int addManyUsers(List<Users> manyUsers);
int delManyUsers(List<Users> manyUsers);
}
ps1: 数据库中可以使用字符串拼接的?
- mysql:mysql中使用+号
- Oracle:Oracle中使用||
1. Mysql的字符串拼接
- CONCAT():最常用的字符串拼接方法,但遇到拼接中的字符串出现null的情况会返回null
语法:CONCAT(string1,string2)
- CONCAT_WS():concat with separator,多了个分隔符功能;如果某个字符串为null,会忽略null,并返回其他字符串的值
语法:CONCAT_WS(separator,str1,str2,…)
代表 concat with separator ,是concat()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数
- GROUP_CONCAT():连接字段,多个值显示为一行
语法 :group_concat( [DISTINCT] 连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
连接的可以是多个字段,也可以对连接字段进行排序
- +号
2. Oracle的字符串拼接
Oracle的字符串拼接有两种方式:
- 采用 || 符号,用’||'来一次串连多个字串。
SELECT 'A' || 'B' from dual;//执行的结果就是AB
- 采用CONCAT进行连接,与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两个以上字符串的拼接;换言之,一次只能将两个字串串连起来
SELECT CONCAT('A','B') FROM dual;//执行结果也是AB
ps2: @Param注解
作用: 用注解来简化xml配置的时候(比如Mybatis的Mapper.xml中的sql参数引入),@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)。
实例说明:
- 使用@Param注解
Mapper接口方法:
public int getUsersDetail(@Param("userid") int userid);
对应Sql Mapper.xml文件:
<select id="getUserDetail" statementType="CALLABLE" resultMap="baseMap">
Exec WebApi_Get_CustomerList #{userid}
</select>
说明:
当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以,当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错。
- 不使用@Param注解
不使用@Param注解时,最好传递 Javabean。在SQL语句里就可以直接引用JavaBean的属性,而且只能引用JavaBean存在的属性。
Mapper接口方法:
public int getUsersDetail(User user);
对应Sql Mapper.xml文件:
<!--这里直接引用对象属性即可,不需要对象.属性的方式-->
<select id="getUserDetail" statementType="CALLABLE" resultMap="baseMap">
Exec WebApi_Get_CustomerList #{userid}
</select>
ps3: foreach批处理
foreach 作用是对一个集合进行遍历 通常用在构建IN条件语句
collection属性: 主要分3种情况:
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
- 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可
list对象默认用list作为键,array对象默认用array作为键,map没有默认的键 也可以使用@Param(“keyName”)来设置键。
使用实例
- 传入单参数List
// mapper接口
List<Role> getRolesByRoleIds(@Param("roleIds") List<Integer> roleIds);
// mapper sql 注意collection
<select id="getRolesByRoleIds" parameterType="java.util.List" resultMap="roleInfo">
SELECT role_id,role_name,valid FROM sys_role WHERE role_id IN
<foreach collection="roleIds" item="roleId" index="index" open="(" separator="," close=")">
#{roleId}
</foreach>
</select>
-
传入单参数array (类似于list)
-
传入多参数封装为map
// 多参数封装为map
Map ids = new HashMap<>();
ids.put("userId", userId);
ids.put("roleIds",roleIds);
this.roleOfUserMapper.addRoleOfUserByIds(ids);
// mapper 接口
int addRoleOfUserByIds(Map ids);
// mybatis sql
<insert id="addRoleOfUserByIds" parameterType="java.util.HashMap">
<selectKey keyProperty="serialNo" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT into sys_role_of_user(user_id, role_id, priority, start_date) VALUES
<foreach collection="roleIds" item="roleId" separator=",">
(#{userId},#{roleId},0,now())
</foreach>
</insert>