文章目录
一、框架概述
1.1 MyBatis
MyBatis相当于JDBC的增强版
1.2 软件开发常用架构
三层架构
界面层(视图层):接收用户的数据,显示请求的处理结果(html,jsp,servlet等)
业务逻辑层:接收界面层传递来的数据,检查数据,调用数据访问层获取数据
数据访问层(持久层):完成数据库的操作(增删改查)
三层对应的包:
界面层:controller包(servlet)
业务逻辑层:service包
数据访问层:dao包
三层类的交互
界面层->业务逻辑层->数据访问层->数据库
三层对应的处理框架
界面层—servlet—SpringMVC框架
业务逻辑层—service类—Spring框架
数据访问层—dao类—mybatis框架
1.3 框架是什么?
框架是一个舞台,也是一个模板(简历,保险单等)
模板中已经规定好了一些条款和内容,里面填自己的东西
框架中定义好了一些功能,可以加入项目中的功能,这些功能可以利用框架中写好的功能
框架类似于一个半成品的软件,这个软件里已经定义好了一些基本的功能,加入所需要的功能即可,这些基础功能是可复用,可升级的
1.4 框架的特点
1)框架一般不是全能的,不能做所有事情
2)框架只针对某个领域有效。比如mybatis只针对数据库操作
1.5 JDBC缺陷
代码多,效率低
重复代码多
需要实现Connection,Statement,ResultSet对象的创建和销毁
业务代码和数据库操作混合
1.6 mybatis概述
mybatis早期叫做ibatis,是sql映射框架
1)sql mapper:sql映射
可以把数据库表中的一行数据映射为一个Java对象
一行数据可以看作是一个Java对象,操作这个对象就相当于操作表的数据
2)data access object(DAO):数据访问,对数据库执行增删改查
1.7 mybatis的功能
1)提供了创建Connection,Statement和ResultSet的能力
2)提供了执行sql语句的能力
3)提供了循环sql,将sql语句的结果转换为Java对象(List集合)的能力
4)提供了关闭资源的能力
开发人员要提供sql语句-mybatis处理sql-开发人员得到List集合或java对象
1.8 总结
mybatis是一个sql映射框架,提供了数据库的操作能力,是增强的JDBC。使用mybatis让开发人员只写sql语句就可以了,不必关心Connection,Statement,ResultSet的创建,销毁和sql语句的执行
二、Mybatis使用步骤
2.1 创建第一个mybatis
步骤
(1)新建一个表并插入数据
CREATE TABLE `t_test` (
`id` int NOT NULL,
`name` varchar(80) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
表中数据:
(2)在pom.xml文件中加入Maven的Mybatis坐标,以及MySQL驱动的坐标
<!--加入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--加入MySQL驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
(3)创建实体类Test,用于保存表中的一行数据
//用于保存t_test表中一列数据的类
public class Test
{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Test{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
(4)创建持久层的DAO接口,定义操作数据库的方法
import java.util.List;
//定义操作test表的接口
public interface TestDao
{
//查询test表中所有数据的方法
public List<Test> selectTests();
}
(5)创建Mybatis使用的配置文件,sql映射文件,用于写sql语句,一般一个表一个sql映射文件,这个文件的后缀名是.xml
这个文件写在DAO接口所在的目录中,文件的名称与接口保持一致
<?xml version="1.0" encoding="UTF-8" ?>
<!--
当前文件为sql映射文件
可以在里面编写sql语句
-->
<!--
1.指定约束文件
mybatis-3-mapper.dtd是约束文件名称,扩展名是dtd的
2.约束文件的作用
限制,检查当前文件中出现的标签和属性是否满足mybatis规范
-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
3.mapper:当前文件的根标签,是必须值
4.namespace:命名空间的,是唯一值,可以自定义标签的字符串,要求使用dao的全限定名称
-->
<mapper namespace="HelloMybatis.TestDao">
<!--
5.当前文件中,可以使用特定的标签,表示数据库的特定操作
<select>表示查询,里面放的是select语句
<update>表示更新数据库的操作:写update语句
<insert>表示插入操作,写insert语句
<delete>表示删除,执行的是delete语句
-->
<!--
select:表示查询操作
id:要执行的sql语句的唯一标识,mybatis会使用这个id的值找到要执行的sql语句
这个id可以自定义,但要求使用接口中的方法名称
resultType:遍历sql语句执行后得到的ResultSet之后得到的Java对象的类型
值写的是类型的全限定名称
-->
<select id="selectTests" resultType="HelloMybatis.Test">
select * from t_test ORDER BY id;
</select>
</mapper>
(6)创建mybatis的主配置文件,一个项目中只有一个,主配置文件提供了数据库中的连接信息和sql映射文件的位置信息
<?xml version="1.0" encoding="UTF-8" ?>
<!--
当前文件为mybatis的主配置文件
主要定义了数据库的配置信息,sql映射文件的位置等
-->
<!--
1.约束文件名称:mybatis-3-config.dtd
-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--
2.configuration:根标签
-->
<configuration>
<!--
3.环境配置:数据库的连接信息
default的值必须和某个environment的id相同,告诉mybatis要使用哪个数据库的信息
即要访问哪个数据库
-->
<environments default="development">
<!--
4.environment:一个数据库信息的配置
5.id:一个自定义的唯一值,用于表示环境的名称
-->
<environment id="development">
<!--
6.transactionManager:mybatis的事务类型
type:JDBC(表示使用jdbc中Connection对象的commit,rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--
7.dataSource:表示数据源,用于连接数据库的
type:用于表示数据源的类型
POOLED:表示使用连接池的
-->
<dataSource type="POOLED">
<!--
8.driver,url,username,password是固定的,不能自定义
-->
<!--数据库的驱动类名-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatistest?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true"/>
<!--访问数据库的用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="123456ac"/>
</dataSource>
</environment>
</environments>
<!--
9.用于指定sql映射文件(sql mapper)的位置
-->
<mappers>
<!--
一个mapper标签指定一个文件的位置
从类路径开始的路径信息:位于target/classes(类路径)之后的路径
-->
<mapper resource="HelloMybatis/TestDao.xml"/>
</mappers>
</configuration>
(7)创建使用mybatis的类,通过mybatis去访问数据库
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.InputStream;
import java.util.List;
public class MyApp
{
public static void main(String[] args) throws Exception
{
//访问mybatis读取t_test中的数据
//1.定义mybatis主配置文件的名称,从类路径的根开始(target/classes之后的)
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识
//sql映射文件中的namespace+"."+标签的id值
String sqlId = "HelloMybatis.TestDao" + "." + "selectTests";
//7.执行sql语句,通过sqlId找到语句
List<Test> testList = sqlSession.selectList(sqlId);
//8.输出结果
testList.forEach(test -> System.out.println(test));
//9.关闭sqlSession对象
sqlSession.close();
}
}