Mybatis2_入门案例
Mybatis
什么是mybatis
Myba是一款优秀的持久层框架
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,减少了代码的冗余,减少程序员的操作。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
MyBatis原来是apache的一个开源项目,叫做ibatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis
2013年11月官方代码迁移到GitHub
MyBatis中文文档:https://mybatis.net.cn/
GitHub:https://github.com/mybatis/mybatis-3
持久化
把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
JDBC就是一种持久化机制。文件IO也是一种持久化机制。
为什么需要持久化服务?
内存断点后数据会丢失,但是有些业务不允许这种情况的存在
比起硬盘,内存过于昂贵,如果有够量的内存,则不需要持久化服务,但是正是因为内存太贵,储存有限,因此需要持久化来缓存
Mybatis的作用
Mybatis就是帮助程序员将数据存取到数据库里面。
传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等… , 通过框架可以减少重复代码,提高开发效率 .
MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射,所有的事情,不用Mybatis依旧可以做到,只是用了它,会更加方便更加简单,开发更快速。
MyBatis的优点
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供xml标签,支持编写动态sql。
- 现在主流使用方法
入门例子
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zy</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
建立数据库表
use mybatis;
create TABLE student(
id int PRIMARY KEY auto_increment not NULL,
name VARCHAR(20) NOT NULL,
age int NOT NULL,
address VARCHAR(20) NOT NULL,
phone VARCHAR(20) NOT NULL
) CHARSET=utf8;
INSERT INTO student values(1,'xiaoming', '20', '北京市昌平区', '12345678901');
INSERT INTO student values(2,'xiaohong', '18', '河南省洛阳市', '12245678901');
INSERT INTO student values(3,'xiaoqiang', '20', '陕西西安', '12335678901');
建立实体类
package com.zy.mybatis.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private int age;
private String address;
private String phone;
}
resources下创建mybatis-config.xml文件
位置resource->mybatis->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="mybatis/jdbc.properties" />
<!--mabatis日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<typeAliases>
<typeAlias type="com.zy.mybatis.entity.Student" alias="Student" />
</typeAliases>
<!--数据库的连接信息-->
<environments default="development">
<!--environment:一个数据库信息的配置,id:唯一标识符,可以自定义-->
<environment id="development">
<!--transactionManager:mybatis的事务类型
type:JDBC表示使用jdbc中Connection对象的commit、rollback做事务处理-->
<transactionManager type="JDBC"/>
<!--配置连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--一个mapper标签指定一个文件位置-->
<mappers>
<mapper resource="mybatis/mapper/StudentMapper.xml" />
</mappers>
</configuration>
jdbc.properties
位置resource->mybatis->jdbc.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username=root
password=Root@123
日志配置log4j2.xml
增加依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
位置resource->mybatis->log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
</Console>
<RollingFile name="RollingFile" filename="log/test.log"
filepattern="${logPath}/%d{YYYYMMddHHmmss}-fargo.log">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
<Policies>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
在配置文件中增加配置:
<!--mabatis日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
编写映射文件StudentMapper.xml
位置在目录resource->mybatis->mapper->StudentMapper.xml
<?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">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="StudentMapper">
<!--select查询语句-->
<select id="getStudentList" resultType="Student">
select * from student
</select>
</mapper>
需要在mybatis-config.xml指定映射配置文件的位置
<!--指定映射配置文件的位置-->
<mappers>
<mapper resource="mybatis/StudentMapper.xml"/>
</mappers>
编写MyBatis工具类, 获取SqlSession
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
有了 SqlSessionFactory,我们可以从中获得 SqlSession 的实例。
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
package com.zy.mybatis.util;
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 {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis/mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
测试用例测试
package com.zy.mybatis;
import com.zy.mybatis.entity.Student;
import com.zy.mybatis.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class StudentTest {
SqlSession sqlSession;
@Test
public void getStudentListTest() {
try {
sqlSession = MybatisUtils.getSqlSession();
final List<Student> students = sqlSession.selectList("StudentMapper.getStudentList");
students.stream().forEach(stu -> {
System.out.println(stu);
});
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
Student(id=1, name=xiaoming, age=20, address=北京市昌平区, phone=12345678901)
Student(id=2, name=xiaohong, age=18, address=河南省洛阳市, phone=12245678901)
Student(id=3, name=xiaoqiang, age=20, address=陕西西安, phone=12335678901)