最近学习了MyBatis,记录一下学习过程。
目录
开发环境
IDE:idea 2022.3.3
构建工具:maven 3.6.3
MySQL版本:MySQL8
MyBatis版本:MyBatis 3.5.7
搭建MyBatis
先创建好maven工程
1.在pom.xml中引入依赖
<dependencies>
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.在resource目录下创建MyBatis核心配置文件
<?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>
<!-- 引入properties文件 -->
<properties resource="jdbc.properties"/>
<!-- 设置类型别名 -->
<typeAliases>
<!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
<package name="mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据源指定 -->
<dataSource type="POOLED"><!--POOLED 表示使用数据库连接池-->
<!--设置连接数据库的驱动-->
<property name="driver" value="${jdbc.driver}"/>
<!--设置连接数据库的连接地址-->
<property name="url" value="${jdbc.url}"/>
<!--设置连接数据库的用户名-->
<property name="username" value="${jdbc.username}"/>
<!--设置连接数据库的密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<package name="mybatis.mappers"/>
</mappers>
</configuration>
3.编写jdbc.properties文件
名字可以自己起,能一看就知道是什么意思就行
//驱动类 jdbc.driver=com.mysql.cj.jdbc.Driver //连接地址的url jdbc.url=jdbc:mysql://localhost:3306/自己的数据库的名字?serverTimezone=UTC jdbc.username=用户名 jdbc.password=密码
4.编写log4j.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="true">
<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"/><!--日志输出的级别
FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调式)
从左到右 级别越低,打印出的内容越详细-->
</logger>
<logger name="org.apache.ibatis">
<level value="info"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
5.编写pojo类
package mybatis.pojo;
public class User {
Integer id;
String name;
Integer age;
public User(){}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
6.编写Mapper接口
package mybatis.mappers;
import mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
int insertUser();
List<User> selectAllUsers();
}
7.编写SQLSession工具类
package mybatis.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 SqlSessionUtil {
public static SqlSession getSqlsession() {
SqlSession sqlSession=null;
InputStream resource =null;
try {
resource = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(resource);
sqlSession = factory.openSession(true);//true:自动提交事务 默认为false,不写的话要手动提交事务
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
8.创建映射文件
注意:
mapper接口的全类名和映射文件的命名空间(namespace)保持一致
mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
select标签中必须设置resultType或resultMap,用于设置实体类和数据库表的映射关系
resultType:自动映射,用于属性名和表中字段名一致的情况
resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
一个类对应一个表
一个属性对应一个字段/列
一个对象对应一个记录/行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.mappers.UserMapper">
<insert id="insertUser">
insert into `user` values(null,'coco',25)
</insert>
<select id="selectAllUsers" resultType="mybatis.pojo.User">
select * from `user`
</select>
</mapper>
9.测试
import mybatis.mappers.UserMapper;
import mybatis.pojo.User;
import mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class TestUser {
@Test
public void testUser() throws IOException {
SqlSession sqlsession = SqlSessionUtil.getSqlsession();
UserMapper mapper = sqlsession.getMapper(UserMapper.class);
System.out.println(mapper.insertUser());
List<User> list = mapper.selectAllUsers();
list.forEach(user -> System.out.println(user));
}
}
注意
核心配置文件中的标签必须按照固定顺序来写:
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
reflectorFactory
plugins
environments
databaseIdProvider
mappers
- <properties>
引入properties文件,例如
<properties resource="jdbc.properties"/>
这样在environment标签中,就可以通过${}
获取数据库的连接的信息。
- <typeAliases>
在mapper.xml中,select标签要设置resultType或者resultMap,用来设置SQL语句的输入参数类型和输出参数类型,类必须要输入类的全类名,例如mybatis.pojo.User,太长了,我们就可以通过<typeAliases>标签来设置了类型的别名
<typeAliases>
<!--
typeAlias:设置某个类型的别名
属性:
type:设置需要设置别名的类型(必须设置)
alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名
且不区分大小写
-->
<typeAlias type="com.atguigu.mybatis.pojo.User" alias="user"></typeAlias>
<!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
<package name="mybatis.pojo"/>
</typeAliases>
这样在resultType或者resultMap中就可以只写user,mybatis会根据别名自动找到对应的类。
- <mappers>
引入mapper.xml映射文件
引入单个映射文件:
<mapper resource="mappers/UserMapper.xml"/>
以包为单位引入映射文件
要求:
1、mapper接口所在的包的包名要和映射文件所在的包的包名一致
mapper接口在mybatis.mappers下,mapper.xml也要在mybatis.mappers下
2、mapper接口要和映射文件的名字一致
<package name="mybatis.mappers"/>
总结
搭建MyBatis步骤
1. 创建maven工程
2. 在pom.xml引入依赖
3. 创建MyBatis的核心配置文件
4. 编写log4j.xml文件
5. 编写pojo类、Mapper接口、SQLSession工具类
6. 编写Mapper接口对应的mapper.xml映射文件
7. 测试