Mybatis的动态sql及分页

1.mybatis动态sql
1.1 if
1.2 trim
1.3 foreach

1.4 其他
choose/set/where

2.模糊查询(3种方式)

2.1 参数中直接加入%%

2.2 使用${...}代替#{...}(不建议使用该方式,有SQL注入风险)
   
      关键:#{...}与${...}区别?
      参数类型为字符串,#会在前后加单引号['],$则直接插入值

      注:
      1) mybatis中使用OGNL表达式传递参数
      2) 优先使用#{...}
      3) ${...}方式存在SQL注入风险

2.3 SQL字符串拼接CONCAT

3.查询返回结果集
resultMap:适合使用返回值是自定义实体类的情况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型

3.1 使用resultMap返回自定义类型集合

3.2 使用resultType返回List<T>

3.3 使用resultType返回单个对象

3.4 使用resultType返回List<Map>,适用于多表查询返回结果集

3.5 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集

4.分页查询

为什么要重写mybatis的分页?
Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的

4.1 导入分页插件
 <dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>5.1.2</version>
   </dependency>
4.2 将pagehelper插件配置到mybatis中
<!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
       <plugin interceptor="com.github.pagehelper.PageInterceptor">
       </plugin>
4.3 在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页
 if (null != pageBean && pageBean.isPaginate()) {
         PageHelper.startPage(pageBean.getCurPage(), pageBean.getPageRecord());
       }
4.4 获取分页信息(二种方式)
  
 4.4.1 使用插件后,查询实际返回的是Page<E>,而非List<E>,Page继承了ArrayList,同时还包含分页相关的信息
      Page<Book> page = (Page<Book>)list;
      System.out.println("页码:" + page.getPageNum());
      System.out.println("页大小:" + page.getPageSize());
      System.out.println("总记录:" + page.getTotal());
 4.4.2 使用PageInfo
      PageInfo pageInfo = new PageInfo(list);
      System.out.println("页码:" + pageInfo.getPageNum());
      System.out.println("页大小:" + pageInfo.getPageSize());
      System.out.println("总记录:" + pageInfo.getTotal());

5.特殊字符处理
>(>)
<(<)
&(&)
空格( )

<![CDATA[ <= ]]>

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
今日测试方法与对象
对象:

User.class

package com.zking.Mybatis.model;

import lombok.ToString;

@ToString
public class User {
    private Long usrId;

    private String usrName;

    private String usrPassword;

    private Long usrRoleId;

    private Integer usrFlag;

    public User(Long usrId, String usrName, String usrPassword, Long usrRoleId, Integer usrFlag) {
        this.usrId = usrId;
        this.usrName = usrName;
        this.usrPassword = usrPassword;
        this.usrRoleId = usrRoleId;
        this.usrFlag = usrFlag;
    }

    public User() {
        super();
    }

    public Long getUsrId() {
        return usrId;
    }

    public void setUsrId(Long usrId) {
        this.usrId = usrId;
    }

    public String getUsrName() {
        return usrName;
    }

    public void setUsrName(String usrName) {
        this.usrName = usrName;
    }

    public String getUsrPassword() {
        return usrPassword;
    }

    public void setUsrPassword(String usrPassword) {
        this.usrPassword = usrPassword;
    }

    public Long getUsrRoleId() {
        return usrRoleId;
    }

    public void setUsrRoleId(Long usrRoleId) {
        this.usrRoleId = usrRoleId;
    }

    public Integer getUsrFlag() {
        return usrFlag;
    }

    public void setUsrFlag(Integer usrFlag) {
        this.usrFlag = usrFlag;
    }
}

UserVo.class:

package com.zking.Mybatis.vo;

import com.zking.Mybatis.model.User;
import lombok.ToString;

import java.util.List;

/**
 * @author cjl
 * @site www.xiaomage.com
 * @company
 * @create  2018-12-15 14:59
 */
