标签:接口 OLE 多个 修改 stdout ibatis log 工作内容 std
什么时候会出现这个问题?
问题复现
数据库中字段设置
实体类中的属性设置
public class User {
private int id;
private String name;
private String password;
}
查询测试
@Test
public void test() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getUsers();
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
从查询结果中可以看出,数据库中的pwd字段没有正确映射到实体类中的password属性上
对SQL语句的分析:
select * from user <==> select id,name,pwd from user
MyBatis通过查询语句中的字段,去对应的实体类中查找相应属性名的set方法。但是,在本例中,实体类中没有pwd的set方法,所以字段pwd的值无法赋值给实体类,也就造成了查询结果中放回为null的情况
解决方法
指定别名,使得别名和java类中的属性名一一对应
使用结果集进行映射
<resultMap id="UserMap" type="User">
<!-- column是数据库表的列名, property是对应实体类的属性名-->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
resultMap
元素是 MyBatis 中最重要最强大的元素。ResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。resultMap
能够代替实现同等功能的数千行代码。对于简单的语句,我们可以不用手动配置ResultMap,因为ResultMap的自动映射完全可以满足我们的需求,我们需要做的就是确保属性名和查询到的字段名能一一对应上即可
示例
实体类
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
}
mapper.xml
<select id="getUsers" resultType="com.pbx.pojo.User">
select * from user
</select>
测试
@Test
public void test() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getUsers();
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
如果说实体类中的属性和数据库的字段不同,可以在SQL设置别名进行匹配
简单来说,如果你的SQL语句足够简单,那么完全不需要手动配置ResultMap,可以通过SQL设置别名来使得自动装配可以正确执行。
示例
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
<select id="selectUsers" resultMap="userResultMap">
select user_id, user_name, hashed_password
from some_table
where id = #{id}
</select>
注意点
resultMap
属性就行了(注意去掉了 resultType
属性)MyBatis支持日志记录功能,需要在mybatis-config.xml文件中配置相应的参数以开启日志功能
mybatis-config.xml配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
MyBatis支持的日志类型
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
日志输出示例
在maven中导入log4j的依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
在mybatis-config.xml中开启日志记录功能
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
编写log4j.properties配置文件
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.encoding = UTF-8
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.encoding = UTF-8
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.encoding = UTF-8
log4j.appender.E.File = logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
目前已经不流行了,这是通过Java代码实现的
mapper接口
List<User> getUserByRowBounds();
mapper.xml文件
<select id="getUserByRowBounds" resultType="user">
select * from user
</select>
测试类
@Test
public void testUserByRowBounds() {
SqlSession session = MybatisUtils.getSession();
int currentPage = 2; //第几页
int pageSize = 2; //每页显示几个
RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);
//通过session.**方法进行传递rowBounds,[此种方式现在已经不推荐使用了]
List<User> users = session.selectList("com.kuang.mapper.UserMapper.getUserByRowBounds",null, rowBounds);
for (User user: users){
System.out.println(user);
}
}
目的:解耦,可拓展,提高代码复用
在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。
什么是接口
对于像 BlogMapper 这样的映射器类来说,还有另一种方法来完成语句映射。 它们映射的语句可以不用 XML 来配置,而可以使用 Java 注解来配置。比如,上面的 XML 示例可以被替换成如下的配置:
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
对于简单的语句,使用注解可以加快开发速度。但对于一些复杂的SQL语句,注解就显得力不从心
MyBatis的详细执行流程
mapper接口文件
package com.pbx.mapper;
import com.pbx.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
/**
* @author BruceXu
* @since 2020/10/30
*/
public interface UserMapper {
@Select("select * from user")
List<User> getUsers();
@Select("select * from user where id = #{pid}")
User getUserByID(@Param("pid") int id);
@Insert("insert into user (id,name,pwd) values (#{id}, #{name}, #{pwd})")
int insert(User user);
@Update("update user set name = #{newName} where id = #{id}")
int update(@Param("newName") String name, @Param("id") int id);
@Delete("delete from user where id = #{id}")
int delete(@Param("id") int id);
}
注册mapper文件
<mappers>
<mapper class="com.pbx.mapper.UserMapper"/>
</mappers>
测试类
package com.pbx;
import com.pbx.mapper.UserMapper;
import com.pbx.pojo.User;
import com.pbx.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @author BruceXu
* @date 2020/11/3
*/
public class test {
@Test
public void test() {
SqlSession session = MyBatisUtils.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> list = mapper.getUsers();
for (User user : list) {
System.out.println(user);
}
System.out.println("=============================");
mapper.insert(new User(5, "bf", "123"));
User t = mapper.getUserByID(5);
System.out.println(t);
System.out.println("=============================");
mapper.update("gf", 5);
t = mapper.getUserByID(5);
System.out.println(t);
System.out.println("=============================");
mapper.delete(5);
list = mapper.getUsers();
for (User user : list) {
System.out.println(user);
}
System.out.println("=============================");
session.commit();
session.close();
}
}
标签:接口 OLE 多个 修改 stdout ibatis log 工作内容 std
原文地址:https://www.cnblogs.com/primabrucexu/p/13937407.html