杭州做网站的好公司有哪些,wordpress去除文章rss,wordpress主题什么值得买,广州公司营销型网站建设1. MyBatis 参数上的处理的细节内容 文章目录 1. MyBatis 参数上的处理的细节内容2. MyBatis 参数上的处理3. 准备工作4. 单个(一个)参数4.1 单个(一个)简单类型作为参数4.2 单个(一个) Map集合 作为参数4.3 单个(一个) 实体类POJO作为参数 5. 多个参数5.1 Param注解(命名参数)…1. MyBatis 参数上的处理的细节内容 文章目录 1. MyBatis 参数上的处理的细节内容2. MyBatis 参数上的处理3. 准备工作4. 单个(一个)参数4.1 单个(一个)简单类型作为参数4.2 单个(一个) Map集合 作为参数4.3 单个(一个) 实体类POJO作为参数 5. 多个参数5.1 Param注解(命名参数) 6. Param 注解源码分析7. 总结8. 最后 2. MyBatis 参数上的处理
3. 准备工作
数据表结构的设计数据表名为t_student t_student 表中的数据信息 在pom.xml 文件当中配置相关的依赖的 jar 包如下 ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.rainbowsea/groupIdartifactIdmybatis-005-crud-blog/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependencies!-- mybatis 的依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.10/version/dependency!-- mysql --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.30/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/versionscopetest/scope/dependency!-- 引入 logback的依赖这个日志框架实现了slf4j 规范--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.11/version/dependency/dependencies/project配置 logback 的配置文件用于打印显示我们的日志信息方便我们查看我们的运行过程效果。 ?xml version1.0 encodingUTF-8?configuration debugfalse!-- 控制台输出 --appender nameSTDOUT classch.qos.logback.core.ConsoleAppenderencoder classch.qos.logback.classic.encoder.PatternLayoutEncoder!--格式化输出%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符--pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern/encoder/appender!--mybatis log configure--logger namecom.apache.ibatis levelTRACE/logger namejava.sql.Connection levelDEBUG/logger namejava.sql.Statement levelDEBUG/logger namejava.sql.PreparedStatement levelDEBUG/!-- 日志输出级别,logback日志级别包括五个TRACE DEBUG INFO WARN ERROR --root levelDEBUGappender-ref refSTDOUT/appender-ref refFILE//root/configuration配置 MyBatis 的核心配置文件 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 起别名--typeAliases!-- 使用 package 还可以将这个包下的所有的类的全部自动起别名别名就是简名不区分大小写 --package namecom.rainbowsea.mybatis.pojo//typeAliasesenvironments defaultmybatisenvironment idmybatis!-- MANAGED 没有用第三框架管理的话都是会被提交的没有事务上的管理了 --transactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis/property nameusername valueroot/property namepassword valueMySQL123//dataSource/environment/environmentsmappers!-- 这里也是可以使用 package 包名扫描但是同样的对应接口路径要一致接口名一致--package namecom.rainbowsea.mybatis.mapper/package/mappers
/configuration对照 tstudent 创建的ORM 映射的 Car 类
注意在MyBatis 当中对应的ORM 一般在框架里对应的 Bean实体类一定要实现该 set 和 get 方法以及无参数构造方法无法框架无法使用反射机制进行操作 。
建议用包装类这样可以防止 Null的问题因为简单类型 int num null 是不可以赋值为 null的编译无法通过 package com.rainbowsea.mybatis.pojo;import java.util.Date;public class Student {private Long id;private String name;private Integer age;private Double height;private Date birth;private Character sex;public Student() {}public Student(Long id, String name, Integer age, Double height, Date birth, Character sex) {this.id id;this.name name;this.age age;this.height height;this.birth birth;this.sex sex;}Overridepublic String toString() {return Student{ id id , name name \ , age age , height height , birth birth , sex sex };}public Long getId() {return id;}public void setId(Long id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public Double getHeight() {return height;}public void setHeight(Double height) {this.height height;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth birth;}public Character getSex() {return sex;}public void setSex(Character sex) {this.sex sex;}
} 4. 单个(一个)参数
4.1 单个(一个)简单类型作为参数
简单类型包括
byte short int long float double charByte Short Integer Long Float Double CharacterStringjava.util.Datejava.sql.Date
需求根据name查、根据id查、根据birth查、根据sex查。
第一个根据 id 查记录 package com.rainbowsea.mybatis.mapper;import com.rainbowsea.mybatis.pojo.Student;
import org.apache.ibatis.annotations.Param;import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;public interface StudentMapper {
// 单个参数上的处理/*** 当接口中的方法的参数只有一个单个参数并且参数的数据类型都是简单类型* 根据id查询name查询birth查询sex查询*/ListStudent selectById(Long id);}
编写向对应上的SQL 映射文件的内容 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapper!-- id 要是 namespace 对应接口上的方法名: --!-- parameterType 属性的作用告诉mybatis框架我这个方法的参数类型是什么类型的mybatis 框架自身带有类型自动推断的机制所以大部分情况下 parameterType 属性都是可以省略不写的。select * from t_student where id ?ps.setLong(1,1L)ps.setString(1,张三)ps.setDate(1,new Date())ps.setInt(1,100)...mybatis 底层到底调用setXxx的哪个方法取决于parameterType属性的值注意: mybatis框架时间上内置了很多别名可以参考开发手册--select idselectById resultTypeStudent parameterTypejava.lang.Longselect id, name, age, height, birth, sexfrom t_studentwhere id #{id}/select
/mapperparamterType 属性的作用 告诉mybatis框架我这个方法的参数类型是什么类型的 mybatis 框架自身带有类型自动推断的机制所以大部分情况下 parameterType 属性都是可以省略不写的。 select * from t_student where id ? ps.setLong(1,1L) ps.setString(1,“张三”) ps.setDate(1,new Date()) ps.setInt(1,100) … mybatis 底层到底调用setXxx的哪个方法取决于parameterType属性的值 注意: mybatis框架时间上内置了很多别名可以参考开发手册 resultType 属性的作用 指定 select 查询返回的结果集封装到哪里哪个对象当中这里由于前面我们做好了关于别名上的准备工作所以这里我们可以直接有用别名简名 Java程序编程运行测试 package com.rainbowsea.mybatis.test;import com.rainbowsea.mybatis.mapper.StudentMapper;
import com.rainbowsea.mybatis.pojo.Student;
import com.rainbowsea.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;public class TestStudentMapper {Testpublic void testSelectById() {SqlSession sqlSession SqlSessionUtil.openSession();StudentMapper mapper sqlSession.getMapper(StudentMapper.class);ListStudent students mapper.selectById(2L);students.forEach(student - {System.out.println(student);});sqlSession.close();}
}
在MyBatis 框架当中 内置了很多的别名可以参考开发手册https://mybatis.net.cn/configuration.html#typeHandlers。 其实对于Mybatis 框架来说简单类型对于mybatis来说都是可以自动类型识别的
在MyBatis 框架当中如下为的类型被定义为简单类型
简单类型包括 byte short int long float double char Byte Short Integer Long Float Double Character String java.util.Date java.sql.Date 也就是说对于mybatis来说它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。
如下我们不指定所传的参数类型依靠MyBatis 的自行推断的机制自行推断。
根据birth查、根据sex查。 package com.rainbowsea.mybatis.mapper;import com.rainbowsea.mybatis.pojo.Student;
import org.apache.ibatis.annotations.Param;import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;public interface StudentMapper {
// 单个参数上的处理/*** 当接口中的方法的参数只有一个单个参数并且参数的数据类型都是简单类型* 根据id查询name查询birth查询sex查询*/ListStudent selectByBirth(Date birth);ListStudent selectBySex(Character sex);}
对应的SQL语句映射文件的编写 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapperselect idselectByBirth resultTypeStudentselect id, name, age, height, birth, sexfrom t_studentwhere birth #{birth}/selectselect idselectBySex resultTypeStudentselect id, name, age, height, birth, sexfrom t_studentwhere sex #{sex}/select/mapperJava程序测试编写
根据 brith 查询 //java.util.Date; java.sql.Date 他们在mybatis当中都是为简单类型Testpublic void testSelectByBrith() throws ParseException {SqlSession sqlSession SqlSessionUtil.openSession();StudentMapper mapper sqlSession.getMapper(StudentMapper.class);SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd);Date birth simpleDateFormat.parse(2020-06-06);ListStudent students mapper.selectByBirth(birth);students.forEach(student - {System.out.println(student);});sqlSession.close();}根据 sex 查询 public class TestStudentMapper {Testpublic void testSelectBySex() {SqlSession sqlSession SqlSessionUtil.openSession();StudentMapper mapper sqlSession.getMapper(StudentMapper.class);ListStudent students mapper.selectBySex(男);students.forEach(student -{System.out.println(student);});sqlSession.close();}}通过测试得知简单类型对于mybatis来说都是可以自动类型识别的
也就是说对于mybatis来说它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。
其实SQL映射文件中的配置比较完整的写法是
select idselectByName resultTypestudent parameterTypejava.lang.Stringselect * from t_student where name #{name, javaTypeString, jdbcTypeVARCHAR}
/select其中sql语句中的javaTypejdbcType以及select标签中的parameterType属性都是用来帮助mybatis进行类型确定的。不过这些配置多数是可以省略的。因为mybatis它有强大的自动类型推断机制。
javaType可以省略jdbcType可以省略parameterType可以省略
根据name查。使用完整写法 package com.rainbowsea.mybatis.mapper;import com.rainbowsea.mybatis.pojo.Student;
import org.apache.ibatis.annotations.Param;import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;public interface StudentMapper {
// 单个参数上的处理/*** 当接口中的方法的参数只有一个单个参数并且参数的数据类型都是简单类型* 根据id查询name查询birth查询sex查询*/ListStudent selectByName(String name);}
public interface StudentMapper {
// 单个参数上的处理/*** 当接口中的方法的参数只有一个单个参数并且参数的数据类型都是简单类型* 根据id查询name查询birth查询sex查询*/ListStudent selectByName(String name);}Java程序测试编写 package com.rainbowsea.mybatis.test;import com.rainbowsea.mybatis.mapper.StudentMapper;
import com.rainbowsea.mybatis.pojo.Student;
import com.rainbowsea.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;public class TestStudentMapper {Testpublic void testSelectByName() {SqlSession sqlSession SqlSessionUtil.openSession();StudentMapper mapper sqlSession.getMapper(StudentMapper.class);ListStudent students mapper.selectByName(李华);students.forEach(student -{System.out.println(student);});sqlSession.close();}}
**如果参数只有一个的话#{} 里面的内容就随便写了。对于 ${} 来说注意加单引号。关于 #{} 与 ${}的区别的更多内容大家可以移步至✏️✏️✏️ **
4.2 单个(一个) Map集合 作为参数
需求根据name和age查询 import com.rainbowsea.mybatis.pojo.Student;
import org.apache.ibatis.annotations.Param;import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;public interface StudentMapper {
// 单个参数上的处理/*** 保存学生信息通过Map参数以下是单参数但是参数类型不是简单类型是Map集合*/int insertStudentByMap(MapString, Object map);}注意这种方式是手动封装Map集合将每个条件以 key 和 value 的形式存放到集合中。然后在使用的时候通过 #{map集合的key}来取值#{} 中的值一定要是 map 集合当中的 key 值不然是无法取到值的这里我为了更加明显的突出这一点使用了中文作为 map 集合当中的 key。 Testpublic void testInsertStudentByMap() throws ParseException {SqlSession sqlSession SqlSessionUtil.openSession();StudentMapper mapper sqlSession.getMapper(StudentMapper.class);MapString, Object map new HashMap();map.put(姓名,赵六);map.put(年龄,20);map.put(身高,1.83);map.put(性别,男);SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd);Date birth simpleDateFormat.parse(2020-09-09);map.put(生日,birth);mapper.insertStudentByMap(map);sqlSession.commit();sqlSession.close();}?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapperinsert idinsertStudentByMap parameterTypemapinsert into t_student (id,name,age,sex,birth,height)values (null,#{姓名},#{年龄},#{性别},#{生日},#{身高});/insert/mapperjava运行测试 4.3 单个(一个) 实体类POJO作为参数
需求插入一条Student数据 package com.rainbowsea.mybatis.mapper;import com.rainbowsea.mybatis.pojo.Student;
import org.apache.ibatis.annotations.Param;import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;public interface StudentMapper {
// 单个参数上的处理/*** 保存学生信息通过PoJO参数Student是单个参数但不是简单类型* param student* return*/int insertStudentByPOJO(Student student);} ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapperinsert idinsertStudentByPOJO parameterTypeStudentinsert into t_student (id,name,age,sex,birth,height)values (null,#{name},#{age},#{sex},#{birth},#{height});/insert
/mapper这里需要注意的是#{} 里面写的是属性名字。这个属性名其本质上是set/get方法名去掉set/get之后的名字。
运行测试 5. 多个参数
根据 name 和 sex 查询 Student 信息
如果是多个参数mybatis 框架底层是怎么做的呢
mybatis 框架会自动创建一个map集合并且map集合是以
这种方式存储参数的
map.put(“arg0”,name)
map.put(“arg1”,sex)
map.put(“param1”,name)
map.put(“param2”,sex)
需求通过name和sex查询 这里我们先就用 和我们参数名一样的 name, sex 使用传给 #{} 试试。 异常信息描述了name参数找不到可用的参数包括[arg1, arg0, param1, param2]
修改StudentMapper.xml配置文件尝试使用[arg1, arg0, param1, param2]去参数 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapper!-- 多个参数--select idselectByNameAndSex resultTypeStudentselect id,name,age,height,birth,sexfrom t_studentwhere name #{arg0} and sex #{arg1}/select/mapper运行测试 import com.rainbowsea.mybatis.mapper.StudentMapper;
import com.rainbowsea.mybatis.pojo.Student;
import com.rainbowsea.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class TestStudentMapper {/*** 根据 name 和 sex 查询 Student 信息* 如果是多个参数mybatis 框架底层是怎么做的呢* mybatis 框架会自动创建一个map集合并且map集合是以* 这种方式存储参数的* map.put(arg0,name)* map.put(arg1,sex)* map.put(param1,name)* map.put(param2,sex)***/Testpublic void TestSelectByNameAndSex(){SqlSession sqlSession SqlSessionUtil.openSession();// mapper 实际上指向了代理对象StudentMapper mapper sqlSession.getMapper(StudentMapper.class);// mapper是代理对象// selectByNameAndSex是代理方法ListStudent students mapper.selectByNameAndSex(李华, 男);students.forEach(student - {System.out.println(student);});sqlSession.close();}
}再将其改为 where name #{param1} and sex #{param2} 试试 ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapper!-- 多个参数--select idselectByNameAndSex resultTypeStudentselect id,name,age,height,birth,sexfrom t_studentwhere name #{param1} and sex #{param2}/select!-- where name #{arg0} and sex #{arg1}--!-- where name #{param1} and sex #{param2}--
/mapper改为 arg0 和 param2 混合使用where name #{arg0} and sex #{param2} 运行也是成功的 通过测试可以看到
arg0 是第一个参数param1是第一个参数arg1 是第二个参数param2是第二个参数
实现原理实际上在mybatis底层会创建一个map集合以arg0/param1为key以方法上的参数为value例如
MapString,Object map new HashMap();
map.put(arg0, name);
map.put(arg1, sex);
map.put(param1, name);
map.put(param2, sex);// 所以可以这样取值#{arg0} #{arg1} #{param1} #{param2}
// 其本质就是#{map集合的key}根据 name 和 sex 查询 Student 信息 * 如果是多个参数mybatis 框架底层是怎么做的呢 * mybatis 框架会自动创建一个map集合并且map集合是以 * 这种方式存储参数的 * map.put(“arg0”,name) * map.put(“arg1”,sex) * map.put(“param1”,name) * map.put(“param2”,sex) 注意使用mybatis3.4.2之前的版本时要用#{0}和#{1}这种形式。
5.1 Param注解(命名参数)
可以不用arg0 arg1 param1 param2吗这个map集合的 key我们自定义可以吗
当然可以。使用 Param 注解即可。这样可以增强可读性。
如下 直接将其定义在参数的位置上由于 注解的值为 value 时可以省略属性名 需求通过name和sex查询
package com.rainbowsea.mybatis.mapper;import com.rainbowsea.mybatis.pojo.Student;
import org.apache.ibatis.annotations.Param;import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;public interface StudentMapper {/*** 使用Param注解* mybatis框架底层的实现原理* param name* param sex* return*/ListStudent selectByNameAndSex2(Param(value name) String name, Param(sex) Character sex);} ?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--namespace 一定要是对应的接口的全限定类名--
mapper namespacecom.rainbowsea.mybatis.mapper.StudentMapper!-- 多个参数--select idselectByNameAndSex2 resultTypeStudentselect id,name,age,height,birth,sexfrom t_studentwhere name #{name} and sex #{sex}/select!-- where name #{arg0} and sex #{arg1}--!-- where name #{param1} and sex #{param2}--
!-- 使用 Param 注解
注意使用了Param注解之后arg0和arg1失效了
而 param1和 param2 还可以用
--
/mapper注意使用了Param注解之后arg0和arg1失效了而 param1和 param2 还可以用 Java程序编写测试 import com.rainbowsea.mybatis.mapper.StudentMapper;
import com.rainbowsea.mybatis.pojo.Student;
import com.rainbowsea.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class TestStudentMapper {/*** 根据 name 和 sex 查询 Student 信息* 如果是多个参数mybatis 框架底层是怎么做的呢* mybatis 框架会自动创建一个map集合并且map集合是以* 这种方式存储参数的* map.put(arg0,name)* map.put(arg1,sex)* map.put(param1,name)* map.put(param2,sex)***/Testpublic void TestSelectByNameAndSex(){SqlSession sqlSession SqlSessionUtil.openSession();// mapper 实际上指向了代理对象StudentMapper mapper sqlSession.getMapper(StudentMapper.class);// mapper是代理对象// selectByNameAndSex是代理方法ListStudent students mapper.selectByNameAndSex2(李华, 男);students.forEach(student - {System.out.println(student);});sqlSession.close();}
}注意的是不仅select 查询中可以用 Param 其它的增删改查涉及多个参数自定义参数名的都可以使用 Param 注解。
6. Param 注解源码分析 下面我们进行 DeBug 调试看看。 7. 总结 告诉mybatis框架我这个方法的参数类型是什么类型的mybatis 框架自身带有类型自动推断的机制所以大部分情况下 parameterType 属性都是可以省略不写的。 其实对于Mybatis 框架来说简单类型对于mybatis来说都是可以自动类型识别的 在MyBatis 框架当中如下为的类型被定义为简单类型 简单类型包括 byte short int long float double char Byte Short Integer Long Float Double Character String java.util.Date java.sql.Date 也就是说对于mybatis来说它是可以自动推断出ps.setXxxx()方法的。ps.setString()还是ps.setInt()。它可以自动推断。 其实SQL映射文件中的配置比较完整的写法是 select idselectByName resultTypestudent parameterTypejava.lang.Stringselect * from t_student where name #{name, javaTypeString, jdbcTypeVARCHAR}
/select其中sql语句中的javaTypejdbcType以及select标签中的parameterType属性都是用来帮助mybatis进行类型确定的。不过这些配置多数是可以省略的。因为mybatis它有强大的自动类型推断机制。 javaType可以省略jdbcType可以省略 parameterType可以省略 指定 select 查询返回的结果集封装到哪里哪个对象当中。 对于特殊的不是简单类型POJO是无法自行推断的出来的需要我们指定比如集合POJO类等 注意这种方式是手动封装Map集合将每个条件以 key 和 value 的形式存放到集合中。然后在使用的时候通过 #{map集合的key}来取值#{} 中的值一定要是 map 集合当中的 key 值不然是无法取到值的。 传的是POJO类时需要注意的是#{} 里面写的是属性名字。这个属性名其本质上是set/get方法名去掉set/get之后的名字。 多个参数mybatis 框架会自动创建一个map集合并且map集合是以 这种方式存储参数的 map.put(“arg0”,name) map.put(“arg1”,sex) map.put(“param1”,name) map.put(“param2”,sex) 注意使用mybatis3.4.2之前的版本时要用#{0}和#{1}这种形式。 注意使用了Param注解之后arg0和arg1失效了而 param1和 param2 还可以用 。注意的是不仅select 查询中可以用 Param 其它的增删改查涉及多个参数自定义参数名的都可以使用 Param 注解。 8. 最后 “在这个最后的篇章中我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底继续在其他的领域奋斗。感谢你们我们总会在某个时刻再次相遇。”