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集合和智能标签和属性和字段不一样的解决办法)的主要内容,如果未能解决你的问题,请参考以下文章