失败,是正因你在距成功一步之遥的时候停住了脚步。
IDE:idea 2022.2.1
JDK:1.8
构建工具:maven 3.8.4
MySQL版本:MySQL 8.0
MyBatis版本:MyBatis 3.5.10
MySQL注意
驱动类driver-class-name
MySQL 5版本使用jdbc5驱动,驱动类使用:com.mysql.jdbc.Driver
MySQL 8版本使用jdbc8驱动,驱动类使用:com.mysql.cj.jdbc.Driver
连接地址url
MySQL 5版本的url:
jdbc:mysql://localhost:3306/mybatis
MySQL 8版本的url:
jdbc:mysql://localhost:3306/mybatis?userUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8
否则运行测试用例报告如下错误:
java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or
represents more
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `mybatis` CHARACTER SET 'utf8';
-- 使用数据库
USE mybatis;
CREATE TABLE IF NOT EXISTS `t_user`(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) DEFAULT '无',
`password` VARCHAR(20) DEFAULT '无',
age INT DEFAULT 0,
gender CHAR(1) DEFAULT '男',
email VARCHAR(50) DEFAULT '无'
);
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.10version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.29version>
dependency>
dependencies>
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String gender;
private String email;
// 有参
// 无参
// set和get
// toString
}
习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。
将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下
第一行:声明
第二行:约束
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?userUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
mappers>
configuration>
MyBatis中的mapper接口相当于以前的dao。
但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
public interface UserMapper {
// 添加用户信息
int insertUser();
}
ORM(Object Relationship Mapping)对象关系映射
Java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
MyBatis映射文件用于编写SQL,访问以及操作表中的数据
MyBatis映射文件存放的位置是src/main/resources/mappers目录下
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="pers.tianyu.mapper.UserMapper">
<insert id="insertUser">
insert into t_user
values (null, 'admin', '123123', 23, '男', '123@qq.com')
insert>
mapper>
@Test
public void testMyBatis() throws IOException{
// 读取MyBatis的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
// SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 提供UserMapper.xml的namespace以及的唯一标识找到sql并执行,唯一标识是namespace.sqlId
// mybatis底层执行调用就是这个方法
// int result = sqlSession.insert("pers.tianyu.mapper.UserMapper.insertUser");
// 通过代理模式创建UserMapper接口的实现类对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配
// 映射文件中的SQL标签,并执行标签中的SQL语句
int result = userMapper.insertUser();
// sqlSession.commit(); // 没有设置自动提交就需要手动提交
System.out.println("结果:"+result);
// 关闭sqlSession
sqlSession.close();
}
log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
layout>
appender>
<logger name="java.sql">
<level value="debug" />
logger>
<logger name="org.apache.ibatis">
<level value="info" />
logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
root>
log4j:configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
settings>
日志的级别
FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试)
从左到右打印的内容越来越详细
测试
核心配置文件中注册mappers
mybatis-config.xml
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
mappers>
mapper.xml中namespace指定路径错误
<mapper namespace="pers.tianyu.mapper.UserMapper">
mapper>
mapper.xml中id指定路径错误
<insert id="insertUser">
insert into t_user
values (null, 'admin', '123123', 23, '男', '123@qq.com')
insert>
XML资源都放在src/main/resources目录下,不会遇到这个问题,如果放在src/mian/目录中会出现这个问题。
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>truefiltering>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>truefiltering>
resource>
resources>
build>