目录
一、引言
1.1MyBatis概念
1.2.为什么要使用MyBatis
二、搭建Mybatis环境
2.1.创建Maven项目
2.2.导入相关pom依赖
2.3.导入相关配置文件
2.4.Mybatis相关插件安装
2.5.Mybatis.cfg.xml配置
三、基于ssm逆向工程的使用(IDEA)
3.1.安装Mybatis generator插件
3.2.配置generatorConfig.xml
四、结合Mybatis生成代码完成增删改查
五、面试题SQLSession的作用
MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口和Java的POJO映射成数据库 。
MyBatis的主要特点包括:
使用MyBatis的主要优点是:
1. 通过简单的XML或注解配置,可以方便地将Java对象与数据库记录进行映射,避免了繁琐的JDBC代码。
2. MyBatis支持高级映射和存储过程,使得数据库操作更加简单、高效。
3. MyBatis可以自动映射结果集到Java对象,减少了手动处理结果集的代码量。
4. MyBatis支持事务管理,可以确保数据的一致性和完整性。
5. MyBatis具有很好的扩展性,可以通过插件或自定义拦截器来实现更多的功能。
以一个简单的查询操作为例,不使用MyBatis时,我们需要编写如下JDBC代码:
String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
// ...其他属性设置
}
而使用MyBatis时,我们只需要编写如下XML配置和Java对象:
User user = sqlSession.selectOne("getUserById", userId);
可以看到,使用MyBatis后,代码变得更加简洁明了。
首先我们在学习mybatis之前先创建一个基础的maven项目
右击项目名➡new➡module
选择maven项目➡选择jdk版本➡选择webapp
输入项目名
选择好maven项目的文件位置➡点击添加按钮➡配置好参数
①将
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-generator-maven-plugin在运行时能够正确地将所需的文件复制到目标文件夹中,避免出现缺少文件或配置错误的问题。
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
③Maven插件的配置,用于使用MyBatis Generator插件
可以在Maven构建过程中使用MyBatis Generator插件来生成Java代码,包括Mapper接口和XML映射文件,以简化数据库操作的开发过程。
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
5.1.44
true
我们知道Mybatis是一款有关于数据库的框架,所以我们还需要导入关于数据库连接的配置文件
jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
修改web.xml文件
一共需要安装四款插件
Free mybatis plugin
Mybatis generator
mybatis tools
maven helper
小贴士:
Free MyBatis plugin:这个插件主要实现了mapper和xml的快速跳转,不用每次查找sql的时候全局搜索了。常用的就是第二个功能:快速从xml代码跳转到mapper文件和从mapper文件跳转到xml代码。
Mybatis generator:这个插件可以根据数据库表结构自动生成对应的实体类、Mapper接口和XML映射文件。这样可以大大减少开发人员的工作量,提高开发效率。
Mybatis tools:这个插件提供了一些MyBatis相关的工具,比如代码生成器、代码分析器等等。
Maven helper:这个插件主要用来解决maven冲突。安装完成后,打开pom.xml文件,会多出一个Dependency Analyzer选项卡。默认选中的是冲突项,左侧展示的是冲突列表,随便点一个,显示红色的右键排除即可。然后点击左上角Refresh UI按钮即可看到已经排除,pom中也会自动添加排除代码。
众所周知,一款框架必定有自己的配置文件,Mybatis也是一样有配置文件
Mybatis.cfg.xml
基于SSM逆向工程的使用(IDEA)是指在IntelliJ IDEA这个集成开发环境中使用MyBatisGenerator工具,根据数据库表结构自动生成对应的实体类、Mapper接口和XML映射文件。这样可以大大减少开发人员的工作量,提高开发效率。
这一步我们上面已经完成了直接跳过
generatorConfig.xml
注意事项:
①修改Mysql驱动的位置
②修改JavaBean生成的位置
③修改SQL对应的配置文件的生成地址
④修改Dao层代码地址的生成地址
⑤修改指定需要生成增删改查代码对应的表
如果你想一次性生成多个那么你就复制多个table出来即可。
双击我们下载好的插件执行生成代码即可
这时候代码就生成完成了
①创建一个util包和一个SessionUtil类
package com.csdn.xw.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
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();
}
}
小贴士:
- 这个工具类的作用是创建并管理MyBatis的SqlSession对象。它通过读取mybatis.cfg.xml配置文件来初始化一个SqlSessionFactory,然后使用这个工厂创建一个SqlSession。SqlSession对象用于执行数据库操作,如查询、插入、更新和删除。
- 在openSession()方法中,首先检查当前线程是否已经有一个SqlSession对象,如果没有,就创建一个新的SqlSession并将其设置到当前线程。如果已经有一个SqlSession对象,就直接返回这个对象。
- 在main()方法中,调用openSession()方法获取一个SqlSession对象,然后打印出这个对象的连接信息,最后关闭这个SqlSession对象。
②创建biz层和BookBiz接口(直接拷贝mapper生成的即可)
package com.csdn.xw.biz;
import com.csdn.xw.model.Book;
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);
}
③创建impl层用bookbizimpl实现BookBiz
package com.csdn.xw.biz.Impl;
import com.csdn.xw.biz.BookBiz;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.model.Book;
/**
* @author Java方文山
* @compay csdn_Java方文山
* @create 2023-08-19-13:41
*/
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);
}
}
注意:需要提供bookMapper的set和get方法
④测试
注释Junit的
标签用于指定依赖的范围表示该依赖在编译、测试和运行时都有效。
package demo;
import com.csdn.xw.biz.Impl.BookBizImpl;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author Java方文山
* @compay csdn_Java方文山
* @create 2023-08-19-13:46
*/
public class demo1 {
private BookBizImpl bookBiz = new BookBizImpl();
SqlSession sqlSession;
@Before
public void setUp() throws Exception {
System.out.println("初始换方法。。。");
//工具类中获取session对象
sqlSession = SessionUtil.openSession();
//从session对象中获取mapper对象
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
bookBiz.setBookMapper(mapper);
}
@After
public void tearDown() throws Exception {
System.out.println("方法测试结束。。");
}
@Test
public void deleteByPrimaryKey() {
System.out.println("测试删除业务方法");
System.out.println(bookBiz.deleteByPrimaryKey(1));
}
@Test
public void selectByPrimaryKey() {
System.out.println("测试的查询业务方法。。。");
//System.out.println(bookBiz.getBookMapper());
System.out.println(bookBiz.selectByPrimaryKey(44));
}
}
这里测试两个代表性的事物,一个删除一个查询
运行报错,说是getMapper没有值,这时候我们想起来,前面因为还没生成代码,为了防止报错我们将
查询测试结果:
我们将编号为1的数据删除
这里返回值是1说明删除成功了,可我们回过头到数据库查看,数据还是在,这是为什么呢?
因为我们Mybatis没有自动提交事物的能力,所以我们在 @After测试方法中编写提交的事物即可
编写完成后我们在进行测试,这时候我们的数据就被删除了。
SQLSession是MyBatis框架中的一个接口,它的主要作用是执行SQL语句和管理事务。在MyBatis中,一个SqlSessionFactory实例会创建一个SqlSession实例,每个SqlSession实例都有一个自己的事务,用于执行SQL操作。当多个SqlSession实例并发执行时,它们会共享同一个事务,这样可以保证数据的一致性。
总结一下,SQLSession的作用如下:
到这里我的分享就结束了,欢迎到评论区探讨交流!!
如果觉得有用的话还请点个赞吧 ♥ ♥