MyBatis学习笔记(⼆)SQL映射XML⽂件标签select、insert、updat。。。⽂章⽬录
参考资料
⼀、MyBatis SQL映射⽂件——输⼊输出
学习⽬标:
掌握通过SQL映射⽂件进⾏增删改查
掌握参数的使⽤
掌握resultMap
1.1 SQL映射的XML⽂件 *l
SQL 映射 XML⽂件 的顶级标签(有前后顺序)
标签名属性 / 描述
mapper最外层标签,属性 namespace,⽤于指定Mapper接⼝类的引⽤位置,⽐如com.uni.UserMapper
cache配置给定命名空间的缓存
cache-ref从其他命名空间引⽤缓存配置
resultMap⽤来描述数据库结果集和对象的对应关系
sql可以重⽤的SQL块,也可以被其他语句引⽤
insert映射插⼊语句
update映射更新语句
delete映射删除语句
select映射查询语句
1.2 mapper 标签
属性:namespace 表⽰命名空间
namespace和⼦标签(select、insert、update等)的id 联合保证唯⼀,区别不同的mapper
绑定DAO接⼝
namespace的命名必须跟某个接⼝同名
接⼝中的⽅法与映射⽂件中SQL语句id⼀⼀对应
1.3 select 标签select 是MyBatis中最常⽤的元素之⼀
select 语句有很多属性可以详细配置每⼀条语句
属性
描述id
命名空间中唯⼀的标识符,接⼝中的⽅法与映射⽂件中SQL语句⼀ ⼀对应parameterType
传⼊SQL语句的参数类型resultType SQL语句返回值类型的完整类名或者别名
1.4 XML 中获取传⼊的参数
查询单个⽤户通常是需要指定id的,⽐如在mysql中是这样的:所以在接⼝中可以这样定义⽅法:
UserMapper.java
⽽在XML中如何获取到这个传⼊的参数呢?这⾥可以通过#{} 获取这个参数,若只有⼀个参数,parameterType 参数可以省略不写,#{}⾥的内容可任意填,不过只能取⼀个)#{}不能⽤于字符串拼接
测试:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper namespace ="com.uni.User "> <select id = "queryAllUser " ...> ... </select ></mapper >
1
2
34
5
6
7
8
9
10
11select * from user where id = 1;
1public interface UserMapper { User queryUserById (int id );}
1
2
3<!-- 根据ID 查询⽤户 --><select id ="queryUserById " resultType ="com.uni.pojo.User "> select * from smbms_user where id = #{id}</select >1
2
3
4@Test public void testQueryUserById (){ SqlSession sqlSession = MyBatisUtil .getSession (); User user = sqlSession .getMapper (UserMapper .class ).queryUserById (1); System .out .println (user ); sqlSession .close ();}
1
2
3
4
5
6
7
1.4.1 多参案例(⼀)模糊查询现使⽤ smbms_user 表的username⽤户名和sex性别两个字段来进⾏模糊查询,使⽤到的sql语句:这句话能查询带超字且性别为男的所有⽤户,现使⽤MyBatis实现,要点有:parameterType可不写
使⽤#{param1} 表⽰第⼀个参数原理:⾃动封装成Map类型的数据,key: param1 … paramN,或者参数的索引, value: 传⼊的参数值
⾃定义名称 @Param注解⽅式⼀:使⽤param按顺序取参UserMapper.java
1.4.2 多参实例(⼆)parameterType 模糊查询
paramterType参数的作⽤:指定SQL语句传⼊的参数类型
在XML中,配置了paramterType为实体类后可以使⽤#{实体类.成员变量}的⽅式来进⾏取值案例:根据⽤户的名称和性别进⾏模糊查询User.java
UserMapper.java select * from smbms_user where userName like CONCAT ('%超%') and sex = '男';
1List <User > queryUserLikeNameAndGender (String name , int gender );1<!-- 根据名称和性别进⾏
模糊查询 --><select id ="queryUserLikeNameAndGender " resultType ="com.uni.pojo.User "> select * from smbms_user where userName like CONCAT('%', #{param1}, '%') AND gender = #{param2}</select >
12
3
4List <User > queryUserLikeNameAndGender (@Param("userName") String name , @Param("gender") int gender );
1 <select id ="queryUserLikeNameAndGender" resultType ="com.uni.pojo.User"> select * from smbms_user where userName like CONCAT ('%', #{userName }, '%') AND gender = #{gender } </select >
1
2
3public class User { private Integer id ; //id private String userName ; //⽤户名称 private Integer gender ; //性别 ... //get 、set 、toString() 略}
1
2
3
4
5
6
7
Test.java
1.5 insert 标签
insert标签是实现sql的insert语句,所以必须指定paramterType属性,但可以没有resultType属性。⽐如:UserMapper.java
1.6 update 标签
主要属性:id 、parameterType 案例:修改密码
1.7 delete 标签
主要属性:id、parameterType 案例:删除指定id的⽤户
1<select id ="queryUserLikeNameAndGender " parameterType ="com.uni.pojo.User " resultType ="com.uni.pojo.User "> select * from smbms_user where userName like CONCAT('%', #{userName}, '%') AND gender = #{gender}</select >
1
2
3public void testQueryUserLikeNameAndGender (){ SqlSession sqlSession = MyBatisUtil .getSession (); User user = new User (); user .setUserName ("孙"); user .setGender (2); List <User > users = sqlSession .getMapper (UserMapper .class ).queryUserLikeNameAndGender (user ); users .forEach (u -> System .out .println (u )); sqlSession .close ();}
1
2
3
4
5
6
7
8
9void insertUser (User user );
1<insert id ="insertUser " parameter ="com.uni.pojo.User "> insert into smbms_user(userCode, userName, userPassword) values(#{userCode}, #{userName}, #{userPassword})</insert >
1
2
3<update id ="modify " parameter ="com.uni.pojo.User "> update smbms_user set userCode = #{userCode}, userName = #{userName}, userPassword=#{userPassword} where id = #{id}</update >
1
2
xml标签大全3<delete id = "deleteUserById " parameterType ="int "> delete from smbms_user where id = #{id}</delete >
1
2
3
1.8 ⼩结parameterType 基础数据类型int、String、Date等只能传⼊⼀个,通过#{参数名} 可获取传⼊的值复杂数据类型java实体类、Map等通过#{属性名} 或者 #{map的keyName}即可获取传⼊值${} ⼀般很少⽤ (不⽀持占位符的时候使⽤)resultType 返回基本类型、POJO类型返回List集合,resultType还是POJO类型返回Map集合,resultType还是POJO类型(不常⽤)指定返回的Map集合以id为key,也可指定对象别的属性为key
⼆、MyBatis SQL 映射⽂件 ——复杂查询
2.1 SQL 查询 - 关联表(外键关系)现有 smbms_user ⽤户表和smbms_role ⽤户⾓⾊表
⽤户表的userRole字段指定为⽤户⾓⾊表的ID
现若要显⽰⽤户信息包括⾓⾊的名称,需要⽤到多表查询,同样以模糊查询为例,查姓孙⽽且是普通员⼯的SQL语句如下:此时的结果是:@MapKey("id")public Map <Integer , User > findUserByNameReturnMap (@Param("lastName")String lastName );
12<select id ="findUserByNameReturnMap " resultType ="myUser "> select * from user where username like '${lastName}'</select >
1
2
3SELECT u .userName ,r .roleName FROM smbms_user AS u , smbms_role AS r WHERE u .userName LIKE CONCAT ('%', '孙', '%')AND u .userRole = 3 AND u .userRole = r .id
1
2
3
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论