MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法)

Posted 葉子。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法)相关的知识,希望对你有一定的参考价值。

一、字段名与属性名(数据库的名字)不一样怎么办?

  方案一:在小配置中配置一个resultMapper

<!--方案一:resultMapper 字段名与属性名不一致 -->
     <resultMap type="Student" id="StudentMapper">
        <result column="stuname2" property="stuname"/>
    </resultMap> 


   <!-- 查询所有 -->
 <select id="findAll" resultMap="StudentMapper">
      select * from student
    </select>

  方案二:在小配置中的查询语句用as

<!-- 方案二:as别名的方式 -->
 <select id="findAll" resultType="Student">
      select stuname2 as stuname from student
    </select>

 二、Mapper动态代理剔除实现类

第一步改动的地方是小配置的<mapper namespace="cn.happy.dao.IStudentDAO">写到接口

<?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="cn.happy.dao.IStudentDAO">
 
 <!-- 方案二:as别名的方式 -->
 <select id="findAll" resultType="Student">
      select stuname2 as stuname from student
    </select>


</mapper>

第二步是在测试类调用接口的时候用getMapper获取一个接口实现类

public class MyTest {
    IStudentDAO dao;
    @Before
    public void initData() throws IOException{
        SqlSession session = MybatisUtil.getSession();
        //动态踢出实现类
        //首先要改StudentDAO.xml改成<mapper namespace="cn.happy.dao.IStudentDAO">
        dao=session.getMapper(IStudentDAO.class);
    }
    
    /**
     * selectALl学生
     * @throws IOException
     */
    
    @Test
    public void findAll() throws IOException{
        List<Student> list = dao.findAll();
        for (Student student : list) {
            System.out.println(student.getStuname());
            /*System.out.println(student.getStuage());*/
        }
        
    }
    }

三、用Map集合取值和使用索引号

(一)用map集合获取值

  1在接口IStudentDAO定制一个方法

 //多条件查询封装成map
   public List<Student> findStudentMore(Map<String, Object> map);

2在小配置中id=“findStudentMore”要和接口的方法法名要一样

 <!-- 多条件查询-->
<select id="findStudentMore" resultType="Student">
  <!--   mysql数据库 -->
      <!--  select * from student where stuname like \'%\' #{stuname} \'%\' and stuage>#{stuage} -->
     <!--   orcl数据库 -->
     select * from student where stuname like \'%\'||#{stuname}||\'%\' and stuage>#{stuage}
    </select>

3在测试类中

/**
     * 多条件查询
     * @throws IOException
     */
    
    @Test
    public void findStudentMore(){
        
        Map<String, Object> maplist=new HashMap<String, Object>();
        maplist.put("stuname", "123");
        maplist.put("stuage", 11);
        List<Student> list = dao.findStudentMore(maplist);
        for (Student student : list) {
            System.out.println(student.getStuname());
        }
        
    }

(二)使用索引

1在接口IStudentDAO定制一个方法

//多条件查询引号
   public List<Student> findStudentByCondition(String name,int age);

2在小配置中id=“findStudentMore”要和接口的方法法名要一样

<select id="findStudentByCondition" resultType="Student">
        <!--  mysql数据库        
         select * from student where stuname like \'%\' #{0} \'%\' and stuage>#{1}
        orcl数据库 -->
        select * from student where stuname like \'%\'||#{0}||\'%\' and stuage>#{1}
        
    </select>

3在测试类中

@Test
    public void findStudentByCondition() throws IOException{
        String name="人";
        int age=12;
        List<Student> list = dao.findStudentByCondition(name,age);
        for (Student student : list) {
            System.out.println(student.getStuname());
        }
        
    }

  小总结:

      

四、智能标签

他们共同用到的是如下

    1定义一个方法在接口中

 public List<Student> findStudentByif(Student stu);

   2测试类

public class MyTest {
    IStudentDAO dao;
    @Before
    public void initData() throws IOException{
        SqlSession session = MybatisUtil.getSession();
        //动态踢出实现类
        //首先要改StudentDAO.xml改成<mapper namespace="cn.happy.dao.IStudentDAO">
        dao=session.getMapper(IStudentDAO.class);
    }
    

    
    
    /**
     * 多条件查询
     * @throws IOException
     */
    
    
    @Test
    public void findStudentByCondition() throws IOException{
        String name="人";
        int age=12;
        Student stu=new Student();
        stu.setStuage(age);
        stu.setStuname(name);
        List<Student> list = dao.findStudentByif(stu);
        for (Student student : list) {
            System.out.println(student.getStuname());
        }
        
    }
    

