目录
一、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简介
1. 什么是 MyBatis ?
MyBatis是一个开源的Java持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2. MyBatis的特性
-
简单易用:MyBatis使用简单的XML或注解配置来映射Java对象和SQL语句,使得开发人员可以轻松地编写和维护数据库访问代码。
-
灵活性:MyBatis允许开发人员编写自定义的SQL语句,从而可以灵活地处理复杂的数据库操作。它还支持动态SQL,可以根据不同的条件生成不同的SQL语句。
-
高性能:MyBatis使用了一些优化技术,如预编译SQL语句、缓存等,以提高数据库访问的性能。
-
易于集成:MyBatis可以与各种流行的Java框架(如Spring)无缝集成,使得开发人员可以更方便地使用MyBatis进行数据库操作。
MyBatis的主要作用是简化Java应用程序与关系型数据库之间的交互。通过使用MyBatis,开发人员可以通过简单的配置和编写SQL语句,实现对数据库的增删改查操作。同时,MyBatis还提供了一些高级特性,如分页查询、批量操作等,使得数据库访问更加灵活和高效。总之,MyBatis是一个功能强大、易于使用的持久层框架,被广泛应用于Java开发中。
3. 什么是持久层框架?
持久层框架是一种软件框架,用于简化应用程序与数据库之间的交互和数据持久化操作。在软件开发中,应用程序通常需要与数据库进行交互,包括数据的读取、写入、更新和删除等操作。持久层框架的主要目的是提供一种简单、高效、可维护的方式来处理这些数据库操作。
传统的数据库操作方式通常需要开发人员手动编写SQL语句,并处理数据库连接、事务管理等细节。这种方式存在一些问题,如代码冗余、易出错、难以维护等。持久层框架的出现解决了这些问题,它提供了一种抽象层,将数据库操作封装起来,使开发人员可以通过简单的API调用来进行数据库操作,而无需关注底层的数据库细节。
持久层框架通常提供以下功能:
-
对象关系映射(ORM):持久层框架可以将数据库表和Java对象之间建立映射关系,使得开发人员可以通过操作Java对象来实现对数据库的操作,而无需直接编写SQL语句。
-
数据库连接管理:持久层框架负责管理数据库连接的创建、释放和连接池的管理,以提高数据库访问的性能和效率。
-
事务管理:持久层框架可以提供事务管理的功能,确保数据库操作的一致性和完整性。
-
缓存管理:持久层框架可以提供缓存机制,将经常访问的数据缓存在内存中,以提高数据的读取性能。
持久层框架的使用可以简化数据库操作的代码量,提高开发效率,降低开发难度,并且可以提供一些高级特性,如懒加载、分页查询、批量操作等,使得数据库操作更加灵活和高效。常见的持久层框架有Hibernate、MyBatis等。
二、MyBatis环境配置
2.1 创建maven工程
我使用的是idea2023版,其他版本创建Maven方式会有所不同,仅供参考:
2.2 导入相关pom依赖
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
2.3 导入jdbc配置文件
我用的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
2.4 Mybatis相关插件安装
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)
3.5 Mybatis-cfg.xml 核心配置
MyBatis 的配置文件包含了MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
2.6 引入Log4j2日志文件
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
- log4j可以控制每一条日志的输出格式
- log4j可以通过一个配置文来灵活地进行配置,而不需要修改应用的代码。
/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
2.7 generatorConfig.xml 配置代码生成器
<!--<!– –>-->
<!--<!– –>-->
注意:
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. 修改需要引用的数据库表名
三、MyBatis实现增删改查
3.1 MyBatis自动生成代码
1. 找到配置的MyBatis插件启动mybatis-general
2. 然后就会生成实体和增删改查接口和实现的配置文夹:
3.2 解读生成的配置文件和方法
- id:对应的接口中的方法名
- resultType: sql语句执行的返回值类型
- parameterType:参数类型
3.3 编写业务逻辑层实现接口
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);
}
}
3.4 编写工厂类
该类主要为了实现了一个简单的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());
}
}
3.5 编写测试类测试
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);
}
}
运行测试:
数据库验证: