5、解决属性名与字段名不一至的问题
1、问题
测试
数据库字段
id name pwd
实体类属性
public class User {
private Integer id;
private String name;
private String password;
}
发现实体类和数据库字段属性不一致、
测试
@org.junit.Test
public void getUserList(){
//第一步:通过工具了获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//通过getMapper里面传递接口的class
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//如何使用得出的对象点方法、就可以得出结果
User user = mapper.getUserById(1);
System.out.println(user);
//关闭sqlSession
sqlSession.close();
}
测试结果
User(id=1, name=小明, password=null)
测试结果发现password的值null、原因就是数据库字段和实体类属性名不一致、导致类型处理器找不到对应属性字段、结果为null
解决方法1:
-
通过设置SQL设置字段别名、和实体类一致
原sql:select * from user where id = #{id} 新sql:select id,name,pwd as password from user where id = #{id}
测试结果:
User(id=1, name=小明, password=123456)
解决方法2
2、resultMap
resultMap :结果集映射。
数据库字段: id name pwd
实体类属性: id name password
xml映射文件(编写SQL的xml)
<!-- 结果集映射 -->
<resultMap id="getUser" type="user">
<!--
column : 字段、数据库中对的字段
property : 属性、实体类中的属性
-->
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="getUser">
select * from user where id = #{id}
</select>
xml映射文件属性名对应的值说明
标签:
resultMap
:结果集映射result
:结果select
: 查询结果
属性:
- 在
select
标签中的resultMap
属性对应的值是为了绑定resultMap
标签中的id属性的值 type
:映射的结果类型column
:字段、数据库中对的字段、property
:属性、实体类中的属性
总结:
- resultMap :结果集映射、一般用于复杂的SQL、简单的SQL用不上、
- 在
select
标签中的resultMap
的值要和resultMap
标签中id
属性值对应上、相当于就是把他们两绑定在一起。 column
和property
的作用是、在数据库字段和实体类属性不一致的情况下使用、什么属性名不一样就绑上对应的实体类属性名、和数据库字段名
6、日志
6.1、日志工厂
mybatis中设置的日志实现
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
在mybatis中具体选择哪一个实现日志、看在mybatis的核心配置文件中设置
- STDOUT_LOGGING : 标准日志输出
在mybatis的核心配置文件配置默认日志实现
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
6.2、Log4j
什么是Log4j?
- Log4j是apache的一个开源项目、通过使用log4j、我们可以控制日志输送的目的地是控制台、文件、GUI组件
- 我们可以控制每一条日志的输出格式、
- 通过定义每一条日志信息的级别、我们能够更加细致地控制日志的生成过程。
- 通过一个配置文件来灵活的进行配置、而不需要修改应用代码。
Log4j的使用
1、先导Log4j的包
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、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/log.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 HH:mm:ss}][%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、配置log4j为日志的实现
<settings>
<!-- 标准的日志实现 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
简单使用:
1、在要使用log4j的类、导入包 import org.apache.log4j.Logger;
注意不要导错、
2、使用
// 创建日志对象
private static Logger logger = Logger.getLogger(Test.class);
@org.junit.Test
public void a() {
// 使用日志级别
logger.info("info...");
logger.debug("debug...");
logger.error("error...");
}
7、分页
为什么要使用分页?
- 减少数据的处理量、
- 避免一次查询大量数据
使用limit实现分页
sql语法: select * from 表名 limit startIndex,pageSize;
-- 这种传递一个参数的就是查询0到3的数据
select * from 表名 limit 3; 【0,N】
7.1、使用mybatis做基本的分页
1、接口
//分页
List<User> getUserByLimit(Map<String,Integer> map);
2、xxxxxmapper.xml
<!-- 分页 -->
<select id="getUserByLimit" parameterType="map" resultType="user">
select * from user limit #{startIndex},#{pageSize}
</select>
3、测试
@org.junit.Test
public void getUserByLimit() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Integer> map = new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",3);
List<User> userByLimit = mapper.getUserByLimit(map);
for (User user : userByLimit) {
System.out.println(user);
}
sqlSession.close();
}
7.2、RowBounds分页
1、接口
//分页2
List<User> getUserByRowBounds();
2、xxxmapper.xml
<!-- 分页2 -->
<select id="getUserByRowBounds" resultType="user">
select * from user;
</select>
3、测试
@org.junit.Test
public void getUserByRowBounds() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
RowBounds rowBounds = new RowBounds(0,2);
List<User> list = sqlSession.selectList("com.wei.mapper.UserMapper.getUserByRowBounds",null,rowBounds);
for (User user : list) {
logger.info(user);
}
sqlSession.close();
}
这种分页是查询全部数据、然后通过RowBounds对象中的值来去数据库的数据0-几条数据