Mapper映射器
Mapper映射器是开发者创建绑定映射语句的接口,映射器的实例可以从SqlSession中获得,具体步骤为:
1、首先根据Mapper映射描述文件编写一个Mapper接口,接口方法名和SQL映射描述定义的SQL-ID属性保持一致。
2、再利用SqlSession提供的getMapper(…)方法,会自动返回一个Mapper接口实例。
XXX mapper = session.getMapper(XXX.class);
简化写法,可以把sql语句的xml文件映射到一个接口中,从而删除dao层。
步骤:
1、新建一个mapper包
2、mapper包中新建一个接口,名称:实体类名称+Mapper
package com.cykj.mapper;
import com.cykj.entity.Foreuser;
import java.util.List;
public interface ForeUserMapper {
//添加用户
public int addForeUser(Foreuser foreuser);
//删除用户
public int deleteForeUser(long fuId);
//修改用户密码
public int updateForeUser(long fuId,String fuPwd);
//查询所有用户列表
public List<Foreuser> selectAllForeUser();
//根据用户名模糊查找,带分页
public List<Foreuser> selectForeUserByName(String fuName,int pageNo);
}
3、在namespace中完成关联
4、sql的xml文件中的id要和mapper接口中的方法要一一对应
5、通过sqlSession.getMapper(接口.class)获得一个接口的实例
SqlSession sqlSession = MybatisDbHelper.getSession();
//获得一个ForeUserMapper接口的实例
ForeUserMapper mapper = sqlSession.getMapper(ForeUserMapper.class);
6、调用接口中的方法即可
import com.cykj.MybatisDbHelper;
import com.cykj.dao.ForeUserDao;
import com.cykj.dao.ForeUserDaoImpl;
import com.cykj.entity.Foreuser;
import com.cykj.mapper.ForeUserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyTest2 {
SqlSession sqlSession = MybatisDbHelper.getSession();
//获得一个ForeUserMapper接口的实例
ForeUserMapper mapper = sqlSession.getMapper(ForeUserMapper.class);
@Test
public void addForeUser(){
Foreuser foreuser = new Foreuser();
foreuser.setFuName("cykj005");
foreuser.setFuPwd("123456");
foreuser.setRealName("刘备2");
foreuser.setCardType(1);
foreuser.setCardNo("3522.......");
foreuser.setEmail("110@qq.com");
foreuser.setPhone("152.....");
foreuser.setTravelType(1);
int i = mapper.addForeUser(foreuser);
sqlSession.commit();
System.out.println(i);
}
@Test
public void deleteForeUser(){
int i = mapper.deleteForeUser(15);
sqlSession.commit();
System.out.println(i);
}
@Test
public void updateForeUser(){
Map map = new HashMap();
map.put("fuId",1);
map.put("fuPwd","7777777");
int i = mapper.updateForeUser(map);
sqlSession.commit();
System.out.println(i);
}
@Test
public void selectAllForeUser(){
List<Foreuser> list = mapper.selectAllForeUser();
for(Foreuser foreuser:list){
System.out.println(foreuser);
}
}
}
多参数传参:
1、使用map
//执行sql
Map map = new HashMap();
map.put("fuId",fuId);
map.put("fuPwd",fuPwd);
int i = sqlSession.update("updateForeUser",map);
2、使用注解
public ForeUser login(@Param(value="account") String account,@Param(value="password") String password);
使用注解后parameterType可以不用写
动态sql语句:
1、if元素
if元素是简单的条件判断逻辑,满足指定条件时追加if元素内的SQL,不满足条件时不追加,使用格式如下
<select...>
SQL语句1
<if test="条件表达式">
SQL语句2
</if>
</select>
2、where元素
where元素主要是用于简化查询语句中where部分的条件判断,where元素可以在<where>元素所在位置输出一个where关键字,而且还可以将后面条件多余的and或or关键字去除,与其他元素搭配使用。
where使用格式如下:
<select...>
select 字段 from 表
<where>
动态追加条件
</where>
//映射接口
//动态sql
public List<Foreuser> selectForeUser(@Param(value = "fuName") String fuName,
@Param(value = "travelType") long travelType);
//sql语句
<select id="selectForeUser" resultType="com.cykj.entity.Foreuser">
select * from foreUser where 1=1
<if test="fuName!=null and fuName!=''">
and fuName like concat("%",#{fuName},"%")
</if>
<if test="travelType>0">
and travelType=#{travelType}
</if>
</select>
//测试方法
@Test
public void selectForeUser(){
List<Foreuser> list = mapper.selectForeUser(null,0);
for(Foreuser foreuser:list){
System.out.println(foreuser);
}
}
3、foreach元素(批量操作)
reach元素实现了循环逻辑,可以进行一个集合的迭代,主要用在构建in条件中。foreach使用示例如下:
<select>
select 字段 from 表 where 字段 in
<foreach collection="集合" item=“迭代变量”
open=“("separator="," close=")">#{迭代变量}
</foreah>
</select>
foreach元素非常强大,它允许指定一个集合,声明集合项和索引变量,这些变量可以用在元素体内。它也允许指定开放和关闭的字符串,在迭代之间放置分隔符。
//映射接口方法
//批量添加
public int addForeUserList(List<Foreuser> list);
//单元测试方法
@Test
public void addForeUserList(){
List<Foreuser> list = new ArrayList<Foreuser>();
for(int i=0;i<5;i++){
Foreuser f = new Foreuser();
f.setFuName("");
}
}
//sql语句
<insert id="addForeUserList" parameterType="java.util.List">
insert into foreUser
(fuName,fuPwd,realName,cardType,cardNo,email,phone,travelType)
values
<foreach collection ="list" item="foreUser" separator ="," open="(" close=")">
#{reddemCode.batchId},
#{reddemCode.code},
#{reddemCode.type},
#{reddemCode.facevalue},
#{reddemCode.createUser},
#{reddemCode.createTime}
</foreach >
(#{fuName},#{fuPwd},#{realName},#{cardType},#{cardNo},#{email},#{phone},#{travelType})
</insert>
关联映射:
1、一对一:
<select id="findById" parameterType="java.lang.Integer" resultMap= "empMap">
select e.empno,e.ename,e.job,e.mgr,e.sal,e.comm,e.hiredate,e.deptno,
d.dname,d.loc from EMP e join DEPT d on(d.deptno=e.deptno)
where e.EMPNO=#{id}
</select>
<resultMap type="Emp" id="empMap">
<id property="empno" column="EMPNO" />
<result property="ename" column="ENAME" />
<result property="job" column="JOB" />
<result property="mgr" column="MGR" />
...
<association property="dept" column="DEPTNO" javaType="Dept">
<id...
<result...
</association>
</resultMap>
//查找后台用户
public List<Tbluser> selectTblUser();
<select id="selectTblUser" resultMap="role">
select * from tbluser a LEFT JOIN tblrole b on a.roleId=b.roleId
</select>
<resultMap id="role" type="com.cykj.entity.Tbluser">
<id property="userId" column="userId" />
<result property="roleId" column="roleId" />
<result property="userName" column="userName" />
<result property="userPwd" column="userPwd" />
<result property="realName" column="realName" />
<association property="tblrole" javaType="com.cykj.entity.Tblrole">
<id property="roleId" column="roleId" />
<result property="roleName" column="roleName" />
</association>
</resultMap>
@Test
public void selectTblUser(){
List<Tbluser> list = mapper.selectTblUser();
for(Tbluser tbluser:list){
System.out.println(tbluser.getTblrole().getRoleName());
}
}
2、一对多:
当利用findById查询时,会执行定义SQL语句,将DEPT字段值封装成Dept对象,EMP字段封装成Emp对象集合,然后将Emp对象集合给Dept对象的emps属性赋值
<select id="findById" parameterType="java.lang.Integer" resultMap= "deptEmpsResult">
select d.deptno,d.dname,d.loc,e.empno,e.ename,e.job,e.mgr,e.sal,
e.comm,e.hiredate from EMP e join DEPT d on(d.deptno=e.deptno)
where d.deptno = #{deptno}
</select>
<resultMap id="deptEmpsResult" type="Dept">
<id property="deptno" column="DEPTNO" />
<result property="dname" column="DNAME" />
<result property="loc" column="LOC" />
<collection property="emps" ofType="Emp">
<id property="empno" column="EMPNO" />
<result property="ename" column="ENAME" />
<result ...
</collection>
</resultMap>
//一对多:一个用户有多个订单
public List<Foreuser> selectForeUser2();
<select id="selectForeUser2" resultMap="order">
select * from foreuser a join tblorder b on a.fuId=b.fuId
</select>
<resultMap id="order" type="com.cykj.entity.Foreuser">
<id property="fuId" column="fuId" />
<result property="fuName" column="fuName" />
<result property="fuPwd" column="fuPwd" />
<result property="realName" column="realName" />
<result property="cardType" column="cardType" />
<result property="cardNo" column="cardNo" />
<result property="email" column="email" />
<result property="phone" column="phone" />
<result property="travelType" column="travelType" />
<collection property="tblorderList" ofType="com.cykj.entity.Tblorder">
<id property="oId" column="oId" />
<result property="fuId" column="fuId" />
<result property="startStationId" column="startStationId" />
<result property="endStationId" column="endStationId" />
<result property="status" column="status" />
<result property="seatNo" column="seatNo" />
<result property="carNo" column="carNo" />
</collection>
</resultMap>
@Test
public void selectForeUser2(){
List<Foreuser> list = mapper.selectForeUser2();
for(Foreuser foreuser:list){
System.out.println(foreuser);
}
}