一、MyBatis概述
1.1 框架的概念
-
在文档中framework的意思就是框架
-
Java的常用框架:
-
SSM三大框架:Spring+SpringMVC+MyBatis
-
SpingBoot
-
SpringCloud等等...
-
-
框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率。
-
架构一般都以jar包的形式存在。(jar包中有class文件以及各种配置文件等。)
-
通俗的讲框架就好比是一个毛胚房,就等着我们根据自己的需求去调用方法装修
1.2:三层架构
mybatis:持久层框架(做数据库连接操作) 数据访问层
spring 应用层框架(业务逻辑处理) 业务逻辑层
spriing MVC 基于Spring框架的Web应用程序开发框架 表示层
1.3JDBC的不足
例如:
示例一:
/*
*查询
*/
List<Flower> list = new ArrayList<>();
//SQL语句写死在Java程序中
String sql = "select * from flower";
ResultSet rs = executeQuery(sql, null);
try {
while (rs.next()) {
Flower flower = new Flower();
flower.setId(rs.getInt(1));
flower.setName(rs.getString(2));
flower.setAnothername(rs.getString(3));
flower.setProperty(rs.getString(4));
flower.setPrice(rs.getFloat(5));
flower.setProduction(rs.getString(6));
list.add(flower);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
super.closeAll(rs, super.pstmt, super.con);
}
示例二:
/*
*添加
*/
//......
//SQL语句写死在Java程序中
String sql = "INSERT INTO `ketai`.`flower`( `name`, `anothername`, `property`, `price`, `production`) VALUES (?,?,?,?,?);";
//繁琐的赋值
Object[] params = {flower.getName(),
flower.getAnothername(),
flower.getProperty(),
lower.getPrice(),
flower.getProduction()};
int count = executeUpdate(sql, params);
//.....
1.4 了解MyBatis
MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD(增删改查)
MyBatis在三层架构中负责持久层,属于持久层架构
MyBatis的发展历程:
MyBatis本是apache的一个开源项目IBatis,2010年这个项目有apache software foundation(简称asf:(apache软件基金会)) 迁移到Google code,并且改名为MyBatis。2023年11月迁移到Github。
iBatis一词源于"internet"和"abatis"的组合,是一个基于Java的持久层架构。iBatis提供的持久层架构包括SQL Map和Data Axxess Objects (DAOs)。
-
打开mybatis代码可以看到它的包结构中包含ibatis
ORM:对象关系映射
O(Object):Java虚拟机中的Java对象
R(Relational):关系型数据库
M(Mapping):将Java虚拟机中的Java对象映射到数据库表中一行记录,或是将数据库表中一行记录映射成Java虚拟机中的一个Java对象
MyBatis框架就是一个半自动的ORM框架
-
因为MyBatis框架中的SQL需要程序员自己编写
MyBatis可以干啥? Java对象<---->数据库中的一条记录 这个相互转换的过程叫做 映射:(Mapping)
关系图:
ORM图示
-
MyBatis架构特点:
-
支持定制化SQL、存储过程、基本映射以及高级映射
-
避免了几乎所有的JDBC代码中手动设置参数以及获取结果集
-
支持XML开发、也支持注解式开发。【为了保证sql语句灵活,所有mybatis大部分是采用XML方式开发】
-
将接口和Java的POJs(Plain Ordinary Java Object,简单普通的Java对象映射成数据库中的记录)
-
体积小好学:两个jar包,两个XML配置文件。
-
完全做到sql低耦合。
-
提供了基本映射标签。
-
提供了高级映射标签。
-
提供了XML标签,支持动态SQL的编写。
-
二、下载
1.maven
首先到maven远程仓库https://mvnrepository.com/中搜索mybatis
点击第一个
选择你要使用的版本
比如说我使用的是3.5.13版的就选中第一个,点进去
之后选择下面这个,他是点击之后默认会全选
然后复制粘贴到maven项目中的pom.xml文件中的dependencies标签中刷新之后依赖项中出现了就可以了
2.普通项目
首先到mybatis的官网中点击mybatis-3
然后点击releases打开发行版
选择你要使用的版本
三、配置文件
1.mybatis-config.xml文件
注意: 第一:这个文件名不是必须叫做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>
<!--引入database.properties文件-->
<!--1.导入属性文件-->
<properties resource="database.properties"/>
<!--3.环境配置-->
<environments default="development">
<environment id="development">
<!--配置事务管理 采用JDBC的事务管理 mybatis其实就是对JDBC的封装 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="映射的mapper文件"/>
</mappers>
</configuration>
具体配置可以查看MyBatis中文网
database.peperties里面放的是
driver =com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
username=root
password=root
配置完成后出现下图所示就表示可以了
2.编写XxxxxMapper.xml文件
跟上面一样的步骤
在这个配置文件当中编写SQL语句。 这个文件名也不是固定的,放的位置也不是固定
namespace的值为你要实现的接口
!!!记得在mybatis-config.xml文件中添加
<mappers>
<mapper resource="XxxxxxMapper.xml文件的路径"/>
</mappers>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.SysUserMapper">
<!--
namespace的值是你的XxxxxMapper.xml文件的路径,将/改为.。后缀xml去掉
增删改查的代码 id一般是接口中的方法名
resultType的值为返回的类型- 我这里是查询所有就返回他的实体类
-->
<delete id="deleteUser">
delete
from t_sysuser
where id = #{id}
</delete>
<select id="getUserById" resultType="pojo.SysUser">
select *
from t_sysuser
where id = #{id}
</select>
</mapper>
四、测试
1.先创建一个实体类
实体类中的值
package pojo;
import java.sql.Date;
import java.time.LocalDate;
public class SysUser {
private Integer id;
private String account;
private String realName;
private String password;
private Integer sex;
private Date birthday;
private String phone;
private String address;
private Integer roleId;
private Integer createdUserId;
private LocalDate caretedTime;
private Integer updatedUserId;
private LocalDate updatedTime;
public SysUser() {
}
public SysUser(Integer id, String account, String realName, String password, Integer sex, Date birthday, String phone, String address, Integer roleId, Integer createdUserId, LocalDate caretedTime, Integer updatedUserId, LocalDate updatedTime) {
this.id = id;
this.account = account;
this.realName = realName;
this.password = password;
this.sex = sex;
this.birthday = birthday;
this.phone = phone;
this.address = address;
this.roleId = roleId;
this.createdUserId = createdUserId;
this.caretedTime = caretedTime;
this.updatedUserId = updatedUserId;
this.updatedTime = updatedTime;
}
/**
* 获取
* @return id
*/
public Integer getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取
* @return account
*/
public String getAccount() {
return account;
}
/**
* 设置
* @param account
*/
public void setAccount(String account) {
this.account = account;
}
/**
* 获取
* @return realName
*/
public String getRealName() {
return realName;
}
/**
* 设置
* @param realName
*/
public void setRealName(String realName) {
this.realName = realName;
}
/**
* 获取
* @return password
*/
public String getPassword() {
return password;
}
/**
* 设置
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取
* @return sex
*/
public Integer getSex() {
return sex;
}
/**
* 设置
* @param sex
*/
public void setSex(Integer sex) {
this.sex = sex;
}
/**
* 获取
* @return birthday
*/
public Date getBirthday() {
return birthday;
}
/**
* 设置
* @param birthday
*/
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/**
* 获取
* @return phone
*/
public String getPhone() {
return phone;
}
/**
* 设置
* @param phone
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* 获取
* @return address
*/
public String getAddress() {
return address;
}
/**
* 设置
* @param address
*/
public void setAddress(String address) {
this.address = address;
}
/**
* 获取
* @return roleId
*/
public Integer getRoleId() {
return roleId;
}
/**
* 设置
* @param roleId
*/
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
/**
* 获取
* @return createdUserId
*/
public Integer getCreatedUserId() {
return createdUserId;
}
/**
* 设置
* @param createdUserId
*/
public void setCreatedUserId(Integer createdUserId) {
this.createdUserId = createdUserId;
}
/**
* 获取
* @return caretedTime
*/
public LocalDate getCaretedTime() {
return caretedTime;
}
/**
* 设置
* @param caretedTime
*/
public void setCaretedTime(LocalDate caretedTime) {
this.caretedTime = caretedTime;
}
/**
* 获取
* @return updatedUserId
*/
public Integer getUpdatedUserId() {
return updatedUserId;
}
/**
* 设置
* @param updatedUserId
*/
public void setUpdatedUserId(Integer updatedUserId) {
this.updatedUserId = updatedUserId;
}
/**
* 获取
* @return updatedTime
*/
public LocalDate getUpdatedTime() {
return updatedTime;
}
/**
* 设置
* @param updatedTime
*/
public void setUpdatedTime(LocalDate updatedTime) {
this.updatedTime = updatedTime;
}
public String toString() {
return "SysUser{id = " + id + ", account = " + account + ", realName = " + realName + ", password = " + password + ", sex = " + sex + ", birthday = " + birthday + ", phone = " + phone + ", address = " + address + ", roleId = " + roleId + ", createdUserId = " + createdUserId + ", caretedTime = " + caretedTime + ", updatedUserId = " + updatedUserId + ", updatedTime = " + updatedTime + "}";
}
}
2.创建接口
package mapper;
import java.util.List;
public interface SysUserMapper {
/**
* 添加用户
* @param sysUser
* @return
*/
Integer insertUser(SysUserMapper sysUser);
/**
* 删除用户
* @param id
* @return
*/
Integer deleteUser(Integer id);
/**
* 修改用户信息
* @param sysUser
* @return
*/
Integer updateUser(SysUserMapper sysUser);
/**
* 查询所有用户信息
* @return
*/
List<SysUserMapper> getAllUser();
/**
* 根据id查找用户信息
* @param id
* @return
*/
SysUserMapper getUserById(Integer id);
}
3.创建mapper文件执行sql语句
在resource根目录下创建一个mapper文件夹来存放XxxxxMapper.xml文件(也可以放到别的路径)
下面是我的SysUserMapper.xml文件中的内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.SysUserMapper">
<insert id="insertUser">
INSERT INTO `t_sysuser` (`account`, `realName`, `password`, `sex`, `birthday`, `phone`, `address`,
`roleId`, `createdUserId`, `caretedTime`, `updatedUserId`, `updatedTime`)
VALUES (#{account}, #{realName}, #{password}, #{sex}, #{birthday}, #{phone}, #{address}, #{roleId},
#{createdUserId}, #{caretedTime}, #{updatedUserId}, #{updatedTime});
</insert>
<delete id="deleteUser">
delete
from t_sysuser
where id = #{id}
</delete>
<update id="updateUser">
UPDATE `yyds`.`t_sysuser`
SET `account` = #{account},
`realName` = #{realName},
`password` = #{password},
`sex` = #{sex},
`birthday` = #{birthday},
`phone` = #{phone},
`address` = #{address},
`roleId` = #{roleId},
`createdUserId` = #{createdUserId},
`caretedTime` = #{caretedTime},
`updatedUserId` = #{updatedUserId},
`updatedTime` = #{updatedTime}
WHERE `id` = #{id};
</update>
<select id="getAllUser" resultType="pojo.SysUser">
select *
from t_sysuser
</select>
<select id="getUserById" resultType="pojo.SysUser">
select *
from t_sysuser
where id = #{id}
</select>
</mapper>
4.创建测试类
类名最好是见名知意
下面是添加的代码 !!!(注意,我这里是添加了mysql驱动和junit依赖的)
@Test
public void testInsertOne() throws IOException {
String btd = "2004-06-06";
Date birthday = Date.valueOf(btd);
String a = "2023-08-01 19:52:20";
String b = "2023-08-02 23:12:15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate caretedTime = LocalDate.parse(a, formatter);
LocalDate updatedTime = LocalDate.parse(b, formatter);
SysUser sysUser = new SysUser(null, "admin", "张三", "123456", 1, birthday, "fewafewafew", "湖南长沙", 2, 2, caretedTime, 2, updatedTime);
//获取SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //Resources.getResourceAsStream默认就是从类的根路径下开始查找资源
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//一般情况下都是一个数据库对应一个SqlSessionFactory对象
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();//如果使用的事务管理器是JDBC的话,底层实际上会执行: conn.setAutoCommit(false);
//这种方式实际上是不建议的 因为没有开启事务
//SqlSession sqlSession = sqlSessionFactory.openSession(true);
//执行sql语句 方法中是XxxxMapper.xml文件中insert标签中的id
int insert = sqlSession.insert("insertUser",sysUser);
System.out.println(insert);
//手动提交
sqlSession.commit();//如果使用的事务管理器是JDBC的话,底层实际上还是会执行conn.commit();
//关闭
sqlSession.close();
}
5.工具类
是不是觉得上面的代码太过于繁琐了呢,简单,我们直接将他封装起来
下面是封装的代码
package util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
/**
* mybatis工具类
* @BelongsProject: mybatis
* @BelongsPackage: utils
* @Author: Th
* @CreateTime: 2023-07-18 11:28 周二
* @Description: TODO
* @Version: 1.0
*/
public class SqlSessionUtil {
//工具类的构造方法一般都是私有化的。
//工具类中的所有方法都是静态的,直接采用类名即可调用。不需要new对象。
//为了防止new对象,构造方法私有化。
private SqlSessionUtil(){}
private static SqlSessionFactory sqlSessionFactory;
//类加载时执行
//SqlSessionUtil工具类在进行第一次加载的时候,解析mybatis-config.xml文件。创建SqlSessionFactory对象。
static {
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 获取会话对象
* @return 会话对象
*/
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
}
然后我们就可以简化测试类中的方法了
下面是完整的一套增删改查
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.SysUser;
import util.SqlSessionUtil;
import java.sql.Date;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
* @BelongsProject: mybatis_day1
* @BelongsPackage: PACKAGE_NAME
* @Author: Th
* @CreateTime: 2023-08-04 19:30 周五
* @Description: TODO
* @Version: 1.0
*/
public class TestUser {
@Test
public void testInsert() {
String btd = "2004-06-06";
Date birthday = Date.valueOf(btd);
String a = "2023-08-01 19:52:20";
String b = "2023-08-02 23:12:15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate caretedTime = LocalDate.parse(a, formatter);
LocalDate updatedTime = LocalDate.parse(b, formatter);
SysUser sysUser = new SysUser(null, "admin", "周锦鹏", "123456", 1, birthday, "13838383838", "湖南长沙", 2, 2, caretedTime, 2, updatedTime);
SqlSession sqlSession = SqlSessionUtil.openSession();
int insert = sqlSession.insert("insertUser", sysUser);
System.out.println(insert);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDelete() {
SqlSession sqlSession = SqlSessionUtil.openSession();
int delete = sqlSession.delete("deleteUser", 1);
System.out.println(delete);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdate() {
SqlSession sqlSession = SqlSessionUtil.openSession();
String btd = "2004-06-06";
Date birthday = Date.valueOf(btd);
String a = "2023-08-01 19:52:20";
String b = "2023-08-04 20:12:15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate caretedTime = LocalDate.parse(a, formatter);
LocalDate updatedTime = LocalDate.parse(b, formatter);
SysUser sysUser = new SysUser(2, "sb", "杨俊豪", "yjhssb", 2, birthday, "13838389438", "湖南醴陵", 3, 3, caretedTime, 3, updatedTime);
int update = sqlSession.update("updateUser", sysUser);
System.out.println(update);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testGetAll() {
SqlSession sqlSession = SqlSessionUtil.openSession();
List<SysUser> list = sqlSession.selectList("getAllUser");
list.forEach(user -> System.out.println(user));
sqlSession.close();
}
@Test
public void testGetUser() {
SqlSession sqlSession = SqlSessionUtil.openSession();
SysUser user = sqlSession.selectOne("getUserById", 2);
System.out.println(user);
sqlSession.close();
}
}
以上就是简单的一套mybatis的增删改查
关注博主不迷路,拜拜!😊😊😊