selectList
查询不到时,返回空list。可以通过list.size()判断是否查询到。
List<User> list = sqlSession.selectList("selAll");
源码
@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
selectOne
底层调用selectList,有一条数据就直接通过list.get()取得,超过一条抛出异常,没有返回null。
源码
@Override
public <T> T selectOne(String statement, Object parameter) {
// Popular vote was to return null on 0 results and throw exception on too many.
List<T> list = this.selectList(statement, parameter);
if (list.size() == 1) {
return list.get(0);
} else if (list.size() > 1) {
throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
} else {
return null;
}
}
selectMap
selectMap第二个参数要指定那一列作为map的key,一般选者主键列。查询不到时,返回空map。
Map<Integer, User> map = sqlSession.selectMap("selAll", "id");
Set<Map.Entry<Integer, User>> entries = map.entrySet();
for ( Map.Entry<Integer, User> user :entries){
System.out.println(user);
}
源码
对selectList查询查询出来的list与key匹配。
@Override
public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
final List<? extends V> list = selectList(statement, parameter, rowBounds);
final DefaultMapResultHandler<K, V> mapResultHandler = new DefaultMapResultHandler<>(mapKey,
configuration.getObjectFactory(), configuration.getObjectWrapperFactory(), configuration.getReflectorFactory());
final DefaultResultContext<V> context = new DefaultResultContext<>();
for (V o : list) {
context.nextResultObject(o);
mapResultHandler.handleResult(context);
}
return mapResultHandler.getMappedResults();
}
log4j
提供配置文件, 可以使用properties或xml, 一般使用properties。 命名必须叫log4j.properties, 位置必须放在src下。
//指定要打印日志的类
private Logger logger=Logger.getLogger(TestLog4j.class);
@Test
public void testLog4j(){
logger.fatal("致命错误");//FATAL, 致命的, 不是代码导致的, 一般是服务器宕机, 网络故障, 硬件故障
logger.error("程序错误");//ERROR, 错误, 一般由程序故障导致
logger.warn("警告");//WARN, 警告, 一般不会影响程序的运行, 但是可能存在风险
logger.info("信息");//INFO, 信息, 系统输出的一些简单信息
logger.debug("调试");//DEBUG, 调试, 程序要认为调试的输出信息
logger.trace("跟踪信息");//TRACE, 跟踪, 显示代码的详细执行流程.
}
log4j.properties配置文件
# 设置log4j的根(整体)日志级别, 同时指定日志输出的位置: CONSOLE表示控制台, LOGFILE表示日志文件
log4j.rootCategory=INFO, CONSOLE#全局级别
#log4j.rootCategory=INFO, CONSOLE, LOGFILE
# 设置局部位置的日志级别,映射文件下的哪个命名空间下的id(也可以只是命名空间)的单独级别trace以下都会显示
#log4j.logger.org.apache.axis.enterprise=FATAL
# 设置控制台日志输出的格式
# 常用符号
# %m: message, 日志消息
# %n: 回车换行
# %d: 日期时间, 可以自定义日期时间格式, %d{yyyy-MM-dd HH:mm:ss}
# %p: 日志级别
# %l: 日志发生的具体位置
# %c: 定位, 包名.类名
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- [%p]%m %l%n
# 设置日志文件中日志输出的格式
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
<!--引入数据库配置文件,软编码-->
<properties resource="db.properties"/>
<!--支持log4j-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
设置局部日志等级
log4j.logger.Mapper中的命名空间=级别
# 设置局部位置的日志级别
log4j.logger.kong=TRANCE