为什么会有mybatis?:
图片来自b站的黑马网课 截图 懒得自己打字了hh 帅气的人都要注明出处
相信在学习框架之前 都学习了JDBC
因为Mybatis可以解决旧的JDBC存在的一些问题
什么是mybatis?:
ORM框架原理:
Mybatis是一个ORM框架,即object relation mapping,对象关系映射架构,让Java的对象与数据库的对象一一对应。能自动保存对象到数据表。
搭建Mybatis的环境:
- 创建工程
- 引入依赖
- 准备数据库
- 编写数据库连接信息配置文件
- 编写核心数据库配置以及映射
创建工程:
idea创建一个maven项目
添加依赖:
在pom.xml 中加入下面的依赖项:
2023年应该都是最新版本的。
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
创建数据库:
create database mybatis;
创建连接配置:
创建
db.properties连接配置
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimeZone=utc&CharacterEncoding=utf8
mysql.username=root
mysql.password=Zxd123456789.
创建核心配置
导入写好的 连接配置
<?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>
<!-- 配置文件信息 -->
<properties resource="properties/db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 从配置文件中加载属性 -->
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.user}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载前面编写的SQL语句的文件 -->
<mapper resource="StudentMapper.xml"/>
</mappers>
</configuration>
到这里环境就搭建完毕了
搭建完毕之后 我们就来 用一下mybatis
mybatis入门程序:
准备数据库:
上面的例子中我们已经创建好了数据库 现在我们新建一张表
create table user
(
id int null,
name varchar(10) null,
age int null,
constraint table_name_pk
primary key (id)
);
create unique index table_name_id_uindex
on table_name (id);
插入数据:
insert into user (id, name, age) values ('0','老李',12)
建立一个包mypojo 在包里新建一个pojo类
让他和数据库的字段一一对应
pojo.java
package mypojo;
public class pojo {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
新建usermapping.xml 在资源resourse下面
这里用来查询
<?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 namespace="mypojo.pojo">
<!--
select 用于查询
id 与接口中方法的名字同名 即调用接口中方法的时候 该方法会找到该配置文件中对应的SQL
resultType 返回值数据类型 或 泛型为该数据类型的集合
-->
<!--查询用户列表 resultType-->
<select id="find" resultType="mypojo.pojo">
//设置唯一的id 与数据类型
select * from user where id =#{id}
</select>
</mapper>
加载sql文件
在核心配置文件mybatis-config.xml里 映射 我们的查询
<mappers>
<!-- 加载前面编写的SQL语句的文件 -->
<mapper resource="usermapping.xml"/>
</mappers>
<?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>
<!-- 配置文件信息 -->
<properties resource="db.properties">
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 从配置文件中加载属性 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载前面编写的SQL语句的文件 -->
<mapper resource="usermapping.xml"/>
</mappers>
</configuration>
测试类:
新建个测试类
test.java
import mypojo.pojo;
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;
import java.io.InputStream;
public class test {
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取核心配置
SqlSessionFactory sqlf = new SqlSessionFactoryBuilder().build(is);
//开启sql
SqlSession sqs = sqlf.openSession();
pojo p= sqs.selectOne("mypojo.pojo.find",1);
//加载sql
System.out.println(p.getName()+p.getAge());
//获取到数据库信息
sqs.close();
//释放资源
//从这里也可以看出 mybatis对于jdbc的补充
}
}
运行结果:
成功获取了信息
亲手做了上面的练习 能很好的看出mybatis的工作原理。
mybatis工作原理:
图是b站黑马的 注明出处 不过这不影响帅气的人自学
由核心配置文件加载映射文件 也就是上面将数据库与Java对象对应起来的文件
然后构造会话工厂 创建会话对象 创建执行器 由 mybatis为我们自动封装映射数据库中的类型到Java对象上
Mybaties配置文件
mybatis-config.xml
下面这个配置文件的顺序是固定的不能随意更改 全部给了注释
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置文件信息 -->
<properties resource="db.properties">
</properties>
<settings>
<setting>//这里配置一些设置</setting>
</settings>
<typeAliases>
<package name=""/>
<!--对Java的实体 进行别名的映射 默认是类名-->
</typeAliases>
<environments default="development">
<!-- 配置环境 事物以及数据源
ts 是配置多个数据库环境
-->
<environment id="development">
<!--单个数据库环境 id 就是默认的数据库环境名-->
<transactionManager type="JDBC"/>
<!--设置事务管理器 -->
<dataSource type="POOLED">
<!--配置数据源 从db的依赖文件中导入-->
<!-- 从配置文件中加载属性 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载前面编写的SQL语句的文件 配置maper sql映射文件-->
<mapper resource="usermapping.xml"/>
<!--
加载映射文件有很多种方式
1.相对路径
2.url绝对路径
3.接口开发 映射文件和接口必须同名 且文件要在同包下 接口的方法名对应映射文件名
4.包扫描
最方便的还是packge包扫描
-->
</mappers>
</configuration>
mybatis动态sql
在之前拼接sql使用的是 程序员去手动的拼接
举个例子:select xx from table where xxx and xxx
非常繁琐 且不方便 而且存在问题 如果条件不成立 关键字就会多余出来
mybatis提供了动态sql拼接
有以下几组标签 来拼接sql
以if和where为例子
这里的select语句 如果按照之前的静态的写法 将会很麻烦 这里我们用where和if 组合起来
进行了条件判断 其他几个标签也可以自行去尝试 语法差不多 有Java基础是可以很快理解的
下面主要将一下 trim标签
tirm
可以看到下面的代码 tirm标签可以代替where 可以添加前缀where 以及自动的去除where后面的and 【根据and和where后面的条件是否成立来决定是否剔除关键字】
update:
用法也是比较简单
在更新语法后
<set>
这里写条件即可
</set>
提供了set标签 当set与if连用 要确保set标签内部不为空 否则会有问题
mybatis查询
数据库关系映射:
1:1 一对一 一个人 一张身份证
1:n 一对多 一个人很多个朋友
m:n 多对多 每个人都会有很多朋友