ResultMap结果集映射
声明:本文章属于学习笔记,根据狂神说的Mybatis编写
Mybatis在线文档:https://mybatis.org/mybatis-3/zh/index.html
一丶结果集映射
首先我们看这样的一个问题:假如我们的字段名和属性名不一致,该怎么办。
我们可以看这样一段代码:
User实体类:
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
数据库中mybatis表:
我们可以注意到虽然我们的id和name相同,但是pwd和password不相同!
UserMapper.XML:
测试类测试:
public class UserDaoTest {
@Test
public void tset1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
sqlSession.close();
}
}
所以我们在这时运行程序看我们的输出结果:
我们可以看到这个时候,pwd是输出为null的。 只是因为我们的实体类中的pwd和数据库中的password不相同!
但是我们可以有很多种解决的方法,
1丶给字段起别名:
运行结果:
2丶ResultMap映射:
这个结果集映射的解决办法无意识重中之重!
<mapper namespace="com.kdy.dao.UserMapper">
//User为实体类
<resultMap id="UserMap" type="User">
<!-- column 数据库的字段 property 实体类的字段 -->
<result column="id" property="id"/>
<result column="nanme" property="name"/>
<result column="password" property="pwd"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
/*可以用起别名的方法进行sql的查询*/
select* from mybatis.user where id=#{id};
</select>
</mapper>
运行结果:
其实这只是一个简单的举例,因为代码太少,ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
我们看下官方文档上的例子:
我们可以看到真的是方便了很多。
ResultMap 的优秀之处——你完全可以不用显式地配置它们,所以我们在上面的例子上完全可以将,id和name注释掉,只去显示pwd和password:
二丶日志工厂
如果一个数据库操作,出现了异常那么,日志工厂就是最好的助手,因为他们清楚地显示出来程序的运行过程!
官方文档的日志标准:
一个配置完整的 settings 元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
我们可以拿自己的mybatis-config.xml配置文件举例:
运行结果级补充:
我们可以很清楚地看到,有了日志之后,执行流程的清晰和顺畅。
三丶LOG4J
LOG4J 其实也是一个日志,只不过我们需要进行配置:
log4j.properties:
#\u5C06\u7B49\u7EA7\u4E3ADEBUG\u7684\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230console\u548Cfile\u8FD9\u4E24\u4E2A\u76EE\u7684\u5730\uFF0Cconsole\u548Cfile\u7684\u5B9A\u4E49\u5728\u4E0B\u9762\u7684\u4EE3\u7801
log4j.rootLogger=DEBUG,console,file
#\u63A7\u5236\u53F0\u8F93\u51FA\u7684\u76F8\u5173\u8BBE\u7F6E
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
#\u6587\u4EF6\u8F93\u51FA\u7684\u76F8\u5173\u8BBE\u7F6E
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kdy.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][qinjiang%d{yy-MM-dd}][%c]%m%n
#\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B
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
我们想要使用还需要在pom.xml文件中导入Maven依赖:
<!--log4j依赖-->
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
测试类测试:
public class UserDaoTest {
static Logger logger = Logger.getLogger(UserDaoTest.class);
@Test
public void tset1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
logger.info("打入地方内部");
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
sqlSession.close();
}
}
运行结果:
我们可以同时看到:
有log文件的生成,这是因为我们的配置文件中的
表明了在哪里将日志生成。
kdy.log文件:
日志文件能够清楚地看到程序运行的过程,方便与我们改错