MyBatis基础一
环境:
- JDK18
- Mysql:8.0.19
- maven:3.8.1
- IDEA
基础:
- JDBC
- Mysql
- Java基础
- Maven
- Junit 单元测试,利用注释@test
SSM框架:配置文件
简介
什么是MyBatis
- MyBatis 是一款优秀的持久层框架
- 它支持自定义 SQL、存储过程以及高级映射
- MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录
- Mybatis本是Apache的一个开源项目Ibatis,2010年这个项目由Apache software foundation迁移到了Google Code,并改名为Mybatis。
- 2013年11月迁移到Github。
如何获得MyBatis
maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
持久化
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
- 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
- JDBC就是一种持久化机制。文件IO也是一种持久化机制。
- 在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的
- 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。
- 内存过于昂贵,与硬盘、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。
持久层
Dao层(完成持久化的代码块)、Service层(业务层,接收具体的业务)、Controller层(接收用户的请求,把用户的请求传发给业务层去做)
- 持久层完成持久化工作的代码块
- 层的界限十分明显
为什么需要MyBais
虽然JDBC也能处理数据,但是MyBatis更加方便
帮助程序员将数据存入到数据库中
不用MyBatis框架也可以,更容易上手。
编写MyBatis程序
搭建环境
1.搭建数据库
创建数据库mybatis,写入一个user表。
create database `mybatis`;
use `mybatis`;
CREATE TABLE `user`(
`id` int(20) not null PRIMARY KEY,
`name` varchar(30) default null,
`pwd` varchar(30) DEFAULT null
)ENGINE=INNODB default charset=utf8;
insert into `user`(`id`,`name`,`pwd`) values
(1,'张三',123456),
(2,'李四',123456),
(3,'王五',123456)
2.新建一个普通的maven项目。
删除src文件,把该项目当作父工程。
3.导入依赖。可在官网查找https://mvnrepository.com/artifact
- mysql驱动
- mybatis
- junit
- 注意防止资源导入失败,配置resource
<dependencies> <!-- Mybatis依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- Mysql连接依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> </dependencies><!--在build中配置resources, 来防止我们资源导出失败问题--> <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>
创建一个模块
1.编写mybatis的配置文件(mybatis-config.xml)
注意不要添加注释
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/serenity/dao/UserMapper.xml"></mapper>
</mappers>
</configuration>
解释:com.mysql.jdbc.Driver 是 MySQL 数据库连接器的一个类,用于通过 JDBC(Java Database Connectivity)接口连接 MySQL 数据库。这个类属于 MySQL Connector/J 驱动程序,它是一个用于在 Java 应用程序中连接 MySQL 数据库的库。
版本区别:
在 MySQL Connector/J 5.x 版本中,使用的是 com.mysql.jdbc.Driver 类。然而,从 MySQL Connector/J 6.x 版本开始,推荐使用 com.mysql.cj.jdbc.Driver 类。这是因为新版本的驱动程序在性能和功能上进行了改进,并且旧的 com.mysql.jdbc.Driver 类已经被弃用
每一个mapper.xml都需要在mybatis核心配置文件中注册。com/serenity/dao/UserMapper.xml是核心配置地址。
连接数据库,步骤在MySql基础四的JDBC中。
2.编写mybatis工具类(MybatisUtils)
通过 SqlSessionFactory
获取 SqlSession
执行数据库操作
其中核心代码:
String resource = "mybatis-config.xml";
-
作用:定义一个字符串变量,指向 MyBatis 的配置文件路径。
-
说明:
-
mybatis-config.xml
是 MyBatis 的全局配置文件,包含数据库连接、事务管理、映射文件路径等配置。 -
此文件一般放在项目的类路径下(如
src/main/resources
或src/main/java
的某个包中)
-
InputStream inputStream = Resources.getResourceAsStream(resource);
-
作用:将配置文件以输入流的形式加载到内存。
-
涉及的类:
-
Resources
:MyBatis 提供的工具类,用于从类路径、文件系统或 URL 加载资源。 -
方法
getResourceAsStream(String resource)
:从类路径加载资源并返回InputStream
。
-
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
-
作用:通过配置文件构建
SqlSessionFactory
对象。 -
涉及的类:
-
SqlSessionFactoryBuilder
:临时工具类,唯一用途是通过配置文件构建SqlSessionFactory
。 -
SqlSessionFactory
:MyBatis 的核心对象,用于创建SqlSession
(类似数据库连接)。 -
方法
build(InputStream inputStream)
:解析配置文件的输入流,生成SqlSessionFactory
。
-
-
特性:
-
SqlSessionFactory
是线程安全的,整个应用只需一个实例。 -
它负责管理数据库连接池、事务、映射文件等全局资源。
-
编写代码
- 实体类
- Dao接口
- 接口实现类
实体类编写:
创建User类,该类对应数据库mybatis中的数据表users。
Dao接口相当于以后的Mapper
接口实现类(UserMapper.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="com.serenity.dao.UserDao">
<select id="getUserList" resultType="com.serenity.pojo.User">
select * from mybatis.user
</select>
</mapper>
测试
测试查询操作
@Test
public void test(){
//获取Sqlsession对像
SqlSession sqlSession = MybatisUtils.getSqlSession();
//执行sql,获取dao对象
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭Sqlsession
sqlSession.close();
}
CRUD
需注意:
- namespace:命名空间,绑定的是对应的Dao/Mapper接口。如果命名空间错误,便无法找到接口。
- select(选择):查询语句,
- id是命名空间下的唯一标识符,接口中方法的名字
- resultType:Sql语句执行的返回值,一般为类,如上面的User类,以及各种类型,如整型
- parameterType:参数类型
编写一个查询语句
1.需要在Dao接口下定义一个方法
2.在接口实现类的配置文件中加上查询的配置文件
3.测试代码,在UserDaoTest测试类中编写测试代码,省略JDBC中的许多操作
insert
插入一个用户
1.需要在Dao接口下定义一个方法
2.在接口实现类的配置文件中加上查询的配置文件
3.测试代码,在UserDaoTest测试类中编写测试代码
update
编写接口
编写配置:
测试:
delete
接口:
/*删除一个用户*/
int deleteUser(int id);
接口配置文件:
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
测试:
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);//获得接口
mapper.deleteUser(4);//调用接口中的方法,传入参数
sqlSession.commit();//提交事务
sqlSession.close();
}
注意:增删改都需要提交事务
万能Map
假设我们的实体类,或者数据库中的表,字段或者参数越多,我们应当考虑使用Map。
添加
编写Userdao接口。
/*添加用户,用map,不需要知道数据库有什么*/
int addUser2(Map<String,Object> map);
编写配置文件UserMapper.xml
<insert id="addUser2" parameterType="map" >
insert into mybatis.user(id,name,pwd) values (#{userid},#{username},#{password})
</insert>
编写测试类
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userid",5);
map.put("username","小米");
map.put("password",123456);
mapper.addUser2(map);
//插入数据需要提交事务
sqlSession.commit();
sqlSession.close();
}
测试结果:
查询
编写Userdao接口
/*根据id查询,传入一个map*/
User getUserByid2(Map<String,Object> map);
编写配置UserMapper.xml
测试:
Map传递参数,直接在sql中取出key即可【parameterType="map"】
对象传递参数,直接在sql中取对象的属性即可【parameterType="Object"】
只有一个基本类型参数的情况下,可以直接在sql中取到
多个参数用Map或者注解。
模糊查询
编写接口
编写配置文件
编写测试类