查看“基础:映射文件Mapper.xml”的源代码
←
基础:映射文件Mapper.xml
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Mybatis]] == 关于 == Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。 # 输入映射的类型可以是简单类型、hashmap、pojo的包装类型; # 输出映射的类型可以是简单类型、hashmap、pojo的包装类型; == 输入映射 == === parameterType === ==== 简单类型 ==== 略 ==== pojo对象 ==== * '''Mybatis使用ognl表达式解析对象字段的值''' UserMapper.xml: <syntaxhighlight lang="xml"> <!—传递pojo对象综合查询用户信息 --> <select id="findUserByUser" parameterType="user" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select> </syntaxhighlight> UserMapperTest.java: <syntaxhighlight lang="java"> Public void testFindUserByUser()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //构造查询条件user对象 User user = new User(); user.setId(1); user.setUsername("管理员"); //传递user对象查询用户列表 List<User>list = userMapper.findUserByUser(user); //关闭session session.close(); } </syntaxhighlight> Note: # Mapper中#{}或${}中的内容,与pojo对象的属性对应; ==== pojo包装对象 ==== 开发中通过pojo传递查询条件 ,查询条件是'''综合查询条件,这时可以使用包装对象传递输入参数'''。<br/> 如,将用户信息、用户购买商品信息都作为查询条件: User.java:<br/> (用户类,略) <syntaxhighlight lang="java"> </syntaxhighlight> UserCustom.java:(用户扩展类) <syntaxhighlight lang="java"> public class UserCustom extends User{ //可以扩展用户的信息 } </syntaxhighlight> UserQueryVo.java:(包装类) <syntaxhighlight lang="java"> public class UserQueryVo { //用户信息 private User user; //自定义用户扩展类 private UserCustom userCustom; //可以包装其它的查询条件,订单、商品 //.... } </syntaxhighlight> UserMapper.xml: <syntaxhighlight lang="xml"> <!— 查询用户列表 --> <select id="findUserList" parameterType="UserQueryVo" resultType="user"> select * from user where username = #{user.username} and sex = #{user.sex} </select> </syntaxhighlight> UserMapperTest.java:<br/> (测试类,略) <syntaxhighlight lang="java"> </syntaxhighlight> Note: # “UserQueryVo”、“user”均为设置的别名; # “#{user.username}”中,user即是传入的包装对象的属性,username为user的属性; ==== hashmap ==== UserMapper.xml: <syntaxhighlight lang="xml"> <!-- 传递hashmap综合查询用户信息 --> <select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select> </syntaxhighlight> UserMapperTest.java: <syntaxhighlight lang="java"> Public void testFindUserByHashmap()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //构造查询条件Hashmap对象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理员"); //传递Hashmap对象查询用户列表 List<User>list = userMapper.findUserByHashmap(map); //关闭session session.close(); } </syntaxhighlight> Note: # 传入参数类型“parameterType”为'''“hashmap”'''; # “#{id}”、“${username}%”分别为hashmap的两个键值对; # 测试类中的接口参数为'''“HashMap”'''; == 输出映射 == === resultType === * '''生成的动态代理对象(接口实现类):根据mapper方法的返回值类型,确定调用selectOne还是selectList。''' ==== 简单类型 ==== 略 ==== pojo对象 ==== 略 ==== pojo列表 ==== * 不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的,仅接口返回值类型不一样。 UserMapper.xml: <syntaxhighlight lang="xml"> <!-- 根据名称模糊查询用户信息 --> <select id="findUserByUsername" parameterType="string" resultType="user"> select * from user where username like '%${value}%' </select> </syntaxhighlight> UserMapper.java:(接口方法) <syntaxhighlight lang="java"> public List<User> findUserByUsername(String username) throws Exception; </syntaxhighlight> UserMapperTest.java: <syntaxhighlight lang="java"> Public void testFindUserByUsername()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //如果使用占位符号则必须人为在传参数中加% //List<User> list = userMapper.selectUserByName("%管理员%"); //如果使用${}原始符号则不用人为在参数中加% List<User> list = userMapper.findUserByUsername("管理员"); //关闭session session.close(); } </syntaxhighlight> Note: # 如果使用'''#{}'''占位符号则必须在传参数中加%:<syntaxhighlight lang="java" inline>userMapper.selectUserByName("%管理员%");</syntaxhighlight> # 如果使用'''${}'''原始符号则不用在参数中加%:<syntaxhighlight lang="java" inline>userMapper.findUserByUsername("管理员");</syntaxhighlight> ==== hashmap ==== 输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。<br/> <br/> '''【???】'''<br/> UserMapper.xml:【???】 <syntaxhighlight lang="xml"> <!-- 根据id查询用户信息 --> <select id="findUserNameById" parameterType="int" resultType="hashmap"> select username from user where id = #{id} </select> </syntaxhighlight> UserMapper.java: <syntaxhighlight lang="java"> public HashMap<String, String> findUserNameById(int id) throws Exception; </syntaxhighlight> UserMapperTest.java:【???】 <syntaxhighlight lang="java"> Public HashMap<String, String> testFindUserNameById() throws Exception { //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //通过mapper接口调用statement HashMap<String, String> map = userMapper.findUserById(1); System.out.println(map.get("username")); //关闭session session.close(); } </syntaxhighlight> === resultMap === <pre> resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。 </pre> UserMapper.xml: <syntaxhighlight lang="xml"> <!-- 定义resultMap --> <resultMap type="user" id="userResultMap"> <id column="id_" property="id"/> <result column="username_" property="username"/> </resultMap> ... <!-- 使用resultMap进行输出映射 --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_ FROM USER WHERE id=#{value} </select> </syntaxhighlight> UserMapperTest.java: <syntaxhighlight lang="java"> public List<User> findUserListResultMap() throws Exception; </syntaxhighlight> Note: {| class="wikitable" ! 标签 !! 说明 |- | <select id="" parameterType="" resultMap=""> | # resultMap:引用resultMap的id # '''如果这个resultMap在其它的mapper文件,前边需要加namespace''' |- | <resultMap type="" id=""> | # type:最终映射的pojo对象类型,可以使用别名 # id:唯一标识resultMap |- | : <id column="" property=""/> | rowspan="2"| # <id ...>:定义唯一标识映射 # <result ...>:定义普通名映射 # column:sql语句的列名 # property:最终映射的pojo对象类型(type="xxx")的属性名 |- | : <result column="" property=""/> |} == 动态sql == 动态sql是'''mybatis核心''',通过mybatis提供的各种标签方法实现动态拼接sql。 {| class="wikitable" |+ 动态sql的标签 ! 标签 !! 说明 !! 示例 |- | <if> | 判断 # test:判断语句 | rowspan="5"| UserMapper.xml: <syntaxhighlight lang="xml"> <sql id="query_user_where"> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!=''"> and user.sex = #{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!=''"> and user.username LIKE '%${userCustom.username}%' </if> <if test="ids!=null"> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> <!-- 每次遍历需要拼接的串 --> id=#{user_id} </foreach> </if> </if> <where> </sql> ... <!-- 用户信息综合查询 --> <select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom"> SELECT * FROM USER <!-- 引用一个或多个sql片段 --> <include refid="query_user_where"></include> </select> </syntaxhighlight> UserQueryVo.java: <syntaxhighlight lang="java"> public class UserQueryVo { private User user; //用户扩展类 private UserCustom userCustom; //传入多个用户id private List<Integer> ids; ... } </syntaxhighlight> |- | <where> | 条件标识 * <where>可以自动去掉第一个and |- | <foreach> | 使用foreach遍历传入sql的数组或List # collection:指定输入对象中集合属性 # item:遍历的对象 # open:开始遍历时拼接的串 # close:结束遍历时拼接的串 # separator:遍历中的两个对象之间需要拼接的串 |- | <sql>块 | 将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的 # id:块唯一标识sql |- | <include> | 引用<sql>块 # refid:引用的sql块id,格式“namespace.sql片段id” *(sql块可以位于其他namespace) |} == 参见【[http://wiki.eijux.com/%E5%85%A5%E9%97%A8%EF%BC%9A%E5%85%A5%E9%97%A8%E7%A8%8B%E5%BA%8F#.E5.85.A5.E9.97.A8.E5.B0.8F.E7.BB.93 入门小结]】 ==
返回至“
基础:映射文件Mapper.xml
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息