文章目录
MyBatis - (10) 面向接口的CRUD操作
1. MyBatis中的接口代理机制
在MyBatis当中,提供了相关的机制,可以动态为我们生成dao接口的实现类。(代理类:dao接口的代理)
MyBatis当中实际上采用了代理模式,在内存中生成到接口的代理类,然后创建代理类的实例。
使用MyBatis的这种代理机制的前提,SqlMapper.xml文件中namespace必须是dao接口的全限定名称,id必须是dao接口中的方法
获取代理类的实例:
BookDao mapper = sqlSession.getMapper(BookDao.class);
其中mapper实际上就是DaoImpl对象,底层不但为BookDao生成了字节码,并且还new实现类对象了。
2. 数据准备
2.1 数据表结构的设计
设计t_book表结构
2.2 准备数据表中的数据
3. 搭建环境
3.1 创建模块
![image-20230331171534018](https://cdn.staticaly.com/gh/chenyouchang/markdown_pic@main/2023/03/202304080919017.png)
3.2 修改打包方式
修改pom.xml
<packaging>jar</packaging>
3.3 引进依赖
在pom.xml引进mybatis依赖,mysql驱动依赖,junit依赖,logback依赖
<dependencies>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!-- mysql驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- logback依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
3.4 创建日志配置文件
在resources目录下创建logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 日志输出级别,logback日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
3.5 创建SQL映射文件
在resources/mappers目录下创建BookMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
3.6 创建jdbc.properties
在resources目录下创建jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
3.7 创建MyBatis核心配置文件
在resources目录下创建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引进外部属性文件 -->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--${key}使用-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置SQL映射文件路径 -->
<mappers>
<mapper resource="mappers/BookMapper.xml"/>
</mappers>
</configuration>
3.8 创建包
3.9 拷贝SqlSession工具类
在utils目录下拷贝SqlSessionUtil类
package com.julissa.book.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;
public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
/**
* 类加载时初始化sqlSessionFactory对象
*/
static {
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
// 保证一个线程中只有一个SqlSessio对象
private static ThreadLocal<SqlSession> local = new ThreadLocal<>();
/**
* 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
*
* @return 新的会话对象
*/
public static SqlSession getSqlSession() {
SqlSession sqlSession = local.get();
if (sqlSession == null) {
sqlSession = sqlSessionFactory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
/**
* 关闭SqlSession对象
* @param sqlSession
*/
public static void close(SqlSession sqlSession){
if (sqlSession != null) {
sqlSession.close();
}
local.remove();
}
}
3.10 创建pojo实体
在pojo目录下创建Book类
package com.julissa.book.pojo;
/**
* 实体类,用来封装book信息
*/
public class Book {
private Integer id;
private String BookNum;
private String bookName;
private String author;
private Double sellPrice;
private String publishTime;
private String bookType;
public Book() {
}
public Book(Integer id, String bookNum, String bookName, String author, Double sellPrice, String publishTime, String bookType) {
this.id = id;
BookNum = bookNum;
this.bookName = bookName;
this.author = author;
this.sellPrice = sellPrice;
this.publishTime = publishTime;
this.bookType = bookType;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", BookNum='" + BookNum + '\'' +
", bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", sellPrice=" + sellPrice +
", publishTime='" + publishTime + '\'' +
", bookType='" + bookType + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookNum() {
return BookNum;
}
public void setBookNum(String bookNum) {
BookNum = bookNum;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getSellPrice() {
return sellPrice;
}
public void setSellPrice(Double sellPrice) {
this.sellPrice = sellPrice;
}
public String getPublishTime() {
return publishTime;
}
public void setPublishTime(String publishTime) {
this.publishTime = publishTime;
}
public String getBookType() {
return bookType;
}
public void setBookType(String bookType) {
this.bookType = bookType;
}
}
3.11 创建dao接口
在dao目录下创建BookDao接口
package com.julissa.book.dao;
/**
* Dao层接口
*/
public interface BookDao {
}
至此,基本的实验环境已经搭建完毕
4.实现步骤
使用面向接口的方式进行crud操作
4.1 insert
第一步:在BookDao接口中定义insert方法
/**
* 增加记录
* @param book 添加的对象
* @return 操作结果 1成功 0失败
*/
public int insert(Book book);
第二步:在BookMapper.xml中进行配置
<insert id="insert">
insert into
t_book
values
(null,#{bookNum},#{bookName},#{author},#{sellPrice},#{publishTime},#{bookType})
</insert>
第三步:编写测试程序
@Test
public void testInsert(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
BookDao mapper = sqlSession.getMapper(BookDao.class);
Book book = new Book(null, "1020", "《我也不知道叫什么》", "julissa", 50.00, "2023-01", "某类型");
int count = mapper.insert(book);
sqlSession.commit();
SqlSessionUtil.close(sqlSession);
System.out.println("添加了" + count + "条记录");
}
第四步:运行测试程序
运行结果:
查看数据表:
4.2 update
第一步:在BookDao接口中定义update方法
/**
* 修改记录
* @param book 修改的对象
* @return 操作结果 1成功 0失败
*/
public int update(Book book);
第二步:在BookMapper.xml中进行配置
<update id="update">
update
t_book
set
book_num = #{bookNum},
book_name = #{bookName},
author = #{author},
sell_price = #{sellPrice},
publish_time = #{publishTime},
book_type = #{bookType}
where
id = #{id}
</update>
第三步:编写测试程序
@Test
public void testUpdate(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
BookDao mapper = sqlSession.getMapper(BookDao.class);
Book book = new Book(24, "1021", "《我知道该叫什么啦》", "julissa", 88.00, "2023-01", "某类型");
int count = mapper.update(book);
sqlSession.commit();
SqlSessionUtil.close(sqlSession);
System.out.println("修改了" + count + "条记录");
}
第四步:运行测试程序
修改之前的数据表:
运行结果:
4.3 delete
删除id为24的记录
第一步:在BookDao接口中定义deleteById方法
/**
* 根据id删除记录
* @param id 要删除记录的id
* @return 操作结果 1成功 0失败
*/
public int deleteById(int id);
第二步:在BookMapper.xml中进行配置
<delete id="deleteById">
delete from
t_book
where
id = #{id}
</delete>
第三步:编写测试程序
@Test
public void testdelete(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
BookDao mapper = sqlSession.getMapper(BookDao.class);
int count = mapper.deleteById(24);
sqlSession.commit();
SqlSessionUtil.close(sqlSession);
System.out.println("删除了" + count + "条记录");
}
第四步:运行测试程序
删除之前的数据:
运行结果:
4.4 select
4.4.1 查询一条记录
查询id为1的记录
第一步:在BookDao接口中定义selectById方法
/**
* 根据id查询记录
* @param id 要查询记录的id
* @return 查询的对象
*/
public Book selectById(int id);
第二步:在BookMapper.xml中进行配置
<select id="selectById" resultType="com.julissa.book.pojo.Book">
select
id,
book_num as bookNum,
book_name as bookName,
author,
sell_price as sellPrice,
publish_time as publishTime,
book_type as bookType
from
t_book
where
id = #{id}
</select>
第三步:编写测试程序
@Test
public void testselectById(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
BookDao mapper = sqlSession.getMapper(BookDao.class);
Book book = mapper.selectById(1);
System.out.println(book);
SqlSessionUtil.close(sqlSession);
}
第四步:运行测试程序
运行结果:
4.4.1 查询所有记录
查询所有记录
第一步:在BookDao接口中定义selectAll方法
/**
* 查询所有记录
* @return 封装所有记录的列表对象
*/
public List<Book> selectAll();
第二步:在BookMapper.xml中进行配置
<select id="selectAll" resultType="com.julissa.book.pojo.Book">
select
id,
book_num as bookNum,
book_name as bookName,
author,
sell_price as sellPrice,
publish_time as publishTime,
book_type as bookType
from
t_book
</select>
第三步:编写测试程序
@Test
public void testselectAll(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
BookDao mapper = sqlSession.getMapper(BookDao.class);
List<Book> books = mapper.selectAll();
for (Book book: books){
System.out.println(book);
}
SqlSessionUtil.close(sqlSession);
}
第四步:运行测试程序
运行结果: