微信搜索《Java鱼仔》,每天一个技术难点不错过
在前面一章中我们对mybatis的基本环境进行了配置,并实现了最简单的select语句查询,在这一章中,我将对Mybatis实现更多复杂查询以及优化进行讲解。
(一)xml结构分析
通过下面这个例子先对mapper.xml结构进行讲解
<mappernamespace="com.javayz.mapper.UserMapper"><selectid="getUserById"resultType="com.javayz.pojo.User"parameterType="int"> select * from user where id=#{id}; </select></mapper>
namespace:在XXXmapper.xml中,我们首先需要通过namespace定位接口,这里要填的是这个xml所对应的接口全限定名。
id:id对应于namespace接口下的方法名
resultType:resultType对应于返回值类型,这里返回的是User,就需要写上User的全限定名。
parameterType:参数类型,这里我们通过id查询,所以参数填写的是int 另外还有一个面试题中会出现的问题,#{}和${}有什么区别:
1、#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值;
2、${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值。
更多关于xml映射的内容可以参考官方中文文档对这部分的解释,十分详细。
(二)Mybatis基本增删改查
Mybatis实现增删改查很简单,在前面一篇博客中已经把mybatis的环境搭建完成,这里就直接进行增删改查:
首先在UserMapper下新建四个接口实现增删改查:
publicinterfaceUserMapper { //根据id查询用户UsergetUserById(intid); //插入一个用户intinsertUser(Useruser); //更新用户名intupdateUser(Useruser); //删除该用户intdeleteUser(intid); }
在对应的UserMapper.xml中编写sql
<mappernamespace="com.javayz.mapper.UserMapper"><selectid="getUserById"resultType="com.javayz.pojo.User"parameterType="int"> select * from user where id=#{id}; </select><insertid="insertUser"parameterType="com.javayz.pojo.User"> insert into user(id,name) values(#{id},#{name}); </insert><updateid="updateUser"parameterType="com.javayz.pojo.User"> update user set name = #{name} where id = #{id}; </update><deleteid="deleteUser"parameterType="int"> delete from user where id = #{id}; </delete></mapper>
最后编写测试类
publicvoidtestAll(){ //获取SqlSessionSqlSessionsqlSession=MybatisUtils.getSqlSession(); //执行SqlUserMappermapper=sqlSession.getMapper(UserMapper.class); //测试查询Useruser=mapper.getUserById(1); System.out.println(user); //测试新增Useruser2=newUser(3,"javayz2"); mapper.insertUser(user2); //注意增删改之后需要调用commit方法sqlSession.commit(); System.out.println(mapper.getUserById(3)); //测试修改Useruser3=newUser(3,"javayz3"); mapper.updateUser(user3); sqlSession.commit(); System.out.println(mapper.getUserById(3)); //测试删除mapper.deleteUser(3); sqlSession.commit(); System.out.println(mapper.getUserById(3)); }
最后结果如下:
需要注意的是,在增删改之后,需要执行sqlSession.commit();提交事务。
(三)使用Map传入更多参数
在前面基本增删改查中,我们传入的parameterType都是一种类型,比如int,或者是User,但是更多时候我们传入sql中的参数不会这样简单,所以Map很完美的解决了这个问题。
新建一个传入map新建用户的接口方法:
//使用map插入一个用户intinsertUserByMap(Map<String,Object>map);
在对应的xml中编写sql语句,注意将parameterType替换为map
<insertid="insertUserByMap"parameterType="map"> insert into user(id,name) values(#{id},#{name}); </insert>
这里传入的值就是map里定义的键值对,map传递数据,只需要取出对应的key就可以了,测试一下:
publicvoidtestInsertByMap(){ SqlSessionsqlSession=MybatisUtils.getSqlSession(); UserMappermapper=sqlSession.getMapper(UserMapper.class); Map<String,Object>map=newHashMap<String, Object>(); map.put("id",4); map.put("name","javayz4"); mapper.insertUserByMap(map); sqlSession.commit(); }
(四)基于注解的开发实现
基于注解的开发可以让代码逻辑变得很简单,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪,因此如何选择,需要考虑业务场景:
4.1 配置文件中引入接口类
<mappers><mapperclass="com.javayz.mapper.UserMapper"/></mappers>
publicinterfaceUserMapper { //根据id查询用户"select * from user where id=#{id}") (UsergetUserById(intid); }
4.3 测试
publicvoidtestSelect(){ //获取SqlSessionSqlSessionsqlSession=MybatisUtils.getSqlSession(); //执行SqlUserMappermapper=sqlSession.getMapper(UserMapper.class); Useruser=mapper.getUserById(4); System.out.println(user); sqlSession.close(); }
增删改查示例:
//根据id查询用户"select * from user where id=#{id}") (UsergetUserById(intid); //新增用户"insert into user values(#{id},#{name})") (intinsertUser( ("id")intid, ("name")Stringname); //更新数据"update user set name='java6' where id=#{id}") (intupdateUserById(intid); //删除数据"delete from user where id=#{id}") (intdeleteUserById(intid);
在新增用户中,我们这里使用到了@Param注解:当有两个或两个以上参数的时候,必须要加上@Param注解
(五)总结
到这里为止,你已经可以用Mybatis进行增删改查,如果只是做业务,这些就足够了,但是我们怎么只能满足于此,下面开始对Mybatis进行更深入的讲解。