珠宝网站建设要以商为本,大良网站建设dwxw,网页设计的风格可分为两大类,网站建设背景 前景分析查询为null问题 要解决的问题#xff1a;属性名和字段名不一致 环境#xff1a;新建一个项目#xff0c;将之前的项目拷贝过来 1、查看数据库的字段名 2、Java中的实体类设计
public class User {
private int id; //id
private String name; //姓名
private String passwo…查询为null问题 要解决的问题属性名和字段名不一致 环境新建一个项目将之前的项目拷贝过来 1、查看数据库的字段名 2、Java中的实体类设计
public class User {
private int id; //id
private String name; //姓名
private String password; //密码和数据库不一样数据库中字段名为pwd
//构造
//set/get
//toString()
}3、接口 //根据id查询用户
User selectUserById(int id);4、mapper映射文件 select * from user where id #{id} 5、测试
Test
public void testSelectUserById() {
SqlSession session MybatisUtils.getSession(); //获取SqlSession连接
UserMapper mapper session.getMapper(UserMapper.class);
User user mapper.selectUserById(1);
System.out.println(user);
session.close();
}结果: User{id1, name‘狂神’, password‘null’} 查询出来发现 password 为空 . 说明出现了问题 分析 select * from user where id #{id} 可以看做 select id,name,pwd from user where id #{id} mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设 值 , 由于找不到setPwd() , 所以password返回null ; 【自动映射】 解决方案 方案一为列名指定别名 , 别名和java实体类的属性名一致 .
select idselectUserById resultTypeUser
select id , name , pwd as password from user where id #{id}
/select方案二使用结果集映射-ResultMap 【推荐】
resultMap idUserMap typeUser
!-- id为主键 --
id columnid propertyid/
!-- column是数据库表的列名 , property是对应实体类的属性名 --
result columnname propertyname/
result columnpwd propertypassword/
/resultMap
select idselectUserById resultMapUserMap
select id , name , pwd from user where id #{id}
/selectResultMap—自动映射
ResultMap 的设计思想是对于简单的语句根本不需要配置显式的结果映射而对于复杂一点的语句只需要描述它们的关 系就行了。 你已经见过简单映射语句的示例了但并没有显式指定 resultMap。比如
select idselectUserById resultTypemap
select id , name , pwd
from user
where id #{id}
/select上述语句只是简单地将所有的列映射到 HashMap 的键上这由 resultType 属性指定。虽然在大部分情况下都够用但 是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJOPlain Old Java Objects普通老式 Java 对象作为模型。 ResultMap 最优秀的地方在于虽然你已经对它相当了解了但是根本就不需要显式地用到他们。 手动映射 1、返回值类型为resultMap select id , name , pwd from user where id #{id} 2、编写resultMap实现手动映射
resultMap idUserMap typeUser
!-- id为主键 --
id columnid propertyid/
!-- column是数据库表的列名 , property是对应实体类的属性名 --
result columnname propertyname/
result columnpwd propertypassword/
/resultMap之后会使用到一些高级的结果集映射associationcollection这些
日志工厂
思考我们在测试SQL的时候要是能够在控制台输出 SQL 的话是不是就能够有更快的排错效率 如果一个 数据库相关的操作出现了问题我们可以根据输出的SQL语句快速排查问题。 对于以往的开发过程我们会经常使用到debug模式来调节跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口配置文件的源代码执行过程。因此我们必须选择日志工具来作为我们开发调节程序的工具。 Mybatis内置的日志工厂提供日志功能具体的日志实现有以下几种工具
SLF4JApache Commons LoggingLog4j 2Log4jJDK logging 具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的按上文列举的顺序查找。如果一个都未找到日志功能就会被禁用。
标准日志实现
指定 MyBatis 应该使用哪个日志记录实现。如果此设置不存在则会自动发现日志记录实现。
settings
setting namelogImpl valueSTDOUT_LOGGING/
/settings注意名字一定不要写错注意不要加无关的空格 测试可以看到控制台有大量的输出我们可以通过这些输出来判断程序到底哪里出了Bug
使用Log4j
1、导入log4j的包
dependency
groupIdlog4j/groupId
artifactIdlog4j/artifactId
version1.2.17/version
/dependency2、配置文件编写 #将等级为DEBUG的日志信息输出到console和file这两个目的地console和file的定义在下面的代码
log4j.rootLoggerDEBUG,console,file
#控制台输出的相关设置
log4j.appender.console org.apache.log4j.ConsoleAppender
log4j.appender.console.Target System.out
log4j.appender.console.ThresholdDEBUG
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/kuang.log
log4j.appender.file.MaxFileSize10mb
log4j.appender.file.ThresholdDEBUG
log4j.appender.file.layoutorg.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatisDEBUG
log4j.logger.java.sqlDEBUG
log4j.logger.java.sql.StatementDEBUG
log4j.logger.java.sql.ResultSetDEBUG
log4j.logger.java.sql.PreparedStatementDEBUG3、setting设置日志实现
settings
setting namelogImpl valueLOG4J/
/settings4、在程序中使用Log4j进行输出 //注意导包org.apache.log4j.Logger static Logger logger Logger.getLogger(MyTest.class);
Test
public void selectUser() {
logger.info(info进入selectUser方法);
logger.debug(debug进入selectUser方法);
logger.error(error: 进入selectUser方法);
SqlSession session MybatisUtils.getSession();
UserMapper mapper session.getMapper(UserMapper.class);
ListUser users mapper.selectUser();
for (User user: users){
System.out.println(user);
}
session.close();
}5、测试看控制台输出
limit实现分页
原因查询大量数据的时候我们往往使用分页进行查询也就是每次处理小部分数据这样对数据库压力就在可控范围内。 使用Limit实现分页
#语法
SELECT * FROM table LIMIT stratIndexpageSize
SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
#为了检索从某一个偏移量到记录集的结束所有的记录行可以指定第二个参数为 -1
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
#如果只给定一个参数它表示返回最大的记录行数目
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
#换句话说LIMIT n 等价于 LIMIT 0,n。步骤
1、修改Mapper文件
select idselectUser parameterTypemap resultTypeuser
select * from user limit #{startIndex},#{pageSize}
/select2、Mapper接口参数为map //选择全部用户实现分页 List selectUser(MapString,Integer map); 3、在测试类中传入参数测试 起始位置 当前页面 - 1 * 页面大小
//分页查询 , 两个参数startIndex , pageSize
Test
public void testSelectUser() {
SqlSession session MybatisUtils.getSession();
UserMapper mapper session.getMapper(UserMapper.class);
int currentPage 1; //第几页
int pageSize 2; //每页显示几个
MapString,Integer map new HashMapString,Integer();
map.put(startIndex,(currentPage-1)*pageSize);
map.put(pageSize,pageSize);
ListUser users mapper.selectUser(map);
for (User user: users){
System.out.println(user);
}
session.close();
}RowBounds分页
我们除了使用Limit在SQL层面实现分页也可以使用RowBounds在Java代码层面实现分页当然此种方式作为了解即 可。 步骤 1、mapper接口 //选择全部用户RowBounds实现分页 List getUserByRowBounds(); 2、mapper文件
select idgetUserByRowBounds resultTypeuser
select * from user
/select3、测试类 在这里我们需要使用RowBounds类
Test
public void testUserByRowBounds() {
SqlSession session MybatisUtils.getSession();
int currentPage 2; //第几页
int pageSize 2; //每页显示几个
RowBounds rowBounds new RowBounds((currentPage-1)*pageSize,pageSize);
//通过session.**方法进行传递rowBounds[此种方式现在已经不推荐使用了]
ListUser users session.selectList(com.kuang.mapper.UserMapper.getUserByRowBounds, null, rowBounds);
for (User user: users){
System.out.println(user);
}
session.close();
}PageHelper