持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
1. 什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
上面这段话是来自于MyBatis官网的对MyBatis的介绍,大家轻微的看看就行,然后后续慢慢理解这段话。
2. 安装MyBatis
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version> 这了是你想使用的版本
</dependency>
如果是其他方式,那就去下载jar包,然后导包就可以了
3. 首次尝试
3.1 数据库准备
在MySql上创建一个数据库,同时创建一个表,自己写自己能想到的,顺便联系一下sql语句,下面是我的表结构
3.2 创建一个Maven项目
这个我有一篇博客写了,大家也可以根据自己的idea版本上网查找相应的创建方式
3.3 导入依赖
这一步所在的目录:
必须导入的两个依赖:数据库驱动依赖、MyBatis依赖
<!--MySql驱动,或者你使用的数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--MyBatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
可选择的依赖:lombok 和 junit(junit最好也选择) 下面是我的依赖配置,可以直接复制
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
3.4 编写核心配置文件
这一步所在的目录
在src/main/resources目录下创建一个mybatis-config.xml文件,里面编写(是从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>
<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>
<!--这个mappers可以暂时不管-->
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
核心配置文件标签解读
<configuration> :配置,这里面全是配置内容
<environments>:环境,复数,里面可以有一个及一个以上的环境配置 ,default 是默认使用哪个环境
<environment> :环境的具体内容id是环境的标识(我是这样理解的)
<transactionManager>:事务管理,上面使用的是jdbc的事务管理
<dataSource>:数据源,这个和数据库连接是一个意思,后面的跟的四个参数也是一样的
根据上述模板来编写我的核心配置文件
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/shea_school?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
3.5编写MyBatis工具类
这一步所在的目录
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。 上面这段话是官网的入门《从 XML 中构建 SqlSessionFactory》的第一段话,来仔细缕一缕这句话: 1.要使用MyBatis需要一个SqlSessionFactory实例 2.这个实例可以通过SqlSessionFactoryBuilder获得 3.SqlSessionFactoryBuilder可以从XML配置文件中构建一个SqlSessionFactory
那我们反过来一下:首先我们写好了一个XML文件,这是没有问题的。然后SqlSessionFactoryBuilder可以通过我们编写的XML配置文件,来构建SqlSessionFactory 那我们使用编程语句来翻译这句话就是
//这是我们预先编写好的XML配置文件,并把它转换成输入流
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//这里是SqlSessionFactoryBuilder使用XML来构建(build)sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
去掉注解就是官网给我们的三句话,这三句话是固定的,我们可以将这个写成一个工具类 工具类的编写代码
package com.shea.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 {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
注意: 不要抄这段代码!自己去写,问问自己为什么这样写?如果不知道那你就要补习一下java基础咯,static的特性还记得吗?
3.6 编写POJO实体类
本步骤所在目录
实体类,这个也是java的一个基础概念,打个比方,这个实体类是一个学生,那这个类里面要包含学生的属性,里面提供getter和setter方法。这里我们编写实体类,类中的属性就要和上述创建的数据表属性一一对应,编写的代码如下
package com.shea.pojo;
import lombok.*;
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int score;
private int age;
private int gender;
}
如果你没有安装Lombok那,去掉注解,加上getter、setter、构造、tostring这些方法,belike.(这里其实有点废话了)
package com.shea.pojo;
public class Student {
private int id;
private String name;
private int score;
private int age;
private int gender;
public Student(){}
public Student(int id, String name, int score, int age, int gender) {
this.id = id;
this.name = name;
this.score = score;
this.age = age;
this.gender = gender;
}
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 int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", score=" + score +
", age=" + age +
", gender=" + gender +
'}';
}
}
3.7 编写Mapper接口
所在的操作目录
初次尝试,我们就将学生的全部信息打印出来就可以了,编写如下
package com.shea.mapper;
import com.shea.pojo.Student;
import java.util.List;
public interface StudentMapper {
List<Student> getStudent();
}
3.8 SQL语句映射
这里暂时只写使用mapper.xml
我们在官网中可以看到一个mapper.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">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
先解释一下标签内容
mapper就是映射咯,变量namespace就是你要相应绑定的接口,或者类,这里我们绑定我们的Mapper接口,这个是很重要的!
select这个标签就是选择标签,这个标签可以选择的有insert delete等,可以自己去编译器里查看id对应我们前面写的方法名,resultType就是返回类型,sql语句执行的返回值。这里我们返回Student,但是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">
<mapper namespace="com.shea.mapper.StudentMapper">
<select id="getStudent" resultType="com.shea.pojo.Student">
select * from student
</select>
</mapper>
写完以后记得在核心配置文件mybatis-config.xml中添加
src是和路径相关的,不同的地方路径不一样,放相对路径
我的目录结构:
<mappers>
<mapper resource="student-mapper.xml"/>
</mappers>
进行注册,不然会报错:org.apache.ibatis.binding.BindingException: Type interface com.shea.mapper.StudentMapper is not known to the MapperRegistry.
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/shea_school?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="student-mapper.xml"/>
</mappers>
</configuration>
3.9 测试
在这里编写测试文件
package com.shea.mapper;
import com.shea.pojo.Student;
import com.shea.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class StudentMapperTest {
@Test
public void test(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudent();
for (Student student : students) {
System.out.println(student);
}
sqlSession.close();
}
}
然后点击运行就通过了
3.10 可能出现的其他错误
初始化异常错误 在pom.xml中加入
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
还有可能出现其他错误,大家这个时候就要先解决自己理解的异常,再使用搜索引擎搜索。
完成以后,初次体验也结束了,可能你会觉得很麻烦,但也就开头难一点,后面写代码就会非常轻松咯!