  3在小配置中的配置

if标签

<!-- 多条件查询 -->
    <select id="findStudentif" resultType="Student">
        select * from student  where 1=1
        
            <if test="stuname!=null">
                and stuname like \'%\'||#{stuname}||\'%\'
            </if>
            <if test="stuage!=null">
                and stuage>#{stuage}
            </if>
        
    </select>

where标签     注意如果有<where>标签就不需要where 1=1

<!-- 多条件查询 -->
    <select id="findStudentBychoose" resultType="Student">
        select * from student <!-- where 1=1如果有where标签就不需要 -->
        <where>
            <if test="stuname!=null">
                and stuname like \'%\'||#{stuname}||\'%\'
            </if>
            <if test="stuage!=null">
                and stuage>#{stuage}
            </if>
        </where>
    </select>

choose标签

    <!--多条件查询where 1=1  如果有where标签就不需要-->
    <select id="findStudentByif" resultType="Student">
        select * from student  
        <where>
        <choose>
            <when test="stuname!=null">
            and stuname like \'%\'||#{stuname}||\'%\'
            
            </when>
            <otherwise>
            </otherwise>
        </choose>
            
            
        </where>
    </select>

 foreach标签

(一)数组

  1在接口中

//查询是一个3,11的stuno标号  ids Araay数组
  public List<Student> findByArray(int[] ids);

  2在小配置中配置

    <!-- array数组 -->
    <select id="findByArray" resultType="Student">
        select * from student <!-- where 1=1如果有where标签就不需要 -->
            <if test="array.length>0">
                where stuno in

        <!-- item是自定义的 -->
<foreach collection="array" open="(" close=")" separator="," item="myid"> #{myid} </foreach> </if> </select>

  3在测试类

//数组
    @Test
    public void findStudentBychoose() throws IOException{
        int[] ids={3,11};//自定义数组
        List<Student> findByArray = dao.findByArray(ids);
        for (Student student : findByArray) {
            System.out.println(student.getStuname());
        }
        
    }

(二)自定义泛型

  1在接口中

//查询3,11 ids List自定义泛型
  public List<Student> findByListGeneric(List<Student> list);

  2在小配置中配置

<!-- list集合 -->
    <select id="findByListGeneric" resultType="Student">
        select * from student <!-- where 1=1如果有where标签就不需要 -->
            <if test="list.size>0">
                where stuno in
                <foreach collection="list" open="(" close=")" separator="," item="stu">
                    #{stu.stuno}
                    </foreach>
            </if>
        
    </select>

  3在测试类中

//自定义泛型
    @Test
    public void findByListGeneric() throws IOException{
        List<Student> rlist=new ArrayList<Student>();
        Student stu1=new Student();
        stu1.setStuno(3);
        
        Student stu2=new Student();
        stu2.setStuno(11);
        
        rlist.add(stu2);
        rlist.add(stu1);
        List<Student> findByListGeneric = dao.findByListGeneric(rlist);
        for (Student student : findByListGeneric) {
            System.out.println(student.getStuname());
        }
    

 (三)List集合

  1在接口

//查询3,11 ids List
  public List<Student> findByList(List<Integer> list);

 

  2在小配置中配置

    <select id="findByList" resultType="Student">
        select * from student <!-- where 1=1如果有where标签就不需要 -->
            <if test="list.size>0">
                where stuno in
                <foreach collection="list" open="(" close=")" separator="," item="stulist">
                    #{stulist}
                    </foreach>
            </if>
        
    </select>

 

  3在测试类

//list集合
    @Test
    public void findByList() throws IOException{
        List<Integer> rlist=new ArrayList<Integer>();
        rlist.add(3);
        rlist.add(11);
        List<Student> findByList = dao.findByList(rlist);
        for (Student student : findByList) {
            System.out.println(student.getStuname());
        }
    
    }    

 

五、sql片段

  1连接上一个foreach智能标签在小配置中(用include标签)

<!-- sql片段 -->
<sql id="sqlclum" >
    select stuno,stuname,stuage,studate
</sql>
<!-- list集合 -->
    <select id="findByList" resultType="Student">
        <!-- select * from student  --><!-- where 1=1如果有where标签就不需要 -->
        <include refid="sqlclum"/> from student 
        <if test="list.size>0">
            where stuno in
            <foreach collection="list" open="(" close=")" separator=","
                item="stulist">
                #{stulist}
            </foreach>
        </if>

    </select>

 

以上是关于MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis里怎么获取传进去的map集合中的key

MyBatis传入多个参数 ,List集合

mybatis数组和List遍历

mybatis 查询一对多 集合中没有值为啥

js 基础概念系列1

java8 增强的Iterator遍历集合元素