MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)
一、字段名与属性名(数据库的名字)不一样怎么办?
方案一:在小配置中配置一个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 '%' #{} '%' and stuage>#{}
orcl数据库 -->
select * from student where stuname like '%'||#{}||'%' and stuage>#{} </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 = <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如果有where标签就不需要 -->
<where>
<if test="stuname!=null">
and stuname like '%'||#{stuname}||'%'
</if>
<if test="stuage!=null">
and stuage>#{stuage}
</if>
</where>
</select>
choose标签
<!--多条件查询where = 如果有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如果有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如果有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如果有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如果有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集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)的更多相关文章
- 遍历Map集合:java.util.Map.Entry、KeySet两种方式
遍历Map集合的两种方式: 1.用KeySet Map.keySet(),返回一个存放所有key的set集合,通过遍历集合,根据key值取出所有的value值. Map<String,Strin ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- (1)集合 ---遍历map集合
Map接口 实现Map接口的类用来存储键(key)-值(value) 对.Map 接口的实现类有HashMap和TreeMap等.Map类中存储的键-值对通过键来标识,所以键值不能重复. Ha ...
- 遍历Map集合的几种方式
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entr ...
- 用来遍历map集合的方法
map集合是以键值对进行存储值的,所以遍历map集合无非就是获取键和值,根据实际需求,进行获取键和值. 1.无非就是通过map.keySet()获取到值,然后根据键获取到值. for(String s ...
- Java之五种遍历Map集合的方式
摘要:在java中所有的map都实现了Map接口,因此所有的Map都可以用以下的方式去遍历. 在java中所有的map都实现了Map接口,因此所有的Map都可以用以下的方式去遍历.这篇文章主要给大家介 ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- struts2标签 遍历map集合
首先我们来构造几个map集合. 假设如下代码 都是在ssh配置环境下搭建好,(至少struts2开发环境搭建好) (1).java 代码 下面的student对象包含的字段为 ...
- 遍历Map集合的四中方法
->有这样一个Map集合 Map<String, String> map = new HashMap<String, String>(); map.put(", ...
随机推荐
- 我的屌丝giser成长记-工作篇之B公司
从A公司跳槽到B公司,岗位还是webgis开发方向,但是具体实现的技术完全变了,从flex转换js,这也是我要离开A公司的最重要的原意之一:A公司的arcgis for flex框架采用了flexvi ...
- Java实现多线程断点下载(下载过程中可以暂停)
线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配. ...
- SQL Server常见问题介绍及快速解决建议
前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题,及快速解决这些问题.这些问题是数据库的常规管理问题,对于很多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 下面一些问题是 ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...
- Lamda表达式多个字段排序问题 ThenBy、ThenByDescending
示例代码: //ThenBy - 在 OrderBy 或 OrderByDescending 的基础上再正序排序 //ThenByDescending - 在 OrderBy 或 OrderByDes ...
- 使用packer制作vagrant centos box
使用packer制作vagrant box:centos 制作vagrant box,网上有教程,可以自己step by step的操作.不过直接使用虚拟在VirtualBox中制作vagrant b ...
- 使用自定义 classloader 的正确姿势
详细的原理就不多说了,网上一大把, 但是, 看了很多很多, 即使看了jdk 源码, 说了罗里吧嗦, 还是不很明白: 到底如何正确自定义ClassLoader, 需要注意什么 ExtClassLoade ...
- ZeroMQ:云时代极速消息通信库
ZeroMQ:云时代极速消息通信库(大规模|可扩展|低成本|高效率解决之道,大规模分布式|多线程应用程序|消息传递架构构建利器) [美]Pieter Hintjens(皮特.亨特金斯)著 卢涛 李 ...
- WCF学习之旅—TCP双工模式(二十一)
WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...
- DDD实践切入点(二)
最近发现下面关于上下文的理解有些问题,不太好改,暂时先不改了 承前:大型系统的支撑,应用系统开发思想的变迁,DDD实践切入点(一) 从大比例结构入手已经开始了系统的建设,大家都知道需求是会不断变化不断 ...