大兴安岭做网站,如何自己创建网址,wordpress图片上传大小,无锡装修网站1. 什么是MyBatis
#xff08;1#xff09;Mybatis是一个半ORM#xff08;对象关系映射#xff09;框架#xff0c;它内部封装了JDBC#xff0c;开发时只需要关注SQL语句本身#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接…1. 什么是MyBatis
1Mybatis是一个半ORM对象关系映射框架它内部封装了JDBC开发时只需要关注SQL语句本身不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql可以严格控制sql执行性能灵活度高。
2MyBatis 可以使用 XML 或注解来配置和映射原生信息将 POJO映射成数据库中的记录避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
3通过xml 文件或注解的方式将要执行的各种 statement 配置起来并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为java对象并返回。从执行sql到返回result的过程。
2. 说说MyBatis的优点和缺点
优点
1基于SQL语句编程相当灵活不会对应用程序或者数据库的现有设计造成任何影响SQL写在XML里解除sql与程序代码的耦合便于统一管理提供XML标签支持编写动态SQL语句并可重用。
2与JDBC相比减少了50%以上的代码量消除了JDBC大量冗余的代码不需要手动开关连接
3很好的与各种数据库兼容因为MyBatis使用JDBC来连接数据库所以只要JDBC支持的数据库MyBatis都支持。
4能够与Spring很好的集成
5提供映射标签支持对象与数据库的ORM字段关系映射提供对象关系映射标签支持对象关系组件维护。
缺点
1SQL语句的编写工作量较大尤其当字段多、关联表多时对开发人员编写SQL语句的功底有一定要求。
2SQL语句依赖于数据库导致数据库移植性差不能随意更换数据库。
3. #{}和${}的区别是什么
#{}是预编译处理${}是字符串替换。
Mybatis在处理#{}时会将sql中的#{}替换为?号调用PreparedStatement的set方法来赋值
Mybatis在处理 时就是把 {}时就是把 时就是把{}替换成变量的值。
使用#{}可以有效的防止SQL注入提高系统安全性。
#{} 的变量替换是在DBMS 中${} 的变量替换是在 DBMS 外 。
4.当实体类中的属性名和表中的字段名不一样 怎么办
第1种 通过在查询的sql语句中定义字段名的别名让字段名的别名和实体类的属性名一致。
select idselectorder parametertypeint resultetypeme.gacl.domain.orderselect order_id id, order_no orderno ,order_price price form orders whereorder_id#{id};
/select第2种 通过来映射字段名和实体类属性名的一一对应的关系。
select idgetOrder parameterTypeint resultMaporderresultmapselect * from orders where order_id#{id}
/selectresultMap typeme.gacl.domain.order idorderresultmap!–用id属性来映射主键字段–id propertyid columnorder_id!–用result属性来映射非主键字段property为实体类属性名column为数据表中的属性–result propertyorderno column order_no/result propertyprice columnorder_price /
/reslutMap 5. Mybatis是如何进行分页的分页插件的原理是什么
Mybatis使用RowBounds对象进行分页它是针对ResultSet结果集执行的内存分页而非物理分页。可以在sql内直接拼写带有物理分页的参数来完成物理分页功能也可以使用分页插件来完成物理分页比如MySQL数据的时候在原有SQL后面拼写limit。
分页插件的基本原理是使用Mybatis提供的插件接口实现自定义插件在插件的拦截方法内拦截待执行的sql然后重写sql根据dialect方言添加对应的物理分页语句和物理分页参数。
6. Mybatis是如何将sql执行结果封装为目标对象并返回的都有哪些映射形式
第一种是使用标签逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能将列的别名书写为对象属性名。
有了列名与属性名的映射关系后Mybatis通过反射创建对象同时使用反射给对象的属性逐一赋值并返回那些找不到映射关系的属性是无法完成赋值的。
7. Xml映射文件中除了常见的select|insert|updae|delete标签之外还有哪些标签
加上动态sql的9个标签其中为sql片段标签通过标签引入sql片段为不支持自增的主键生成策略标签。
8. MyBatis实现一对一有几种方式?具体怎么操作的
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成
嵌套查询是先查一个表根据这个表里面的结果的 外键id去再另外一个表里面查询数据,也是通过association配置但另外一个表的查询通过select属性配置。
9. Mybatis是否支持延迟加载如果支持它的实现原理是什么
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载association指的就是一对一collection指的就是一对多查询。在Mybatis配置文件中可以配置是否启用延迟加载lazyLoadingEnabledtrue|false。
它的原理是使用CGLIB创建目标对象的代理对象当调用目标方法时进入拦截器方法比如调用a.getB().getName()拦截器invoke()方法发现a.getB()是null值那么就会单独发送事先保存好的查询关联B对象的sql把B查询上来然后调用a.setB(b)于是a的对象b属性就有值了接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。当然了不光是Mybatis几乎所有的包括Hibernate支持延迟加载的原理都是一样的。
10. 说说Mybatis的缓存机制
Mybatis整体
一级缓存localCache
在应用运行过程中我们有可能在一次数据库会话中执行多次查询条件完全相同的 SQL
MyBatis 提供了一级缓存的方案优化这部分场景如果是相同的 SQL 语句会优先命中一级缓存避免直接对数据库进行查询提高性能。
每个 SqlSession 中持有了 Executor每个 Executor 中有一个 LocalCache。当用户发起查询时MyBatis 根据当前执行的语句生成 MappedStatement在 Local Cache 进行查询如果缓存命中的话直接返回结果给用户如果缓存没有命中的话查询数据库结果写入 Local Cache最后返回结果给用户。具体实现类的类关系图如下图所示 MyBatis 一级缓存的生命周期和 SqlSession 一致。 MyBatis 一级缓存内部设计简单只是一个没有容量限定的 HashMap在缓存的功能性上有所欠缺。 MyBatis 的一级缓存最大范围是 SqlSession 内部有多个 SqlSession 或者分布式的环境下数据库写操作会引起脏数据建议设定缓存级别为 Statement。 二级缓存
在上文中提到的一级缓存中其最大的共享范围就是一个 SqlSession 内部如果多个 SqlSession之间需要共享缓存则需要使用到二级缓存。开启二级缓存后会使用 CachingExecutor 装饰Executor进入一级缓存的查询流程前先在 CachingExecutor 进行二级缓存的查询具体的工作流程如下所示。
二级缓存开启后同一个 namespace 下的所有操作语句都影响着同一个 Cache即二级缓存被多个 SqlSession 共享是一个全局的变量。
当开启缓存后数据的查询执行的流程为
二级缓存 - 一级缓存 - 数据库
MyBatis 的二级缓存相对于一级缓存来说实现了 SqlSession 之间缓存数据的共享同时粒度更加细能够到 namespace 级别通过 Cache 接口实现类不同的组合对 Cache 的可控性也更强。MyBatis 在多表查询时极大可能会出现脏数据有设计上的缺陷安全使用二级缓存的条件比较苛刻。在分布式环境下由于默认的 MyBatis Cache 实现都是基于本地的分布式环境下必然会出现读取到脏数据需要使用集中式缓存将 MyBatis 的 Cache 接口实现有一定的开发成本直接使用 Redis、Memcached 等分布式缓存可能成本更低安全性也更高。
11. MyBatis 中比如 UserMapper.java 是接口为什么没有实现类还能调用
使用JDK动态代理MapperProxy。本质上调用的是MapperProxy的invoke方法。
12. Hibernate 和 MyBatis 的区别
相同点
都是对jdbc的封装都是持久层的框架都用于dao层的开发。
不同点 映射关系 MyBatis 是一个半自动映射的框架配置Java对象与sql语句执行结果的对应关系多表关联关系配置简单 Hibernate 是一个全表映射的框架配置Java对象与数据库表的对应关系多表关联关系配置复杂
SQL优化和移植性
Hibernate 对SQL语句封装提供了日志、缓存、级联级联比 MyBatis 强大等特性此外还提供 HQLHibernate Query Language操作数据库数据库无关性支持好但会多消耗性能。如果项目需要支持多种数据库代码开发量少但SQL语句优化困难。MyBatis 需要手动编写 SQL支持动态 SQL、处理列表、动态生成表名、支持存储过程。开发工作量相对大些。直接使用SQL语句操作数据库不支持数据库无关性但sql语句优化容易。
13. ORM是什么
ORMObject Relational Mapping对象关系映射是一种为了解决关系型数据库数据与简单Java对象POJO的映射关系的技术。简单的说ORM是通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系型数据库中。
14. 为什么说Mybatis是半自动ORM映射工具它与全自动的区别在哪里
Hibernate属于全自动ORM映射工具使用Hibernate查询关联对象或者关联集合对象时可以根据对象关系模型直接获取所以它是全自动的。Mybatis在查询关联对象或关联集合对象时需要手动编写sql来完成所以称之为半自动ORM映射工具。
15. 传统JDBC开发存在什么问题
频繁创建数据库连接对象、释放容易造成系统资源浪费影响系统性能。可以使用连接池解决这个问题。但是使用jdbc需要自己实现连接池。sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大一旦发生变化需要修改java代码系统需要重新编译重新发布。不好维护。使用preparedStatement向占有位符号传参数存在硬编码因为sql语句的where条件不一定可能多也可能少修改sql还要修改代码系统不易维护。结果集处理存在重复代码处理麻烦。如果可以映射成Java对象会比较方便。
16. MyBatis和Hibernate的适用场景?
MyBatis专注于SQL本身是一个足够灵活的DAO层解决方案。对性能的要求很高或者需求变化较多的项目如互联网项目MyBatis将是不错的选择。
开发难易程度和学习成本
Hibernate 是重量级框架学习使用门槛高适合于需求相对稳定中小型的项目比如办公自动化系统MyBatis 是轻量级框架学习使用门槛低适合于需求变化频繁大型的项目比如互联网电子商务系统
总结
MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架
Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
17. 请说说MyBatis的工作原理 读取 MyBatis 配置文件mybatis-config.xml 为 MyBatis 的全局配置文件配置了 MyBatis 的运行环境等信息例如数据库连接信息。 加载映射文件。映射文件即 SQL 映射文件该文件中配置了操作数据库的 SQL 语句需要在MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件每个文件对应数据库中的一张表。 构造会话工厂通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。 创建会话对象由会话工厂创建 SqlSession 对象该对象中包含了执行 SQL 语句的所有方法。 Executor 执行器MyBatis 底层定义了一个 Executor 接口来操作数据库它将根据 SqlSession传递的参数动态地生成需要执行的 SQL 语句同时负责查询缓存的维护。 MappedStatement 对象在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数该参数是对映射信息的封装用于存储要映射的 SQL 语句的 id、参数等信息。 输入参数映射输入参数类型可以是 Map、List 等集合类型也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。 输出结果映射输出结果类型可以是 Map、 List 等集合类型也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
18. MyBatis的功能架构是怎样的
我们把Mybatis的功能架构分为三层
API接口层提供给外部使用的接口API开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。基础支撑层负责最基础的功能支撑包括连接管理、事务管理、配置加载和缓存处理这些都是共用的东西将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
19. MyBatis的框架架构设计是怎么样的 加载配置配置来源于两个地方一处是配置文件一处是Java代码的注解将SQL的配置信息加载成为一个个MappedStatement对象包括了传入参数映射配置、执行的SQL语句、结果映射配置存储在内存中。 SQL解析当API接口层接收到调用请求时会接收到传入SQL的ID和传入对象可以是Map、JavaBean或者基本数据类型Mybatis会根据SQL的ID找到对应的MappedStatement然后根据传入参数对象对MappedStatement进行解析解析后可以得到最终要执行的SQL语句和参数。 SQL执行将最终得到的SQL和参数拿到数据库进行执行得到操作数据库的结果。 结果映射将操作数据库的结果按照映射的配置进行转换可以转换成HashMap、JavaBean或者基本数据类型并将最终结果返回。
20. Mybatis都有哪些Executor执行器它们之间的区别是什么
Mybatis有三种基本的Executor执行器SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor每执行一次update或select就开启一个Statement对象用完立刻关闭Statement对象。
ReuseExecutor执行update或select以sql作为key查找Statement对象存在就使用不存在就创建用完后不关闭Statement对象而是放置于MapString, Statement内供下一次使用。简言之就是重复使Statement对象。
BatchExecutor执行update没有selectJDBC批处理不支持select将所有sql都添加到批处理中addBatch()等待统一执行executeBatch()它缓存了多个Statement对象每个Statement对象都是addBatch()完毕后等待逐一执行executeBatch()批处理。与JDBC批处理相同。
21. Mybatis中如何指定使用哪一种Executor执行器
在Mybatis配置文件中在设置settings可以指定默认的ExecutorType执行器类型也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数如SqlSession openSession(ExecutorType execType)。
配置默认的执行器。SIMPLE 就是普通的执行器REUSE 执行器会重用预处理语句prepared statements BATCH 执行器将重用语句并执行批量更新
22. 模糊查询like语句该怎么写
’%${question}%’ 可能引起SQL注入不推荐“%”#{question}“%” 注意因为#{…}解析成sql语句时候会在变量外侧自动加单引号’ 所以这里 % 需要使用双引号 不能使用单引号 ’ 不然会查不到任何结果。CONCAT(’%’,#{question},’%’) 使用CONCAT()函数推荐使用bind标签不推荐
select idlistUserLikeUsername resultTypecom.jourwon.pojo.User
bind namepattern value% username % /
select id,sex,age,username,password from person where username LIKE #{pattern}
/select23. 在mapper中如何传递多个参数
方法1顺序传参法
public User selectUser(String name, int deptId);resultMapxxx
/resultMapselect idselectUser resultMapUserResultMapselect * from userwhere user_name #{0} and dept_id #{1}
/select#{}里面的数字代表传入参数的顺序。这种方法不建议使用sql层表达不直观且一旦顺序调整容易出错。
方法2Param注解传参法
public User selectUser(Param(userName) String name, int Param(deptId)
deptId);resultMapxxx
/resultMapselect idselectUser resultMapUserResultMapselect * from userwhere user_name #{userName} and dept_id #{deptId}
/select#{}里面的名称对应的是注解Param括号里面修饰的名称。这种方法在参数不多的情况还是比较直观的推荐使用。
方法3Map传参法
public User selectUser(MapString, Object params);resultMapxxx
/resultMapselect idselectUser parameterTypejava.util.Map resultMapUserResultMapselect * from userwhere user_name #{userName} and dept_id #{deptId}
/select#{}里面的名称对应的是Map里面的key名称。这种方法适合传递多个参数且参数易变能灵活传递的情况。推荐使用。
方法4Java Bean传参法
public User selectUser(User user);resultMapxxx
/resultMapselect idselectUser parameterTypecom.jourwon.pojo.User resultMapUserResultMapselect * from userwhere user_name #{userName} and dept_id #{deptId}
/select#{}里面的名称对应的是User类里面的成员属性。这种方法直观需要建一个实体类扩展不容易需要加属性但代码可读性强业务逻辑处理方便推荐使用。推荐使用。
24. 如何获取生成的主键
新增标签中添加keyProperty ID 即可
insert idinsert useGeneratedKeystrue keyPropertyuserId insert into user(user_name, user_password, create_time)values(#{userName}, #{userPassword} , #{createTime, jdbcTypeTIMESTAMP})
/insert25.当实体类中的属性名和表中的字段名不一样 怎么办
第1种 通过在查询的SQL语句中定义字段名的别名让字段名的别名和实体类的属性名一致。
select idgetOrder parameterTypeint resultTypecom.jourwon.pojo.Orderselect order_id id, order_no orderno ,order_price price form orderswhere order_id#{id};
/select第2种 通过来映射字段名和实体类属性名的一一对应的关系。
select idgetOrder parameterTypeint resultMaporderResultMapselect * from orders where order_id#{id}
/select
resultMap typecom.jourwon.pojo.Order idorderResultMap!–用id属性来映射主键字段–id propertyid columnorder_id!–用result属性来映射非主键字段property为实体类属性名column为数据库表中的属性–result property orderno column order_no/result propertyprice columnorder_price /
/reslutMap26.什么是MyBatis的接口绑定有哪些实现方式
接口绑定就是在MyBatis中任意定义接口然后把接口里面的方法和SQL语句绑定我们直接调用接口方法就可以这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。
接口绑定有两种实现方式
通过注解绑定就是在接口的方法上面加上 Select、Update等注解里面包含Sql语句来绑定通过xml里面写SQL来绑定 在这种情况下要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候用注解绑定 当SQL语句比较复杂时候用xml绑定一般用xml绑定的比较多。
当Sql语句比较简单时候用注解绑定当SQL语句比较复杂时候用xml绑定一般用xml绑定的比较多。
27.Mybatis的Xml映射文件中不同的Xml映射文件id是否可以重复
不同的Xml映射文件如果配置了namespace那么id可以重复如果没有配置namespace那么id不能重复毕竟namespace不是必须的只是最佳实践而已。原因就是namespaceid是作为MapString,MappedStatement的key使用的如果没有namespace就剩下id那么id重复会导致数据互相覆盖。有了namespace自然id就可以重复namespace不同namespaceid自然也就不同。
28. 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系
Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。在Xml映射文件中 标签会被解析为ParameterMap对象其每个子元素会被解析为ParameterMapping对象。 标签会被解析为ResultMap对象其每个子元素会被解析为ResultMapping对象。每一个 、 、 、 标签均会被解析为MappedStatement对象标签内的sql会被解析为BoundSql对象。
29.Mybatis映射文件中A引用了B标签A和B标签定义是否有顺序要求
虽然Mybatis解析Xml映射文件是按照顺序解析的但是被引用的B标签依然可以定义在任何地方Mybatis都可以正确识别。原理是Mybatis解析A标签发现A标签引用了B标签但是B标签尚未解析到尚不存在此时Mybatis会将A标签标记为未解析状态然后继续解析余下的标签包含B标签待所有标签解析完毕Mybatis会重新解析那些被标记为未解析的标签此时再解析A标签时B标签已经存在A标签也就可以正常解析完成了。
30. 简述Mybatis的插件运行原理以及如何编写一个插件。
Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件Mybatis使用JDK的动态代理为需要拦截的接口生成代理对象以实现接口方法拦截功能每当执行这4种接口对象的方法时就会进入拦截方法具体就是InvocationHandler的invoke()方法当然只会拦截那些你指定需要拦截的方法。
实现Mybatis的Interceptor接口并复写intercept()方法然后在给插件编写注解指定要拦截哪一个接口的哪些方法即可记住别忘了在配置文件中配置你编写的插件。
31. 通常一个 Xml 映射文件 都会写一个 Dao 接口与之对应请问 这个 Dao 接口的工作原理是什么 Dao 接口里的方法参数不同时 方法能重载吗
Dao 接口 就是人们常说的 Mapper 接口 接口的全限名 就是映射文件中的 namespace的值 接口的方法名 就是映射文件中 MappedStatement 的 id 值 接口方法内的参数就是传递给 sql 的参数。 Mapper 接口是没有实现类的 当调用接口方法时 接口全限名方法名拼接字符串作为 key 值 可唯一定位一个 MappedStatement。
Dao 接口里的方法 是不能重载的 因为是全限名方法名的保存和寻找策略。Dao 接口的工作原理是 JDK 动态代理 Mybatis 运行时会使用 JDK 动态代理为 Dao接 口 生 成 代 理 proxy 对 象 代 理 对 象 proxy 会 拦 截 接 口 方 法 转 而 执 行MappedStatement 所代表的 sql 然后将 sql 执行结果返回。
32. 当实体类中的属性名和表中的字段名不一样如果将查询的结果封装到指定pojo
通过在查询的sql语句中定义字段名的别名。通过来映射字段名和实体类属性名的一一对应的关系。
33. Mybatis中如何执行批处理
使用BatchExecutor完成批处理。
34. Mybatis执行批量插入能返回数据库主键列表吗
能JDBC都能Mybatis当然也能。
35. Mybatis是否可以映射Enum枚举类
Mybatis可以映射枚举类不单可以映射枚举类Mybatis可以映射任何对象到表的一列上。映射方式为自定义一个TypeHandler实现TypeHandler的setParameter()和getResult()接口方法。TypeHandler有两个作用一是完成从javaType至jdbcType的转换二是完成jdbcType至javaType的转换体现为setParameter()和getResult()两个方法分别代表设置sql问号占位符参数和获取列查询结果。
36. resultType和resultMap的区别
类的名字和数据库相同时可以直接设置resultType参数为Pojo类若不同需要设置resultMap 将结果名字和Pojo名字进行转换
37. 使用MyBatis的mapper接口调用时有哪些要求
Mapper接口方法名和mapper.xml中定义的每个sql的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
Mapper.xml文件中的namespace即是mapper接口的类路径。
38. Mybatis比IBatis比较大的几个改进是什么
有接口绑定包括注解绑定sql和xml绑定Sql动态sql由原来的节点配置变成OGNL表达式在一对一一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置。
39. IBatis和MyBatis在核心处理类分别叫什么
IBatis里面的核心处理类叫SqlMapClientMyBatis里面的核心处理类叫做SqlSession。
40. IBatis和MyBatis在细节上的不同有哪些
在sql里面变量命名有原来的#变量# 变成了#{变量}原来的 变成了${变量}原来在sql节点里面的class都换名字叫type原来的queryForObject queryForList 变成了selectOne selectList原来的别名设置在映射文件里面放在了核心配置文件里 数类型和mapper.xml中定义的每个sql的resultType的类型相同
Mapper.xml文件中的namespace即是mapper接口的类路径。
38. Mybatis比IBatis比较大的几个改进是什么
有接口绑定包括注解绑定sql和xml绑定Sql动态sql由原来的节点配置变成OGNL表达式在一对一一对多的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置。
39. IBatis和MyBatis在核心处理类分别叫什么
IBatis里面的核心处理类叫SqlMapClientMyBatis里面的核心处理类叫做SqlSession。
40. IBatis和MyBatis在细节上的不同有哪些
在sql里面变量命名有原来的#变量# 变成了#{变量}原来的 变成了${变量}原来在sql节点里面的class都换名字叫type原来的queryForObject queryForList 变成了selectOne selectList原来的别名设置在映射文件里面放在了核心配置文件里