目录
一、MyBatis简介
1. 什么是 MyBatis ?
2. MyBatis的特性
3. 什么是持久层框架?
二、MyBatis环境配置
2.1 创建maven工程
2.2 导入相关pom依赖
2.3 导入jdbc配置文件
2.4 Mybatis相关插件安装
3.5 Mybatis-cfg.xml 核心配置
2.6 引入Log4j2日志文件
2.7 generatorConfig.xml 配置代码生成器
三、MyBatis实现增删改查
3.1 MyBatis自动生成代码
3.2 解读生成的配置文件和方法
3.3 编写业务逻辑层实现接口
3.4 编写工厂类
3.5 编写测试类测试
MyBatis是一个开源的Java持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
简单易用:MyBatis使用简单的XML或注解配置来映射Java对象和SQL语句,使得开发人员可以轻松地编写和维护数据库访问代码。
灵活性:MyBatis允许开发人员编写自定义的SQL语句,从而可以灵活地处理复杂的数据库操作。它还支持动态SQL,可以根据不同的条件生成不同的SQL语句。
高性能:MyBatis使用了一些优化技术,如预编译SQL语句、缓存等,以提高数据库访问的性能。
易于集成:MyBatis可以与各种流行的Java框架(如Spring)无缝集成,使得开发人员可以更方便地使用MyBatis进行数据库操作。
MyBatis的主要作用是简化Java应用程序与关系型数据库之间的交互。通过使用MyBatis,开发人员可以通过简单的配置和编写SQL语句,实现对数据库的增删改查操作。同时,MyBatis还提供了一些高级特性,如分页查询、批量操作等,使得数据库访问更加灵活和高效。总之,MyBatis是一个功能强大、易于使用的持久层框架,被广泛应用于Java开发中。
持久层框架是一种软件框架,用于简化应用程序与数据库之间的交互和数据持久化操作。在软件开发中,应用程序通常需要与数据库进行交互,包括数据的读取、写入、更新和删除等操作。持久层框架的主要目的是提供一种简单、高效、可维护的方式来处理这些数据库操作。
传统的数据库操作方式通常需要开发人员手动编写SQL语句,并处理数据库连接、事务管理等细节。这种方式存在一些问题,如代码冗余、易出错、难以维护等。持久层框架的出现解决了这些问题,它提供了一种抽象层,将数据库操作封装起来,使开发人员可以通过简单的API调用来进行数据库操作,而无需关注底层的数据库细节。
持久层框架通常提供以下功能:
对象关系映射(ORM):持久层框架可以将数据库表和Java对象之间建立映射关系,使得开发人员可以通过操作Java对象来实现对数据库的操作,而无需直接编写SQL语句。
数据库连接管理:持久层框架负责管理数据库连接的创建、释放和连接池的管理,以提高数据库访问的性能和效率。
事务管理:持久层框架可以提供事务管理的功能,确保数据库操作的一致性和完整性。
缓存管理:持久层框架可以提供缓存机制,将经常访问的数据缓存在内存中,以提高数据的读取性能。
持久层框架的使用可以简化数据库操作的代码量,提高开发效率,降低开发难度,并且可以提供一些高级特性,如懒加载、分页查询、批量操作等,使得数据库操作更加灵活和高效。常见的持久层框架有Hibernate、MyBatis等。
我使用的是idea2023版,其他版本创建Maven方式会有所不同,仅供参考:
4.0.0
org.example
mybatis_01
war
1.0-SNAPSHOT
mybatis_01 Maven Webapp
http://maven.apache.org
1.8
1.8
junit
junit
4.12
test
javax.servlet
javax.servlet-api
4.0.0
provided
org.mybatis
mybatis
3.4.5
mysql
mysql-connector-java
5.1.44
org.apache.logging.log4j
log4j-core
2.9.1
org.apache.logging.log4j
log4j-api
2.9.1
org.apache.logging.log4j
log4j-web
2.9.1
mybatis_01
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
1.8
UTF-8
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
5.1.44
true
我用的mysql8.0版本,需根据自身配置需求更改配置文件内容。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=mybatis_ssm
jdbc.password=ycxw320
Mybatis plugin插件主要功能有:
提供Mapper接口与配置文件中对应SQL的导航
编辑XML文件时自动补全
根据Mapper接口, 使用快捷键生成xml文件及SQL标签
ResultMap中的property支持自动补全,支持级联(属性A.属性B.属性C)
快捷键生成@Param注解
XML中编辑SQL时, 括号自动补全
XML中编辑SQL时, 支持参数自动补全(基于@Param注解识别参数)
自动检查Mapper XML文件中ID冲突
自动检查Mapper XML文件中错误的属性值
支持Find Usage
支持重构从命名
支持别名
自动生成ResultMap属性
快捷键: Option + Enter(Mac) | Alt + Enter(Windows)
MyBatis 的配置文件包含了MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
/root/workspace/lucenedemo/logs
/root/workspace/lucenedemo/logs/error
/root/workspace/lucenedemo/logs/warn
%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
注意:
1.修改本地路径的jdbc驱动jar包位置
D:\\Tools\\MavenHouse\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
2. 修改指定javaBean生成的位置
com.ycxw.model" targetProject="src/main/java"> ......
3. 修改指定sql映射文件生成的位置
com.ycxw.mapper" targetProject="src/main/java"> ......
4. 修改指定生成mapper接口文件位置
com.ycxw.mapper" targetProject="src/main/java" type="XMLMAPPER"> ......
5. 修改需要引用的数据库表名
1. 找到配置的MyBatis插件启动mybatis-general
2. 然后就会生成实体和增删改查接口和实现的配置文夹:
1. 编写BookBiz接口类
package com.ycxw.biz;
import com.ycxw.model.Book;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-20 17:52
*/
public interface BookBiz {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
}
2. 编写BookBizImpl接口实现类
package com.ycxw.biz.impl;
import com.ycxw.biz.BookBiz;
import com.ycxw.mapper.BookMapper;
import com.ycxw.model.Book;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-20 17:52
*/
public class BookBizImpl implements BookBiz {
//引入生成的接口
private BookMapper bookMapper;
public BookMapper getBookMapper() {
return bookMapper;
}
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
@Override
public int deleteByPrimaryKey(Integer bid) {
return bookMapper.deleteByPrimaryKey(bid);
}
@Override
public int insert(Book record) {
return bookMapper.insert(record);
}
@Override
public int insertSelective(Book record) {
return bookMapper.insertSelective(record);
}
@Override
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
@Override
public int updateByPrimaryKeySelective(Book record) {
return bookMapper.updateByPrimaryKeySelective(record);
}
@Override
public int updateByPrimaryKey(Book record) {
return bookMapper.updateByPrimaryKey(record);
}
}
该类主要为了实现了一个简单的MyBatis的SqlSession管理工具类,通过openSession()方法可以获取到当前线程的SqlSession对象,方便进行数据库操作。
package com.ycxw.utils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 工厂类
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-20 17:58
*/
public class SessionUtil {
private static SqlSessionFactory sessionFactory;
private static ThreadLocal threadLocal = new ThreadLocal();
static {
sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
}
public static SqlSession openSession() {
SqlSession session = threadLocal.get();
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void main(String[] args) {
SqlSession session = openSession();
System.out.println(session.getConnection());
session.close();
// System.out.println(session.getConnection());
}
}
package com.ycxw.demo;
import com.ycxw.biz.BookBiz;
import com.ycxw.biz.impl.BookBizImpl;
import com.ycxw.mapper.BookMapper;
import com.ycxw.model.Book;
import com.ycxw.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-20 18:05
*/
public class CURDTest {
private BookBiz bookBiz;
private SqlSession sqlSession;
@Before
public void before(){
System.out.println("执行测试方法之前会执行的初始化代码块方法");
//获取一个数据库会话对象,并将其赋值给sqlSession变量
this.sqlSession = SessionUtil.openSession();
//实例化业务逻辑层
BookBizImpl book = new BookBizImpl();
//获取接口实例
BookMapper mapper = this.sqlSession.getMapper(BookMapper.class);
book.setBookMapper(mapper);
//最后赋值给bookBiz接口,便于对数据库进行增删改查操作
this.bookBiz = book;
}
@After
public void after(){
System.out.println("执行测试方法之后的后执行的方法");
//提交事务
this.sqlSession.commit();
}
@Test
public void text1(){
System.out.println("测试查询方法方法..");
Book book = bookBiz.selectByPrimaryKey(25);
System.out.println(book);
}
@Test
public void text2(){
System.out.println("测试新增方法");
int insert = bookBiz.insert(new Book(1,"Mybatis宝典",9.9f));
System.out.println("所影响的行数"+insert);
}
}
运行测试:
数据库验证: