如果实体类定义的变量与数据库中表的字段不一致
比如表字段是 pwd,实体类写的是 password
可以在 sql 语句那里写 pwd as password 就能获取到
当然,这是比较笨的做法
通常使用 ResultMap 结果集映射
UserMapper.xml:
resultMap id 与 select resultMap 一致
resultMap type 是全限定名(设了 typeAliases 别名)
column 数据库中的字段,property 实体类中的属性
字段映射成属性
select id 是接口的方法名
<!-- 结果集映射 -->
<resultMap id="UserMap" type="user">
<!-- column数据库中的字段,property实体类中的属性 -->
<!-- 字段映射成属性 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserList" resultMap="UserMap">
select * from mybatis.user
</select>
日志工厂:
logImpl,指定 MyBatis 所用日志的具体实现,未指定时将自动查找
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
mybatis-config.xml 配置日志
<settings>
<!-- 日志工厂实现 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
mysql 建表(id,name,pwd),连上 idea
pom.xml:
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- mybatis驱动 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<!-- junit驱动 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
<!-- 在build中配置resources,防止资源导出失败 -->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
在 resources 目录下创建 db.properties、mybatis-config.xml
db.properties:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration核心配置文件 -->
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="db.properties"/>
<settings>
<!-- 日志工厂实现 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 扫描实体类的包 -->
<typeAliases>
<package name="com.demo.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/demo/dao/UserMapper.xml"/>
</mappers>
</configuration>
MybatisUtils.java:(工具类)
package com.demo.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/*
有了SqlSessionFactory,就可以获得SqlSession的实例
SqlSession提供了在数据库执行SQL命令所需的所有方法
可以通过SqlSession实例来执行已映射的SQL语句
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
User.java:(实体类)
package com.demo.pojo;
//实体类
public class User {
private int id;
private String name;
private String password;
//无参构造
public User() {
}
//有参构造
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserMapper 接口:
package com.demo.dao;
import com.demo.pojo.User;
public interface UserMapper {
//根据ID查询用户
User getUserById(int id);
}
UserMapper.xml:
(因为数据库的表字段密码写的是 pwd,实体类写的是 password,所以要用 resultMap 结果集映射)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.dao.UserMapper">
<!-- 结果集映射 -->
<resultMap id="UserMap" type="user">
<!-- column数据库中的字段,property实体类中的属性 -->
<!-- 字段映射成属性 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id = #{id}
</select>
</mapper>
UserDaoTest.java:(测试类)
package com.demo.dao;
import com.demo.pojo.User;
import com.demo.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class UserDaoTest {
//根据id查询
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
}
运行查看结果,日志生成
本质上还是 JDBC 连接
Log4j:
通过使用 Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件等
也可以控制每一条日志的输出格式
通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程
这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码
pom.xml 导入 log4j 的 jar 包:
<!-- log4j驱动 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
resources 目录下创建 log4j.properties
#将等级为DEBUG的日志信息输出到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/demo.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
配置 log4j 日志:
<settings>
<!-- 配置log4j日志 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
直接测试运行即可
生成 log 目录
要使用 Log4j 的类,需要导入包
import org.apache.log4j.Logger;
package com.demo.dao;
import org.apache.log4j.Logger;
import org.junit.Test;
public class UserDaoTest {
//日志对象,参数为当前类的class
//获取当前类的反射对象
static Logger logger = Logger.getLogger(UserDaoTest.class);
@Test
public void testLog4j(){
//日志等级
Logger.info("info:进入testLog4j");
Logger.debug("debug:进入testLog4j");
Logger.error("error:进入testLog4j");
}
}