Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却很是简单,我上篇文章语句讲了Mybatis的搭建以及核心配置的讲解,接下来我们就一块儿来看看Mybatis另外一个重要的元素-SQL映射文件
首先先介绍一下SQL映射文件的几个顶级元素配置java
接下来我就逐一的为你们介绍sql
<!--根据用户名称查询用户列表(模糊查询)--> <select id="getUserListByUserName" resultType="User" parameterType="string"> select * from user_info where userName like CONCAT('%',#{userName},'%') </select>
上面这段代码是一个id为getUserListByUserName的映射语句,参数类型为string,返回结果的类型是User,注意参数的传递使用#{参数名},它告诉Mybatis生成PreparedStatement参数,对于JDBC,该参数会被标识为“?”,若采用JDBC来实现,那代码就得换一下方式了数据库
String sql="select * from user_info where userName like CONCAT('%',?,'%')"; PreparedStatement ps=conn.preparedStatement(sql); ps.setString(1,userName);
从上面两端代码我相信你们都能看出区别,Mybatis节省了大量的代码,我相信你们会喜欢上它的
接下来我来介绍一下select映射语句中的家庭成员吧!编程
接下来我就用一个实例来向你们演示一下
首先我弄了一个以用户名、用户角色来查询用户列表的功能,我们先建立UserMapper.java文件缓存
public interface UserMapper { public List<User> getUserList(Map<String,String> userMap); }
从上面你们能够看到我用来一个集合来接受返回的结果集,而且传递的参数是一个user对象数据结构
下面再来编写UserMapper.xml文件的主体内容app
<!--查询用户列表(参数:对象入参)--> <select id="getUserList" resultType="user" parameterType="Map"> select u.*,r.roleName from smbms_user u,smbms_role r where u.userName like CONCAT('%',#{userName},'%') and u.userRole=#{userRole} and u.userRole=r.id </select>
上面即是我们这次测试的查询映射语句了,这和我在上面说的映射语句区别不大,惟一大点的区别就在于参数类型,这的参数类型我换成了一个Map集合。
接下来就能够去测试了。测试
@Test public void getUserList(){ SqlSession sqlSession=null; List<User> userList=new ArrayList<User>(); try{ sqlSession=MyBatisUtil.createSqlSession(); Map<String,String> userMap=new HashMap<String,String>(); userMap.put("uName","赵"); userMap.put("uRole","3"); userList=sqlSession.getMapper(UserMapper.class).getUserListMap(userMap); }catch(Exception e){ e.printStackTrace(); }finally{ MyBatisUtil,closeSqlSession(sqlSession); } for(User user:userList){ logger.debug("testGetUserList userCode:"+user.getUserCode()+"and userName:"+user.getUserName()); } }
接下来讲说resultMap,咱们为何要用resultMap呢?
用小编的话说:当咱们要使用的查询映射语句是须要关联多表的时候,那么一个实体类的字段就不够用了,好比User表中有一个部门ID,而部门ID又对应了部门表,咱们想查询部门名称而不是查询部门ID,这时候咱们就要在User实体类中加入一个部门名称属性,且该属性的类型为部门实体类, 到这咱们就须要使用resultMap了spa
<select id="getUserList" resultMap="user" parameterType="Map"> select u.*,r.roleName from smbms_user u,smbms_role r where u.userName like CONCAT('%',#{userName},'%') and u.userRole=#{userRole} and u.userRole=r.id </select> <resultMap id="userList" type="User"> <result property="userRole" column="roleName"/> </resultMap>
resultMap元素用来描述如何将结果集映射到java对象,此处使用resultMap对列表展现所需的必要字段来进行自由映射。接下来看看resultMap元素的属性值和子节点吧debug
Mybatis中对查询进行select映射的时候,返回类型能够用resultType,也能够用resultMap,那么resultType和resultMap到底有何关联呢?接下里小编就作一下详细的讲解
resultType直接表示返回类型,包括基础数据库类型和复杂数据类型
resultMap则是对外部resultMap定义的引用,对外部resultMap的ID,表示返回结果映射到哪个resultMap上,它的应用场景通常是:数据库字段信息与对象属性不一致或者须要作复杂的联合查询以便自由控制映射结果。
在Mybatis的select元素中,resultType和resultMap本质上是同样的,都是Map数据结构,但须要明确的一点:resultType属性和resultMap属性绝对不能同时存在,只能两者选其一。
接下来讲说使用Mybatis实现增删改的操做,其实这几个操做都大同小异(小编认为的)。
<insert id="add" parameterType="User"> INSERT INTO `smbms`.`smbms_user`(`userCode`, `userName`, `userPassword`, `gender`, `birthday`, `phone`, `address`, `userRole`, `createdBy`, `creationDate`) VALUES (#{userCode}, #{userName}, #{userPassword}, #{gender}, #{birthday}, #{phone}, #{address}, #{userRole}, #{createdBy}, #{creationDate}) </insert>
<update id="modify" parameterType="User"> update smbms_user set userCode=#{userCode} where id=#{uId} </update>
<delete id="del" parameterType="User"> delete from smbms_user where id=#{id} </delete>
从上面的操做中能够看出其实这三种操做都差很少,其中的属性也都见过哈!那么小编在这就很少作介绍了,上面我所说的都是SQL映射文件最基础的一些东西,后面还有动态SQL之类的我在这就不作介绍了,感兴趣的童鞋能够去查查(我以为阔以),ok,以上就是本章所介绍的,感谢你们的观赏!