@ToString
public class UserVo extends User {
    private List<Integer> userIds;
    private Integer min_role_id;
    private Integer max_role_id;


    public UserVo() {

    }


    public List<Integer> getUserIds() {
        return userIds;
    }

    public void setUserIds(List<Integer> userIds) {
        this.userIds = userIds;
    }

    public Integer getMin_role_id() {
        return min_role_id;
    }

    public void setMin_role_id(Integer min_role_id) {
        this.min_role_id = min_role_id;
    }

    public Integer getMax_role_id() {
        return max_role_id;
    }

    public void setMax_role_id(Integer max_role_id) {
        this.max_role_id = max_role_id;
    }
}

配置文件:UserMapper .class

package com.zking.Mybatis.mapper;

import com.zking.Mybatis.model.User;
import com.zking.Mybatis.util.PageBean;
import com.zking.Mybatis.vo.UserVo;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    /**
     * 删除用户
     * @param usrId
     * @return
     */
    int deleteByPrimaryKey(Long usrId);

    /**
     * 新增用户
     * @param record
     * @return
     */
    int insert(User record);

    /**
     * 根据条件新增用户
     * @param record
     * @return
     */
    int insertSelective(User record);

    /**
     * 根据用户id查询用户
     * @param usrId
     * @return
     */
    User selectByPrimaryKey(Long usrId);

    /**
     * 根据用户id修改用户部分信息
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(User record);

    /**
     * 根据用户id修改用户所有信息
     * @param record
     * @return
     */
    int updateByPrimaryKey(User record);

    /**
     * foreach 标签
     * @param user
     * @return
     */
    List<User> selectUser(UserVo userVo);

    /**
     * 模糊查询
     * @param user
     * @return
     */
    List<User> selectUser2(User user);

    /**
     *使用resultMap返回自定义类型集合
     * @param user
     * @return
     */
    List<User> selectUser3(User user);

    /**
     * 使用resultType返回List<T>
     * @param user
     * @return
     */
    List<User> selectUser4(User user);

    /**
     *  使用resultType返回List<Map>,适用于多表查询返回结果集
     *  无论返回单条记录,还是多条记录,mybatis会自动给你封装
     * @param
     * @return
     */
    List<Map> selectUser5();

    /**
     * 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
     * @param map
     * @return
     */
    Map UserOne(Map map);


    /**
     * 分页查询
     * @param user
     * @param pageBean
     * @return
     */
    List<User> list7(User user);

    /**
     * 特殊字符处理
     * @param userVo
     * @return
     */
    List<User> list8(UserVo userVo);

}

