什么牌子的十大内存条的品牌排行好

MyBatis多参数传递之Map方式示例
我的图书馆
MyBatis多参数传递之Map方式示例
& & & 前面的文章介绍了MyBatis多参数传递的注解、参数默认命名等方式,今天介绍Map的方式。仍然以前面的分页查询教师信息的方法findTeacherByPage为例(示例源代码下载地址:)。&&&&&&首先修改映射器接口TeacherMapper中的findTeacherByPage方法如下:12//分页查询教师信息public&List&Teacher&&findTeacherByPage(Map&String,&Object&&map);&&&&&&相应地,这里用到了Map接口,就应该引入此接口:import&java.util.Map。在执行类CollectionDemo中,调用findTeacherByPage方法的相关代码如下:1234567891011Map&String,&Object&&params&=&new&HashMap&String,&Object&();//以name字段升序排序,params.put("sort",&"name");params.put("dir",&"asc");//查询结果从第0条开始,查询2条记录params.put("start",&0);params.put("limit",&2);//查询职称为教授或副教授的教师params.put("title",&"%教授");//分页查询教师信息List&Teacher&&teachers&=&mapper.findTeacherByPage(params);&&&&&&可以看出,我们先把参数放在了一个Map中,这样我们就可以在相应的SQL语句中以#{…}的形式引用这些参数了。如下所示:12345&select&id="findTeacherByPage"&resultMap="supervisorResultMap"parameterType="java.util.Map"&select&*&from&teacher&where&title&like&#{title}order&by&${sort}&${dir}&limit&#{start},#{limit}&/select&&&&&&&&与以前一样,在order&by子句中应使用${…}的方式。实际上,这里的parameterType="java.util.Map"可以不要。&&&&&&运行结果如下:【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例本文出自 “” 博客,请务必保留此出处
TA的最新馆藏String数组作为参数传递的问题
你好,想跟你请教个问题:
此处传的参数是String数组,请问这里的parameterType是否要写?要写的话是不是写成 parameterType=“String”呢?
还有,我的in里面的条件是字符串的 &也就是这样 &in ('a','b','c') &但按照我下面的那样写是查不出来,所以在这里想请教一下,多谢了
&select id="getViewHistory" resultMap="productResultMap"&
select * from product where id in
&foreach collection="array" item="item" index="index" open="(" separator="," close=")"&
&/foreach&
不好意思,才看到。
其实我之前的提问,是这种场景:我可以直接拿到逗号分隔的ID字符串,我觉得没有必要转成List,又在SQL里遍历去拼一遍,所以想直接那这个字符串作为参数,实际上,即便你获取到的是一个集合,但也完全没必要把这个逻辑写在SQL里,直接用apache的StringUtils.join转换成字符串去查,没什么区别,下面是我的一个简单SQL的配置:
&select id="getProductIdsByPhotoIds" resultType="java.lang.Long" parameterType="java.lang.String"&
&& &&& &SELECT DISTINCT OBJECT_ID
&& &&& &FROM COM_PHOTO
&& &&& &WHERE PHOTO_ID IN (${_parameter})
&& &&/select&
--- 共有 1 条评论 ---
你说的这种方法我还没试过,现在用的是直接传String数组,没有去转list集合了,不过在sql里面还是要去操作数组。感谢回复!
为什么不自己拼成String?
引用来自“Ascend_”的评论少了个
getTotalPage方法吧,并没有看到在哪里去处理页数,分页语句调用后,查询列表的语句未执行终于可以了,是这个分页代码写错了,真的很感谢!
getTotalPage方法吧,并没有看到在哪里去处理页数,分页语句调用后,查询列表的语句未执行
引用来自“Ascend_”的评论Caused by: java.lang.NullPointerException
at ziyou.zixi.pulgin.mybatis.plugin.PagePlugin.intercept(PagePlugin.java:104)
这里在做什么操作
package ziyou.zixi.pulgin.mybatis.
import java.sql.C
import java.sql.PreparedS
import java.sql.ResultS
import java.util.M
import java.util.P
import java.util.S
import java.util.Map.E
import javax.xml.bind.PropertyE
import org.apache.ibatis.executor.parameter.DefaultParameterH
import org.apache.ibatis.executor.statement.BaseStatementH
import org.apache.ibatis.executor.statement.RoutingStatementH
import org.apache.ibatis.executor.statement.StatementH
import org.apache.ibatis.mapping.BoundS
import org.apache.ibatis.mapping.MappedS
import org.apache.ibatis.plugin.I
import org.apache.ibatis.plugin.I
import org.apache.ibatis.plugin.I
import org.apache.ibatis.plugin.P
import org.apache.ibatis.plugin.S
import ziyou.zixi.pulgin.jdbc.dialet.D
import ziyou.
import ziyou.zixi.util.PageV
&* Mybatis的分页查询插件,通过拦截StatementHandler的prepare方法来实现。&
&* 只有在参数列表中包括Page类型的参数时才进行分页查询。&
&* 在多参数的情况下,只对第一个Page类型的参数生效。&
&* 另外,在参数列表中,Page类型的参数无需用@Param来标注&
@SuppressWarnings("unchecked")
@Intercepts( { @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
public class PagePlugin implements Interceptor {
private static Dialect dialectObject = // 数据库方言
private static String pageSqlId = ""; // mybaits的数据库xml映射文件中需要拦截的ID(正则匹配)
public Object intercept(Invocation ivk) throws Throwable {
if (ivk.getTarget() instanceof RoutingStatementHandler) {
RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk
.getTarget();
BaseStatementHandler delegate = (BaseStatementHandler) ReflectHelper
.getValueByFieldName(statementHandler, "delegate");
MappedStatement mappedStatement = (MappedStatement) ReflectHelper
.getValueByFieldName(delegate, "mappedStatement");
* 方法1:通过ID来区分是否需要分页..*query.*
* 方法2:传入的参数是否有page参数,如果有,则分页,
// if (mappedStatement.getId().matches(pageSqlId)) { // 拦截需要分页的SQL
BoundSql boundSql = delegate.getBoundSql();
Object parameterObject = boundSql.getParameterObject();// 分页SQL&select&中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空
if (parameterObject == null) {
//throw new NullPointerException("boundSql.getParameterObject() is null!");
return ivk.proceed();
PageView pageView =
if (parameterObject instanceof PageView) { // 参数就是Pages实体
pageView = (PageView) parameterO
} else if (parameterObject instanceof Map) {
for (Entry entry : (Set&Entry&) ((Map) parameterObject)
.entrySet()) {
if (entry.getValue() instanceof PageView) {
pageView = (PageView) entry.getValue();
} else { // 参数为某个实体,该实体拥有Pages属性
pageView = ReflectHelper.getValueByFieldType(
parameterObject, PageView.class);
if (pageView == null) {
return ivk.proceed();
String sql = boundSql.getSql();
PreparedStatement countStmt =
ResultSet rs =
Connection connection = (Connection) ivk.getArgs();
String countSql = "select count(1) from (" + sql
+ ") tmp_count"; // 记录统计
countStmt = connection.prepareStatement(countSql);
ReflectHelper.setValueByFieldName(boundSql, "sql",
countSql);
DefaultParameterHandler parameterHandler = new DefaultParameterHandler(
mappedStatement, parameterObject, boundSql);
parameterHandler.setParameters(countStmt);
rs = countStmt.executeQuery();
int count = 0;
if (rs.next()) {
count = ((Number) rs.getObject(1)).intValue();
pageView.setRowCount(count);
} finally {
rs.close();
} catch (Exception e) {
countStmt.close();
} catch (Exception e) {
String pageSql = generatePagesSql(sql, pageView);
ReflectHelper.setValueByFieldName(boundSql, "sql", pageSql); // 将分页sql语句反射回BoundSql.
return ivk.proceed();
* 根据数据库方言,生成特定的分页sql
* @param page
private String generatePagesSql(String sql, PageView page) {
if (page != null && dialectObject != null) {
//pageNow默认是从1,而已数据库是从0开始计算的.所以(page.getPageNow()-1)
int pageNow = page.getPageNow();
return dialectObject.getLimitString(sql, (pageNow&=0?0:pageNow-1)
* page.getPageSize(), page.getPageSize());
public Object plugin(Object target) {
return Plugin.wrap(target, this);
public void setProperties(Properties p) {
String dialect = ""; // 数据库方言
dialect = p.getProperty("dialect");
if (Common.isEmpty(dialect)) {
throw new PropertyException("dialect property is not found!");
} catch (PropertyException e) {
e.printStackTrace();
dialectObject = (Dialect) Class.forName(dialect)
.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException(dialect + ", init fail!\n" + e);
pageSqlId = p.getProperty("pageSqlId");//根据id来区分是否需要分页
if (Common.isEmpty(pageSqlId)) {
throw new PropertyException("pageSqlId property is not found!");
} catch (PropertyException e) {
e.printStackTrace();
Caused by: java.lang.NullPointerException
at ziyou.zixi.pulgin.mybatis.plugin.PagePlugin.intercept(PagePlugin.java:104)
这里在做什么操作
引用来自“Ascend_”的评论
1.需要传数组时,一般为java.util.List做参数,&parameterType=java.lang.List
2.&select id="getViewHistory" resultMap="productResultMap"&缺少parameterType
引用来自“子柚only”的评论依旧报错!
List&Product& getViewHistory(List&String& pro);
&select id="getViewHistory" resultMap="productResultMap" parameterType="java.util.List"&
select * from product where id in&
&foreach collection="list" item="item" index="index" open="(" separator="," close=")"&
&/foreach&
&/select&引用来自“Ascend_”的评论报什么错引用来自“子柚only”的评论EBUG
17:05:59,316 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-6 ==& &Preparing: select count(1) from (select * from product where id in ( ? , ? , ? )) tmp_count&
17:05:59,318 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-6 ==& Parameters: a(String), b(String), c(String)
17:05:59,330 org.mybatis.spring.SqlSessionUtils.http-8000-6 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8ba0dd4]
==============异常开始=============
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:&
### Error querying database. &Cause: java.lang.NullPointerException
### The error may exist in mybatis/Product.xml
### The error may involve ziyou.zixi.mapper.ProductMapper.getViewHistory-Inline
### The error occurred while setting parameters
### Cause: java.lang.NullPointerExceptionEBUG
17:35:26,468 org.mybatis.spring.SqlSessionUtils.http-8000-4 SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@75e79c77] was not registered for synchronization because synchronization is not active
17:35:26,501 org.mybatis.spring.transaction.SpringManagedTransaction.http-8000-4 JDBC Connection [com.mysql.jdbc.JDBC4Connection@11b2c43e] will not be managed by Spring
17:35:26,501 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-4 ooo Using Connection [com.mysql.jdbc.JDBC4Connection@11b2c43e]
17:35:26,502 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-4 ==& &Preparing: select count(1) from (select * from product where id in ( ? , ? , ? )) tmp_count&
17:35:26,503 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-4 ==& Parameters: a(String), b(String), c(String)
17:35:26,509 org.mybatis.spring.SqlSessionUtils.http-8000-4 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@75e79c77]
==============异常开始=============
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:&
### Error querying database. &Cause: java.lang.NullPointerException
### The error may exist in mybatis/Product.xml
### The error may involve ziyou.zixi.mapper.ProductMapper.getViewHistory-Inline
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
at $Proxy22.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:195)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:124)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at $Proxy25.getViewHistory(Unknown Source)
at ziyou.zixi.service.impl.ProductServiceImpl.getViewHistory(ProductServiceImpl.java:78)
at ziyou.zixi.service.impl.ProductServiceImpl$$FastClassByCGLIB$$9efef58b.invoke(&generated&)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at ziyou.zixi.service.impl.ProductServiceImpl$$EnhancerByCGLIB$$e0f44cde.getViewHistory(&generated&)
at ziyou.zixi.controller.client.WebController.getViewHistory(WebController.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.apache.ibatis.exceptions.PersistenceException:&
### Error querying database. &Cause: java.lang.NullPointerException
### The error may exist in mybatis/Product.xml
### The error may involve ziyou.zixi.mapper.ProductMapper.getViewHistory-Inline
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355)
... 50 more
Caused by: java.lang.NullPointerException
at ziyou.zixi.pulgin.mybatis.plugin.PagePlugin.intercept(PagePlugin.java:104)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:57)
at $Proxy50.prepare(Unknown Source)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:70)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:56)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)
... 56 more
==============异常结束=============
select * from product where id in ( 'a', 'b' , 'c')有数据?
--- 共有 1 条评论 ---
有的,数据库中有id为a、b、c的这三条数据
引用来自“Ascend_”的评论
1.需要传数组时,一般为java.util.List做参数,&parameterType=java.lang.List
2.&select id="getViewHistory" resultMap="productResultMap"&缺少parameterType
引用来自“子柚only”的评论依旧报错!
List&Product& getViewHistory(List&String& pro);
&select id="getViewHistory" resultMap="productResultMap" parameterType="java.util.List"&
select * from product where id in&
&foreach collection="list" item="item" index="index" open="(" separator="," close=")"&
&/foreach&
&/select&引用来自“Ascend_”的评论报什么错EBUG
17:05:59,316 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-6 ==& &Preparing: select count(1) from (select * from product where id in ( ? , ? , ? )) tmp_count&
17:05:59,318 ziyou.zixi.mapper.ProductMapper.getViewHistory.http-8000-6 ==& Parameters: a(String), b(String), c(String)
17:05:59,330 org.mybatis.spring.SqlSessionUtils.http-8000-6 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@8ba0dd4]
==============异常开始=============
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:&
### Error querying database. &Cause: java.lang.NullPointerException
### The error may exist in mybatis/Product.xml
### The error may involve ziyou.zixi.mapper.ProductMapper.getViewHistory-Inline
### The error occurred while setting parameters
### Cause: java.lang.NullPointerException
--- 共有 1 条评论 ---
把异常贴全点
parameterType="java.util.Map"
--- 共有 1 条评论 ---11479人阅读
mybatis(3)
在使用mybatis过程中可能存在传入多个参数的可能性 其中可能有单纯的字符类型也可能有复杂的list类型 使用map则解决了这些问题
首先 说一下list作为参数的使用方法
&span style=&white-space:pre&& &/span& select
id, city_id, owner_id
item where
&span style=&white-space:pre&&
&/span& &foreach item=&item& index=&index& collection=&list&
open=&(& separator=&,& close=&)&&
&span style=&white-space:pre&&
&span style=&white-space:pre&&
&/span&&/foreach&& & &mybatis的xml配置文件里不需要写参数类型 只在相对应的接口里把方法入参类型写清楚就ok了 eg
&span style=&white-space:pre&&
&/span&List&Item& getItemByItemIds(List&Integer& itemIds);
传入map类型 &写法与传入list相似 xml里不需要写参数类型&如下
r.id, r.info_id, r.item_id,
rent_content r
r.id NOT IN (
rent_content_id
rent_calendar
rent_content_id = r.id
AND begin_time &#{endDate}
AND end_time & #{startDate}
and r.car_item_id in
&foreach item=&item& index=&index& collection=&list&
open=&(& separator=&,& close=&)&&
&/foreach&只在相对应的接口里写清楚就ok了
List&RentContent& &selectTime(HashMap hashMap);
foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
注意&你可以将一个
List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”
相关链接http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94117次
积分:1283
积分:1283
排名:千里之外
原创:44篇
评论:14条
(5)(3)(2)(2)(2)(1)(11)(2)(6)(2)(6)(4)(3)(3)

我要回帖

更多关于 十大内存条的品牌排行 的文章

 

随机推荐