5.ResultMap, 解决属性名和字段名不一致的问题
5.1.出现的情况
实体类的字段跟数据库字段不一致
查询结果–获取不到pwd
分析原因
原来使用的SQL是
select * from mybatis.user where id = #{id}
改为全称
select id,name,pwd from mybatis.user where id = #{id}
发现我们获取的是password, 这里查看的是pwd
解决方案一:SQL起一个别名
select id,name,pwd as password from mybatis.user where id = #{id}
就可以查询到了User{id=1, name='张三', password='123'}
解决方案二: resultMap
结果集映射
<select id="getUserByID" resultType="user" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
- resultType改为resultMap(结果集映射)
- 添加resultMap标签
<resultMap id="map" type="User">
<!--column 数据库字段, property实体类的属性-->
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserByID" resultMap="map" >
select * from mybatis.user where id = #{id}
</select>
可以查出:User{id=1, name='张三', password='123'}
5.2, resultMap
-
**
resultMap
元素是 MyBatis 中最重要最强大的元素。**它可以让你从 90% 的 JDBCResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。 -
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
-
在学习了上面的知识后,你会发现上面的例子没有一个需要显式配置
ResultMap
,这就是ResultMap
的优秀之处——你完全可以不用显式地配置它们。只需要配置实体类中属性与数据库字段不一致的列 -
如果这个世界总是这么简单就好了。
-
高级结果映射
6.日志
6.1.日志工厂
如果数据库操作异常, 拍错需要使用到日志
mybatis设置
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING |
---|---|---|
设置名 | 描述 | 有效值 |
- SLF4J
- LOG4J 掌握
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING 掌握
- NO_LOGGING
STDOUT_LOGGING日志
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
配置好之后打印日志
6.2.使用Log4J
log4j简介:
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
- 这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
1, pom中导入依赖
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2,resources下添加log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern={%c}-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/log4j.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern={%p}{%d{yy-MM-dd}}{%c}%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
3.mybatis-config.xml里配置setting
<settings>
<!--标准的日志工厂实现-->
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<setting name="logImpl" value="LOG4J"/>
</settings>
4.打印日志
{org.apache.ibatis.transaction.jdbc.JdbcTransaction}-Opening JDBC Connection
{org.apache.ibatis.datasource.pooled.PooledDataSource}-Created connection 599491651.
{org.apache.ibatis.transaction.jdbc.JdbcTransaction}-Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@23bb8443]
{com.ccc.dao.UserMapper.getUserByID}-==> Preparing: select * from mybatis.user where id = ?
{com.ccc.dao.UserMapper.getUserByID}-==> Parameters: 1(Integer)
{com.ccc.dao.UserMapper.getUserByID}-<== Total: 1
User{id=1, name='张三', password='123'}
{org.apache.ibatis.transaction.jdbc.JdbcTransaction}-Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@23bb8443]
{org.apache.ibatis.transaction.jdbc.JdbcTransaction}-Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@23bb8443]
{org.apache.ibatis.datasource.pooled.PooledDataSource}-Returned connection 599491651 to pool.
Process finished with exit code 0
5.log4j简单使用
1, 在当前类加载logger对象
static Logger logger = Logger.getLogger(UserDaoTest.class);
2.日志级别
logger.info("log4j----info");
logger.debug("log4j----debug");
logger.error("log4j----error");
7.分页
**为什么要分页? **
- 减少数据量
使用limit分页
select * from user limit 0,1
7.1.使用mybatis实现分页
1,接口
public interface UserMapper {
User getUserByID(int id);
//分页
List<User> getUserLimit(Map<String,Object> map);
}
2,mapper
<select id="getUserLimit" resultType="user" parameterType="map">
select * from user limit #{startIndex},#{pageSize}
</select>
3,测试
@Test
public void getUserLimit(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userList = mapper.getUserLimit(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();