MyBatis教程看这一篇就够啦,又全面IDEA版
目录
一、MyBatis简介
1.1 MyBatis介绍
MyBatis是一个
半自动
的ORM
框架ORM(Object Relational Mapping)对象关系映射,将Java中的一个对象与数据表中一行记录一个一个地对应。
ORM框架提供了实体类与数据表的映射关系,通过映射文件的配置,实现对象的持久化。
Github:GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java
-
MyBatis的前身是iBatis,iBatis是Apache软件基金会提供的一个开源项目
-
2010年iBatis迁移到Google code,正式更名为MyBatis
-
2013年迁移到Github托管
-
MyBatis特点:
-
支持自定义SQL、存储过程
-
对原有的JDBC进行了封装,几乎消除了所有JDBC代码,让开发者只需关注SQL本身
-
支持XML和注解配置方式自定完成ORM操作,实现结果映射
-
持久化-->数据持久化
-
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
-
内存:断电即失
-
数据库(Jdbc),io文件持久化
-
生活方面例子:冷藏,罐头。
为什么需要持久化?
-
不想丢掉一些对象
-
内存太贵
持久层
Dao层,Service层,Controller层…
-
完成持久化工作的代码块
-
层界限十分明显
为什么需要Mybatis?
-
帮助程序猿将数据存入到数据库中
-
方便
-
传统的JDBC代码太复杂,简化–>框架–>自动化
最重要的一点:使用的人多! Spring-SpringMVC-SpringBoot
二、MyBatis框架部署
框架部署,就是将框架引入到我们的项目中
思路:搭建环境–>导入Mybatis–>编写代码–>测试
2.1 创建Maven项目
-
Java工程
-
Web工程
2.2 在项目中添加MyBatis依赖
-
在pom.xml中添加依赖
-
mybatis
-
mysql driver
-
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>5.1.47</version>
-
</dependency>
-
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
-
<dependency>
-
<groupId>org.mybatis</groupId>
-
<artifactId>mybatis</artifactId>
-
<version>3.4.6</version>
-
</dependency>
-
2.3 创建MyBatis配置文件
-
创建自定义模板:选择resources----右键New----Edit File Templates
-
在resources中创建名为
mybatis-config.xml
的文件 -
在
mybatis-config.xml
文件配置数据库连接信息-
-
-
"http://mybatis.org/dtd/mybatis-3-config.dtd">
-
<configuration>
-
<!-- 在environments配置数据库连接信息 -->
-
<!-- 在environments标签中可以定义多个environment标签,每个environment标签可以定义一套连接配置 -->
-
<!-- default属性,用来指定使用哪个environment标签 -->
-
<environments default="mysql">
-
<environment id="mysql">
-
<!--transactionManager标签用于配置数据库管理方式-->
-
<transactionManager type="JDBC"></transactionManager>
-
<!--dataSource标签就是用来配置数据库连接信息 -->
-
<dataSource type="POOLED">
-
<property name="driver" value="com.mysql.jdbc.Driver"/>
-
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8"/>
-
<property name="username" value="root"/>
-
<property name="password" value="admin123"/>
-
</dataSource>
-
</environment>
-
</environments>
-
</configuration>
-
三、MyBatis框架使用
案例:学生信息的数据库操作
3.1 创建数据表
tb_students |
---|
3.2 创建实体类
Student.java (导入lombok依赖) |
---|
3.3 创建DAO接口,定义操作方法
StudentDAO.java |
---|
3.4 创建DAO接口的映射文件
-
在
resources
目录下,新建名为mappers
文件夹 -
在
mappers
中新建名为StudentMapper.xml
的映射文件(根据模板创建) -
在映射文件中对DAO中定义的方法进行实现:
-
-
-
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
<!--mapper文件相当于DAO接口的‘实现类’,namespace属性要指定`实现`DAO接口的全限定名-->
-
<mapper namespace="com.qfedu.dao.StudentDAO">
-
<insert id="insertStudent">
-
insert into tb_students(stu_num,stu_name,stu_gender,stu_age)
-
values(#{stuNum},#{stuName},#{stuGender},#{stuAge})
-
</insert>
-
<delete id="deleteStudent">
-
delete from tb_students where stu_num=#{stuNum}
-
</delete>
-
</mapper>
3.5 将映射文件添加到主配置文件
mybatis-config.xml |
---|
四、单元测试
4.1 添加单元测依赖
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.12</version>
-
</dependency>
4.2 创建单元测试类
在被测试类名后alt insert --- 选择Test |
---|
4.3 测试代码
-
package com.qfedu.dao;
-
import com.qfedu.pojo.Student;
-
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;
-
import static org.junit.Assert.*;
-
public class StudentDAOTest {
-
-
public void insertStudent() {
-
try {
-
//加载mybatis配置文件
-
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
-
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
-
//会话工厂
-
SqlSessionFactory factory = builder.build(is);
-
//会话(连接)
-
SqlSession sqlSession = factory.openSession();
-
//通过会话获取DAO对象
-
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
-
//测试StudentDAO中的方法
-
int i = studentDAO.insertStudent(new Student(0, "10001", "张三", "男", 21));
-
//需要手动提交
-
sqlSession.commit();
-
System.out.println(i);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
-
public void deleteStudent() {
-
}
-
}
可能遇到的问题:
-
配置文件没有注册;
-
绑定接口错误;
-
方法名不对;
-
返回类型不对;
-
Maven导出资源问题。
-
<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>
-
说明:标准的Maven项目都会有一个resources目录来存放我们所有的资源配置文件,但是我们往往在项目中不仅仅会把所有的资源配置文件都放在resources中,同时我们也有可能放在项目中的其他位置,那么默认的maven项目构建编译时就不会把我们其他目录下的资源配置文件导出到target目录中,就会导致我们的资源配置文件读取失败,从而导致我们的项目报错出现异常,比如说尤其我们在使用MyBatis框架时,往往Mapper.xml配置文件都会放在dao包中和dao接口类放在一起的,那么执行程序的时候,其中的xml配置文件就一定会读取失败,不会生成到maven的target目录中,所以我们要在项目的pom.xml文件中进行设置,并且我建议大家,每新建一个maven项目,就把该设置导入pom.xml文件中,以防不测!!!
五、MyBatis的CRUD操作
案例:学生信息的增删查改
5.1 添加操作
略
5.2 删除操作
根据学号删除一条学生信息
-
在StudentDAO中定义删除方法
StudentDAO |
---|
-
在StudentMapper.xml中对接口方法进行“实现”
StudentMapper.xml |
---|
-
测试:在StudentDAO的测试类中添加测试方法
StudentDAOTest |
---|
5.3 修改操作
根据学生学号,修改其他字段信息
-
在StudentDAO接口中定义修改方法
StudentDAO |
---|
-
在StudentMapper.xml中“实现”接口中定义的修改方法
StudentMapper.xml |
---|
-
单元测试
StudentDAOTest |
---|
5.4 查询操作-查询所有
-
在StudentDAO接口定义操作方法
StudentDAO |
---|
-
在StudentMapper.xml中“实现”DAO中定义的方法
StudentMapper.xml |
---|
-
单元测试
StudentDAOTest |
---|
5.5 查询操作-查询一条记录
根据学号查询一个学生信息
-
在StudentDAO接口中定义方法
StudentDAO |
---|
-
在StudentDAOMapper.xml中配置StudentDAO接口的方法实现——SQL
StudentDAOMapper.xml |
---|
-
单元测试
StudentDAOTest |
---|
5.6 查询操作-多参数查询
分页查询(参数 start , pageSize)
-
在StudentDAO中定义操作方法,如果方法有多个参数,使用
@Param
注解声明参数的别名
StudentDAO |
---|
-
在StudentMapper.xml配置sql时,使用
#{别名}
获取到指定的参数
StudentMapper.xml |
---|
注意
如果DAO操作方法没有通过@Param指定参数别名,在SQL中也可以通过arg0,arg1...
或者param1,param2,...
获取参数
5.7 查询操作-查询总记录数
-
在StudentDAO接口中定义操作方法
StudentDAO |
---|
-
在StudentMapper.xml配置sql,通过resultType指定当前操作的返回类型为int
5.8 添加操作回填生成的主键
-
StduentMapper.xml的添加操作标签——
insert
-
<!-- useGeneratedKeys 设置添加操作是否需要回填生成的主键 -->
-
<!-- keyProperty 设置回填的主键值赋值到参数对象的哪个属性 -->
-
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="stuId">
-
insert into tb_students(stu_num, stu_name, stu_gender, stu_age)
-
values (#{stuNum}, #{stuName}, #{stuGender}, #{stuAge})
-
</insert>
六、MyBatis工具类封装
-
MyBatisUtil
-
public class MyBatisUtil {
-
private static SqlSessionFactory factory;
-
private static final ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
-
static{
-
try {
-
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
-
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
-
factory = builder.build(is);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
public static SqlSessionFactory getFactory(){
-
return factory;
-
}
-
public static SqlSession getSqlSession(){
-
SqlSession sqlSession = local.get();
-
if(sqlSession == null ){
-
sqlSession = factory.openSession();
-
local.set(sqlSession);
-
}
-
return sqlSession;
-
}
-
public static <T extends Object> T getMapper(Class<T> c){
-
SqlSession sqlSession = getSqlSession();
-
return sqlSession.getMapper(c);
-
}
-
}
-
七、事务管理
SqlSession 对象
getMapper(DAO.class) : 获取Mapper(DAO接口的实例)
事务管理
7.1 手动提交事务
-
sqlSession.commit();
提交事务 -
sqlSession.rollback();
事务回滚
测试类中进行事务管理
-
-
public void insertStudent() {
-
SqlSession sqlSession = MyBatisUtil.getSqlSession();
-
//1.当我们获取sqlSession对象时,就默认开启了事务
-
try{
-
//通过会话获取DAO对象
-
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
-
//测试StudentDAO中的方法
-
Student student = new Student(0, "10005", "Lily", "女", 21);
-
int i = studentDAO.insertStudent(student);
-
//2.操作完成并成功之后,需要手动提交
-
sqlSession.commit();
-
}catch (Exception e){
-
//3.当操作出现异常,调用rollback进行回滚
-
sqlSession.rollback();
-
}
-
}
业务逻辑层手动事务管理
-
public class StudentServiceImpl implements StudentService {
-
public boolean addStudent(Student student) {
-
boolean b = false;
-
SqlSession sqlSession = MyBatisUtil.getSqlSession();
-
try{
-
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
-
int i = studentDAO.insertStudent(student);
-
b = i>0;
-
sqlSession.commit();
-
}catch (Exception e){
-
sqlSession.rollback();
-
}
-
return b;
-
}
-
}
7.2 自动提交事务
通过SqlSessionFactory调用openSession方法获取SqlSession对象时,可以通过参数设置事务是否自动提交:
如果参数设置为true,表示自定提交事务: factory.openSession(true);
如果参数设置为false,或者不设置参数,表示手动提交:factory.openSession();/factory.openSession(false);
MyBatisUtil优化
-
public class MyBatisUtil {
-
private static SqlSessionFactory factory;
-
private static final ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
-
static{
-
try {
-
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
-
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
-
factory = builder.build(is);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
public static SqlSessionFactory getFactory(){
-
return factory;
-
}
-
private static SqlSession getSqlSession(boolean isAutoCommit){
-
SqlSession sqlSession = local.get();
-
if(sqlSession == null ){
-
sqlSession = factory.openSession(isAutoCommit);
-
local.set(sqlSession);
-
}
-
return sqlSession;
-
}
-
//手动事务管理
-
public static SqlSession getSqlSession(){
-
return getSqlSession(false);
-
}
-
//自动事务提交
-
public static <T extends Object>T getMapper(Class<T> c){
-
SqlSession sqlSession = getSqlSession(true);
-
return sqlSession.getMapper(c);
-
}
-
}
测试操作
-
-
public void testDeleteStudent() {
-
StudentDAO studentDAO = MyBatisUtil.getMapper(StudentDAO.class);
-
int i = studentDAO.deleteStudent("10001");
-
}
业务逻辑层自动事务管理
-
public class StudentServiceImpl implements StudentService {
-
private StudentDAO studentDAO = MyBatisUtil.getMapper(StudentDAO.class);
-
public boolean addStudent(Student student) {
-
int i = studentDAO.insertStudent(student);
-
boolean b = i>0;
-
return b;
-
}
-
}
八、MyBatis主配置文件
mybatis-config.xml 是MyBatis框架的主配置文件,只要用于配置MyBatis数据源及属性信息
8.1 properties标签
用于设置键值对,或者加载属性文件
-
在resources目录下创建
jdbc.properties
文件,配置键值对如下:-
mysql_driver=com.mysql.jdbc.Driver
-
mysql_url=jdbc:mysql://localhost:3306/db_2010_fmwy?characterEncoding=utf-8
-
mysql_username=root
-
mysql_password=admin123
-
-
在mybatis-config.xml中通过
properties
标签引用jdbc.properties
文件;引入之后,在配置environment时可以直接使用jdbc.properties的key获取对应的value
mybatis-config.xml |
---|
8.2 settings标签
-
<!--设置mybatis的属性-->
-
<settings>
-
<!-- 启动二级缓存-->
-
<setting name="cacheEnabled" value="true"/>
-
<!-- 启动延迟加载 -->
-
<setting name="lazyLoadingEnabled" value="true"/>
-
</settings>
8.3 typeAliases标签
-
<!--typeAliases标签用于给实体类取别名,在映射文件中可以直接使用别名来替代实体类的全限定名-->
-
<typeAliases>
-
<typeAlias type="com.qfedu.pojo.Student" alias="Student"></typeAlias>
-
<typeAlias type="com.qfedu.pojo.Book" alias="Book"></typeAlias>
-
</typeAliases>
8.4 plugins标签
-
<!--plugins标签,用于配置MyBatis插件(分页插件)-->
-
<plugins>
-
<plugin interceptor=""></plugin>
-
</plugins>
8.5 environments标签
-
<!-- 在environments配置数据库连接信息 -->
-
<!-- 在environments标签中可以定义多个environment标签,每个environment标签可以定义一套连接配置 -->
-
<!-- default属性,用来指定使用哪个environment标签 -->
-
<environments default="mysql">
-
<!-- environment 标签用于配置数据库连接信息 -->
-
<environment id="mysql">
-
<!--transactionManager标签用于配置数据库管理方式
-
type="JDBC" 可以进行事务的提交和回滚操作
-
type="MANAGED" 依赖容器完成事务管理,本身不进行事务的提交和回滚操作 -->
-
<transactionManager type="JDBC"></transactionManager>
-
<!--dataSource标签就是用来配置数据库连接信息 POOLED|UNPOOLED -->
-
<dataSource type="POOLED">
-
<property name="driver" value="${mysql_driver}"/>
-
<property name="url" value="${mysql_url}"/>
-
<property name="username" value="${mysql_username}"/>
-
<property name="password" value="${mysql_password}"/>
-
</dataSource>
-
</environment>
-
</environments>
8.6 mappers标签
加载映射配置(映射文件、DAO注解)
-
<!--mappers标签用于载入映射文件-->
-
<mappers>
-
<mapper resource="mappers/StudentMapper.xml"></mapper>
-
</mappers>
九、映射文件
9.1 MyBatis Mapper初始化
XML文件解析:读取xml文件中的标签配置封装到Java对象中
9.2 mapper根标签
mapper文件相当于DAO接口的‘实现类’,namespace属性要指定
实现
DAO接口的全限定名
9.3 insert标签
声明添加操作(sql: insert ...)
常用属性
id属性,绑定对应DAO接口中的方法
parameterType属性,用以指定接口中对应方法的参数类型(可省略)
useGeneratedKeys属性, 设置添加操作是否需要回填生成的主键
keyProperty属性,指定回填的id设置到参数对象中的哪个属性
timeout属性,设置此操作的超时时间,如果不设置则一直等待
主键回填
-
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="stuId">
-
insert into tb_students(stu_num, stu_name, stu_gender, stu_age)
-
values (#{stuNum}, #{stuName}, #{stuGender}, #{stuAge})
-
</insert>
-
<insert id="insertStudent" >
-
<selectKey keyProperty="stuId" resultType="java.lang.Integer">
-
select last_insert_id()
-
</selectKey>
-
insert into tb_students(stu_num, stu_name, stu_gender, stu_age)
-
values (#{stuNum}, #{stuName}, #{stuGender}, #{stuAge})
-
</insert>
9.4 delete标签
声明删除操作
9.5 update标签
声明修改操作
9.6 select标签
声明查询操作
id属性, 指定绑定方法的方法名
parameterType属性,设置参数类型
resultType属性,指定当前sql返回数据封装的对象类型(实体类)
resultMap属性,指定从数据表到实体类的字段和属性的对应关系
useCache属性,指定此查询操作是否需要缓存
timeout属性,设置超时时间
9.7 resultMap标签
-
<!-- resultMap标签用于定义实体类与数据表的映射关系(ORM) -->
-
<resultMap id="studentMap" type="Student">
-
<id column="sid" property="stuId"/>
-
<result column="stu_num" property="stuNum"/>
-
<result column="stu_name" property="stuName"/>
-
<result column="stu_gender" property="stuGender"/>
-
<result column="stu_age" property="stuAge"/>
-
</resultMap>
9.8 cache标签
设置当前DAO进行数据库操作时的缓存属性设置
<cache type="" size="" readOnly="false"/>
9.9 sql和include
SQL片段
-
<sql id="wanglaoji">sid , stu_num , stu_name , stu_gender , stu_age</sql>
-
-
<select id="listStudents" resultMap="studentMap">
-
select <include refid="wanglaoji"/> from tb_students
-
</select>
十、分页插件
分页插件是一个独立于MyBatis框架之外的第三方插件;
10.1 添加分页插件的依赖
PageHelper
-
<!-- pagehelper分页插件 -->
-
<dependency>
-
<groupId>com.github.pagehelper</groupId>
-
<artifactId>pagehelper</artifactId>
-
<version>5.1.10</version>
-
</dependency>
10.2 配置插件
在mybatis的主配置文件
mybatis-config.xml
中通过plugins
标签进行配置
-
<!--plugins标签,用于配置MyBatis插件(分页插件)-->
-
<plugins>
-
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
-
</plugins>
10.3 分页实例
对学生信息进行分页查询
-
@Test
-
public void testListStudentsByPage() {
-
StudentDAO studentDAO = MyBatisUtil.getMapper(StudentDAO.class); //sqlSession
-
PageHelper.startPage(2,4);
-
List<Student> students = studentDAO.listStudents();
-
PageInfo<Student> pageInfo = new PageInfo<Student>(students);
-
//pageInfo中就包含了数据及分页信息
-
}
带条件分页
-
-
public void testListStudentsByPage() {
-
StudentDAO studentDAO = MyBatisUtil.getMapper(StudentDAO.class); //sqlSession
-
PageHelper.startPage(2,4);
-
//List<Student> students = studentDAO.listStudents();
-
List<Student> list = studentDAO.listStudentsByGender("女");
-
PageInfo<Student> pageInfo = new PageInfo<Student>(list);
-
//pageInfo中就包含了数据及分页信息
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbgkhe
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01