您的位置:首页 > 移动开发

mybatis的mapper代理方法来实现

2018-03-31 11:02 489 查看
mapper代理方法来实现(实际开发用到的)

1、pom.xml文件一样

2、SqlMappingConfig.xml一样

3、开发规范:编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。

接口UserMapping.xml文件(可能有点多、挑着看就好)

(注意在SqlMappingConfig.xml文件中已经引用它)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- mapper代理开发规范 -->
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 -->
<!-- 注意:使用mapper代理方法开发,namespace有特殊重要的作用,namespace等于mapper接口地址 -->
<mapper namespace="cn.com.mybatis.mapper.UserMapper">

<!-- 定义sql片段 -->
<!-- id:sql片段的唯 一标识 -->
<!-- 经验:是基于单表来定义sql片段,这样话这个sql片段可重用性才高 在sql片段中不要包括 where -->
<sql id="query_user_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>
</sql>

<!-- 已经指定好别名! -->
<!-- 运用sql片段   -->
<!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值  -->
<!-- ${userCustom.username}:取出pojo包装对象中用户名称 -->
<select id="findUserList" parameterType="UserQueryVo"
resultType="UserCustom">
SELECT * FROM USER
<!-- where可以自动去掉条件中的第一个and -->
<where>
<!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
<include refid="query_user_where"></include>
<!-- 在这里还要引用其它的sql片段 -->
</where>
</select>

<!-- 用户信息综合查询总数 parameterType:指定输入类型和findUserList一样 resultType:输出结果类型 -->
<select id="findUserCount" parameterType="UserQueryVo"
resultType="int">
SELECT count(*) FROM USER
<!-- where可以自动去掉条件中的第一个and -->

e167
<where>
<!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前边加namespace -->
<include refid="query_user_where"></include>
<!-- 在这里还要引用其它的sql片段 -->
</where>
</select>

<!-- 在 映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过 select执行数据库查询 -->
<!-- id:标识 映射文件中的 sql -->
<!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->
<!-- parameterType:指定输入 参数的类型,这里指定int型 -->
<!-- #{}表示一个占位符号 -->
<!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->
<!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->
<!-- mapper开发代理规范2:UserMapper 接口中的接口方法名跟id名一样 -->
<!-- mapper开发代理规范3:UserMapper 接口中的返回类型名跟resultType类型一样 -->
<!-- mapper开发代理规范 4:UserMapper 接口中的参数类型名跟parameterType类型一样 -->
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id=#{value}
</select>

<!-- 根据用户名称模糊查询用户信息,可能返回多条 resultType:指定就是单条记录所映射的java对象 类型 ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
使用${}拼接sql,引起 sql注入 ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->
<select id="findUserByName" parameterType="java.lang.String"
resultType="user">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>

<!-- 定义resultMap -->
<!-- 将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系 -->
<!-- type:resultMap最终映射的java对象类型,可以使用别名 -->
<!-- id:对resultMap的唯一标识 -->
<resultMap type="user" id="userResultMap">
<!--id表示查询结果集中唯一标识 -->
<!--column:查询出来的列名 -->
<!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
<id column="id_" property="id" />
<!--result:对普通名映射定义 -->
<!--column:查询出来的列名 -->
<!--property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) -->
<result column="username_" property="username" />
</resultMap>

<!-- 使用resultMap进行输出映射 -->
<!--resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace -->
<select id="findUserByIdResultMap" parameterType="int"
resultMap="userResultMap">
SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>
</mapper>


UserMapping.java类

import java.util.List;

import cn.com.czy.mybatis.pojo.User;

/**
* 总结:
* 1、mapper代理方式、理解mapper开发规范
* 2、mapper文件是usermapper.xml
* 3、了解动态sql、别名、sql代码片、
* 4、了解  resultMap
*
* <p>
* Title: UserMapper
* </p>
* <p>
* Description: mapper接口,相当 于dao接口,用户管理
* </p>
*/
public interface UserMapper {

// 根据id查询用户信息
public User findUserById(int id) throws Exception;

// 根据用户名列查询用户列表
public List<User> findUserByName(String name) throws Exception;

// 根据id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id) throws Exception;

// 用户信息综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;

// 用户信息综合查询总数
public int findUserCount(UserQueryVo userQueryVo) throws Exception;

// 插入用户
public void insertUser(User user) throws Exception;

// 删除用户
public void deleteUser(int id) throws Exception;

}


包装类、继承类(这些只是为了以后更好的拓展罢了)

UserMapping的子类

/**
* 总结:
* 1、mapper代理方式、理解mapper开发规范
* 2、mapper文件是usermapper.xml
* 3、了解动态sql、别名、sql代码片、
* 4、了解  resultMap
*
* <p>Title: UserCustom</p>
* <p>Description: 用户的扩展类</p>
*/
public class UserCustom extends User{

//可以扩展用户的信息

}


UserMapping的包装类

/**
* 总结:
* 1、mapper代理方式、理解mapper开发规范
* 2、mapper文件是usermapper.xml
* 3、了解动态sql、别名、sql代码片、
* 4、了解  resultMap
*
* <p>Title: UserQueryVo</p>
* <p>Description:包装类型 </p>
*/
public class UserQueryVo {

//在这里包装所需要的查询条件

//用户查询条件
private UserCustom userCustom;

public UserCustom getUserCustom() {
return userCustom;
}

public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}

//可以包装其它的查询条件,订单、商品
//....
}


3.5测试类

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

/*
*
* 总结:
* 1、mapper代理方式、理解mapper开发规范
* 2、mapper文件是usermapper.xml
* 3、了解动态sql、别名、sql代码片、
* 4、了解  resultMap
*
*/
public class UserMapperTest {

private SqlSessionFactory sqlSessionFactory;

// 此方法是在执行testFindUserById之前执行
@Before
public void setUp() throws Exception {

// mybatis配置文件
String resource = "config/SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);

// 创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}

//用户信息的综合 查询
@Test
public void testFindUserList() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//创建包装对象,设置查询条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("郑游");
userQueryVo.setUserCustom(userCustom);

//调用userMapper的方法
List<UserCustom> list = userMapper.findUserList(userQueryVo);

System.out.println(list);
}

@Test
public void testFindUserCount() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//创建包装对象,设置查询条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("郑游");
userQueryVo.setUserCustom(userCustom);
//调用userMapper的方法
int count = userMapper.findUserCount(userQueryVo);

System.out.println(count);
}

@Test
public void testFindUserById() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//调用userMapper的方法

User user = userMapper.findUserById(1);

System.out.println(user);

}

@Test
public void testFindUserByName() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//调用userMapper的方法

List<User> list = userMapper.findUserByName("小明");

sqlSession.close();

System.out.println(list);

}

@Test
public void testFindUserByIdResultMap() throws Exception {

SqlSession sqlSession = sqlSessionFactory.openSession();

//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//调用userMapper的方法

User user = userMapper.findUserByIdResultMap(1);

System.out.println(user);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: