Mybatis 的Mapper动态代理开发。
一、首先,需要在res下面新建几个包,包名分别为mapper,model(pojo),test,新建一个xml文件,名为sqlMapconfig。
二、目录:在包下面建立相应的文件。
1.mapper,这一个类别相当于dao+daoimpl层,里面包含“表名”mapper.java+“表名”mapper.xml两个文件,用于实现数据的增删改查。
2.model层是数据库中表的信息,后面可用逆向工程直接生成,里面还可以包含包装类QueryVo,用于数据的查询。
3.测试类是编写一个Junit测试来实现对数据库数据的简单查询。
4.sqlMapconfig,用于连接数据池,用来注入mapper文件所在位置。
三、详解
1.mapper
拿用户订单举例。
UserMapper.java是一个接口,里面是一些抽象方法,类似于dao层
UserMapper.xml文件是将这些方法实现,相当于Dao.Impl层,但是又不完全是,因为它需要遵循四个原则,见上图,只有名称相同了,才能进行动态代理开发。
在编写xml文件之前,需要给定命名空间namespace,用于隔离sql,还有一个很重要的作用,后面会讲
xml文件的头部信息:<?xml version="1.0" encoding="UTF-8" ?>
命名空间: ,值就是dao层下面的java文件的URL
xml文件中有很多的标签,<select><delete>等,都对应了相应的数据库操作,拿最简单的查询来说吧,根据用户ID查询用户,UserMapper.java中的方法名是:
public User findUserById(Integer id); 那么xml文件来实现这个方法的标签就应该如下写:
<select id="findUserById" parameterType="Integer" resultType="model.User">
select * from user where id=#{v}
</select>
其中, id要和java文件中的方法名相同,第二,parameterType要和java文件中的入参类型相同,最后,返回值是一个User对象。注意,如果返回值是对象,就要指明对象文件的位置所在.
下面是动态sql的信息:
其中sql片段要在前面做好定义,在标签中使用,采用include标签,
<!--sql 片段 -->
<sql id="select">select * from user</sql>
上面就是一个简单的sql片段
这是where if标签和foreach标签的使用
<!-- 根据用户姓名和性别动态查找用户 -->
<select id="selectUserBySexAndName" parameterType="User" resultType="User">
<include refid="select"></include> <!-- 引用前面的sql片段-->
<where >
<if test="sex!=null and sex!=''" >
sex=#{sex}
</if>
<if test="username!=null and username!=''" >
and username=#{username}
</if>
</where>
</select>
<select id="selectUserByIds" parameterType="QueryVo" resultType="User">
<include refid="select"></include>
<where>
<!-- 如果换用另外两种方法,idList就要换成array和list -->
<foreach collection="idList" item="id" open="id in (" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
idList是QueryVo里面定义的,QueryVo示例:
如果你需要通过QueryVo来查询,就要在里面定义好类型和变量,如果通过list查询所有信息,就要定义List idList;并且生成set和get方法。标签的入参属性改为QueryVo。
2.model
里面就是数据库的一些基本信息,没什么好说的,见下图:
3.test
test里面是对我们写的方法的调用和测试,先看例子:根据多个id查询用户:
前面五行是照常写的,后面建一个list集合,添加数据,然后set到波里面,通过实现类userMapper来调用当中的方法实现查询,最后输出。
附:sql语句的写法,一般写法,select * from user where id=#{v} ,里面的v可以随意写,特殊情况,select * from user where username like ‘%${value}%’,
insert: insert into user (username,birthday,sex,address)
value(#{username},#{birthday},#{sex},#{address})
update:update user
set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
在java中用?表示的,都要用 #{内容} 来代替。