UserMapper .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="com.zking.Mybatis.mapper.UserMapper" >
  <resultMap id="BaseResultMap" type="com.zking.Mybatis.model.User" >
    <constructor >
      <idArg column="usr_id" jdbcType="BIGINT" javaType="java.lang.Long" />
      <arg column="usr_name" jdbcType="VARCHAR" javaType="java.lang.String" />
      <arg column="usr_password" jdbcType="VARCHAR" javaType="java.lang.String" />
      <arg column="usr_role_id" jdbcType="BIGINT" javaType="java.lang.Long" />
      <arg column="usr_flag" jdbcType="INTEGER" javaType="java.lang.Integer" />
    </constructor>
  </resultMap>
  <sql id="Base_Column_List" >
    usr_id, usr_name, usr_password, usr_role_id, usr_flag
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from sys_user
    where usr_id = #{usrId,jdbcType=BIGINT}
  </select>
  <select id="selectUser" parameterType="com.zking.Mybatis.vo.UserVo" resultType="com.zking.Mybatis.model.User">
    select
    <include refid="Base_Column_List" />
    from sys_user
    where usr_id in
    <foreach collection="userIds" item="usr_id" open="(" close=")" separator=",">
      #{usr_id}
    </foreach>
  </select>
  <select id="selectUser2" parameterType="com.zking.Mybatis.model.User" resultType="com.zking.Mybatis.model.User">
    select
    <include refid="Base_Column_List" />
    from sys_user
    where  usr_name like #{usrName}
  </select>
  <select id="selectUser3" parameterType="com.zking.Mybatis.model.User"  resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from sys_user
  </select>
  <select id="selectUser4" parameterType="com.zking.Mybatis.model.User" resultType="com.zking.Mybatis.model.User">
    select
    <include refid="Base_Column_List" />
    from sys_user
  </select>
  <select id="selectUser5" parameterType="java.util.Map" resultType="java.util.Map">
    select
    <include refid="Base_Column_List" />
    from sys_user
  </select>
  <select id="UserOne"  parameterType="java.util.Map" resultType="java.util.HashMap">
    select
    <include refid="Base_Column_List" />
    from sys_user
    where usr_id =  #{usr_id}
  </select>
  <select id="list7" parameterType="com.zking.Mybatis.model.User"  resultType="com.zking.Mybatis.model.User">
    select
    <include refid="Base_Column_List" />
    from sys_user
    where 1=1
    <if test="usrName != null" >
      and usr_name like #{usrName}
    </if>

  </select>
  <select id="list8" resultType="com.zking.Mybatis.model.User">
    select
    <include refid="Base_Column_List" />
    from sys_user
    where 1=1
    and usr_role_id &gt; #{min_role_id}
    and usr_role_id &lt; #{max_role_id}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
    delete from sys_user
    where usr_id = #{usrId,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.zking.Mybatis.model.User" >
    insert into sys_user (usr_id, usr_name, usr_password, 
      usr_role_id, usr_flag)
    values (#{usrId,jdbcType=BIGINT}, #{usrName,jdbcType=VARCHAR}, #{usrPassword,jdbcType=VARCHAR}, 
      #{usrRoleId,jdbcType=BIGINT}, #{usrFlag,jdbcType=INTEGER})
  </insert>
  <insert id="insertSelective" parameterType="com.zking.Mybatis.model.User" >
    insert into sys_user
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="usrId != null" >
        usr_id,
      </if>
      <if test="usrName != null" >
        usr_name,
      </if>
      <if test="usrPassword != null" >
        usr_password,
      </if>
      <if test="usrRoleId != null" >
        usr_role_id,
      </if>
      <if test="usrFlag != null" >
        usr_flag,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="usrId != null" >
        #{usrId,jdbcType=BIGINT},
      </if>
      <if test="usrName != null" >
        #{usrName,jdbcType=VARCHAR},
      </if>
      <if test="usrPassword != null" >
        #{usrPassword,jdbcType=VARCHAR},
      </if>
      <if test="usrRoleId != null" >
        #{usrRoleId,jdbcType=BIGINT},
      </if>
      <if test="usrFlag != null" >
        #{usrFlag,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.zking.Mybatis.model.User" >
    update sys_user
    <set >
      <if test="usrName != null" >
        usr_name = #{usrName,jdbcType=VARCHAR},
      </if>
      <if test="usrPassword != null" >
        usr_password = #{usrPassword,jdbcType=VARCHAR},
      </if>
      <if test="usrRoleId != null" >
        usr_role_id = #{usrRoleId,jdbcType=BIGINT},
      </if>
      <if test="usrFlag != null" >
        usr_flag = #{usrFlag,jdbcType=INTEGER},
      </if>
    </set>
    where usr_id = #{usrId,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.zking.Mybatis.model.User" >
    update sys_user
    set usr_name = #{usrName,jdbcType=VARCHAR},
      usr_password = #{usrPassword,jdbcType=VARCHAR},
      usr_role_id = #{usrRoleId,jdbcType=BIGINT},
      usr_flag = #{usrFlag,jdbcType=INTEGER}
    where usr_id = #{usrId,jdbcType=BIGINT}
  </update>
</mapper>

UserService .class

package com.zking.Mybatis.service;

import com.zking.Mybatis.model.User;
import com.zking.Mybatis.util.PageBean;
import com.zking.Mybatis.vo.UserVo;

import java.util.List;
import java.util.Map;

/**
 * @author cjl
 * @site www.xiaomage.com
 * @company
 * @create  2018-12-15 11:58
 */
public interface UserService {

    /**
     * 删除用户
     * @param usrId
     * @return
     */
    int deleteByPrimaryKey(Long usrId);

    /**
     * 新增用户
     * @param record
     * @return
     */
    int insert(User record);

    /**
     * 根据条件新增用户
     * @param record
     * @return
     */
    int insertSelective(User record);

    /**
     * 根据用户id查询用户
     * @param usrId
     * @return
     */
    User selectByPrimaryKey(Long usrId);

    /**
     * 根据用户id修改用户部分信息
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(User record);

    /**
     * 根据用户id修改用户所有信息
     * @param record
     * @return
     */
    int updateByPrimaryKey(User record);

    /**
     * foreach 标签
     * @param user
     * @return
     */
    List<User> selectUser(UserVo userVo);

    /**
     * 模糊查询
     * @param user
     * @return
     */
    List<User> selectUser2(User user);

    /**
     *使用resultMap返回自定义类型集合
     * @param user
     * @return
     */
    List<User> selectUser3(User user);

    /**
     * 使用resultType返回List<T>
     * @param user
     * @return
     */
    List<User> selectUser4(User user);

    /**
     *  使用resultType返回List<Map>,适用于多表查询返回结果集
     *  无论返回单条记录,还是多条记录,mybatis会自动给你封装
     * @param
     * @return
     */
    List<Map> selectUser5();

    /**
     * 使用resultType返回Map<String,Object>,适用于多表查询返回单个结果集
     * @param map
     * @return
     */
    Map UserOne(Map map);


    /**
     * 分页查询
     * @param user
     * @param pageBean
     * @return
     */
    List<User> list7(User user);

    /**
     * 特殊字符处理
     * @param userVo
     * @return
     */
    List<User> list8(UserVo userVo);
}

UserServiceImpl .class(有部分方法没有用)

package com.zking.Mybatis.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zking.Mybatis.mapper.UserMapper;
import com.zking.Mybatis.model.User;
import com.zking.Mybatis.service.UserService;
import com.zking.Mybatis.util.PageBean;
import com.zking.Mybatis.vo.UserVo;

import java.util.List;
import java.util.Map;

/**
 * @author cjl
 * @site www.xiaomage.com
 * @company
 * @create  2018-12-15 12:00
 */
public class UserServiceImpl implements UserService {
    private UserMapper userMapper;

    public UserMapper getUserMapper() {
        return userMapper;
    }

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    /**
     * 删除用户
     *
     * @param usrId
     * @return
     */
    @Override
    public int deleteByPrimaryKey(Long usrId) {
        return 0;
    }

    @Override
    public int insert(User record) {
        return userMapper.insert(record);
    }

    /**
     * 根据条件新增用户
     *
     * @param record
     * @return
     */
    @Override
    public int insertSelective(User record) {
        return 0;
    }

    @Override
    public User selectByPrimaryKey(Long usrId) {
        return userMapper.selectByPrimaryKey(usrId);
    }

    /**
     * 根据用户id修改用户部分信息
     *
     * @param record
     * @return
     */
    @Override
    public int updateByPrimaryKeySelective(User record) {
        return 0;
    }

    /**
     * 根据用户id修改用户所有信息
     *
     * @param record
     * @return
     */
    @Override
    public int updateByPrimaryKey(User record) {
        return 0;
    }

    @Override
    public List<User> selectUser(UserVo userVo) {
        return userMapper.selectUser(userVo);
    }

    @Override
    public List<User> selectUser2(User user) {
        return userMapper.selectUser2(user);
    }

    @Override
    public List<User> selectUser3(User user) {
        return userMapper.selectUser3(user);
    }

    @Override
    public List<User> selectUser4(User user) {
        return userMapper.selectUser4(user);
    }

    @Override
    public List<Map> selectUser5() {
        return userMapper.selectUser5();
    }

    @Override
    public Map UserOne(Map map) {
        return userMapper.UserOne(map);
    }

    /**
     * 分页查询
     *
     * @param user
     * @return
     */
    @Override
    public List<User> list7(User user) {
        return null;
    }

    @Override
    public List<User> list7(User user, PageBean pageBean) {
        if(pageBean !=null && pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List<User> users = this.userMapper.list7(user);
        System.out.println(users.getClass());

        if(pageBean !=null && pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo(users);
            pageBean.setTotal(pageInfo.getTotal()+"");
        }

        return users;
    }

    @Override
    public List<User> list8(UserVo userVo) {
        return userMapper.list8(userVo);
    }
}

UserServiceImplTes.class

package com.zking.Mybatis.service.impl;

import com.zking.Mybatis.mapper.UserMapper;
import com.zking.Mybatis.model.User;
import com.zking.Mybatis.service.UserService;
import com.zking.Mybatis.util.PageBean;
import com.zking.Mybatis.util.SessionUtil;
import com.zking.Mybatis.vo.UserVo;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author cjl
 * @site www.xiaomage.com
 * @company
 * @create  2018-12-15 12:02
 */
public class UserServiceImplTest {
    private SqlSession sqlSession;
    private UserService userService;
    @Before
    public void setUp() throws Exception {
        sqlSession = SessionUtil.openSession();
        UserServiceImpl userServiceImpl = new UserServiceImpl();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userServiceImpl.setUserMapper(userMapper);
        userService = userServiceImpl;

    }


    @After
    public void tearDown() throws Exception {
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    public void insert() {
        User user = new User();
        user.setUsrId(7l);
        user.setUsrName("廧");
        user.setUsrPassword("147258369");
        user.setUsrFlag(2);
        user.setUsrRoleId(2l);
        this.userService.insert(user);
    }

    @Test
    public void selectByPrimaryKey() {
        User user = this.userService.selectByPrimaryKey(7l);
        System.out.println(user);

    }

    @Test
    public void selectUser() {
        UserVo userVo = new UserVo();
        userVo.setUserIds(Arrays.asList(new Integer[]{1,2,5}));
        List<User> users = this.userService.selectUser(userVo);
        for (User user : users) {
            System.out.println(user);
        }
    }
    @Test
    public void selectUser2() {
        User user = new User();
        user.setUsrName("%a%");
        List<User> users = this.userService.selectUser2(user);
        for (User u : users) {
            System.out.println(u);
        }
    }
    @Test
    public void selectUser3() {
        List<User> users = this.userService.selectUser3(null);
        for (User u : users) {
            System.out.println(u);
        }
    }

    @Test
    public void selectUser4() {
        List<User> users = this.userService.selectUser4(null);
        for (User u : users) {
            System.out.println(u);
        }
    }
    @Test
    public void selectUser5() {
        List<Map> maps = this.userService.selectUser5();
        for (Map map : maps) {
            System.out.println(map);
        }
    }
    @Test
    public void UserOne() {
        Map map= new HashMap();
        map.put("usr_id",4);
        Map map1 = this.userService.UserOne(map);
        System.out.println(map1);
    }

    @Test
    public void list7() {
        User user =new User();
        user.setUsrName("%a%");
        PageBean pageBean = new PageBean();
        List<User> users = this.userService.list7(user, pageBean);
        for (User user1 : users) {
            System.out.println(user1);
        }
    }
    @Test
    public void list8() {
        UserVo userVo =new UserVo();
        userVo.setMin_role_id(1);
        userVo.setMax_role_id(4);
        List<User> users = this.userService.list8(userVo);
        for (User user : users) {
            System.out.println(user);
        }
    }

}

猜你喜欢

转载自blog.csdn.net/cao_2000/article/details/85017591