mybatis框架的概述、搭建和测试
框架?
框架就是:将很多的基础功能进行封装,程序员更关注于业务的开发.
mybatis
背景:原来是apache的一个开源项目,2010年转投谷歌,从3.0x版本开始改名为mybatis.(了解即可)
MyBatis 是一款优秀的java持久层框架。这也就是你给别人说你用到了mybatis框架,就说明你是用Java写的代码.
***解释一下持久层:
持久层字面理解就是要将数据保存下来,我们的数据比如新增了一条学生记录,要把他保存,就需要通过持久层.即将java对象转化到持久状态的那一层,就是把数据保存到数据库的那一层 ,不使用mybatis框架时实现,数据库连接和数据存取的dao层.
持久层也是数据的访问层,也就是Dao (Data accsee Object)
mybatis的优点
·MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及手动获取结果集的操作。
·mybatis可以使用xml进行配置,也可以使用注解进行配置。
·将sql与java进行分离,将sql语句写在xml文件中,便于维护.
·可以将数据库中的数据与java中的对象进行自动映射.(ORM:Object Relational Mapping数据库中的记录:Relational和类中的对象:Object的映射)
·将JDBC中的接口进行封装,提供特定的类来操作,更方便.
·支持动态sql、数据缓存
1.将sql与java进行分离,将sql语句写在xml文件中,便于维护.
sql在组件中进行编写,不再与java代码混在一起,而是用一个映射的xml文件专门用于sql语句的编写,调理清晰:
原来写sql是在JDBC连接的部分用java代码写的,sql是在一个字符串中写的,维护不方便.如图:
2.可以将数据库中的数据与java中的对象进行自动映射.(ORM:Object Relational Mapping数据库中的记录:Relational和类中的对象:Object的映射)
下图是不使用框架时,进行数据库取值(getInt()等方法),然后再通过组件进行赋值(set**()方法),代码量大:
while(rs.next()){
/*在数据库中get到与键(下面代码中的字符串)匹配的值,然后在java中通过set方法将获得的值赋值给类里面的属性*/
Student student = new Student();/*创建Student对象*/
/*在组件中封装的属性和方法例如model中的Student类,其中封装了Student的属性和个属性的get和set方法*/
student.setId(rs.getInt("id"));
student.setNo(rs.getInt("no"));
student.setName(rs.getString("sname"));
student.setGender(rs.getString("gender"));
student.setGname(rs.getString("gname"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
student.setRegTime(rs.getTimestamp("reg_time"));//包括了年月日时分秒
student.setAccount(rs.getString("account"));
/*每查询到一个结果,我们就需要创建一个student对象
并将这个学生对象加到students这个集合中去students.add(student);
*/
students.add(student);
}
如果使用mybatis框架,上面的取值和赋值的复杂过程可以省略,当数据库中的列名和属性名匹配时会形成映射.但是如果两者名字不同,则不能直接映射,例如:
student.setName(rs.getString("sname"));
显然数据库的列名:gname和项目中对象的属性名:gName不同,无法映射.
3.将JDBC中的接口进行封装,提供特定的类来操作,更方便.
在dao层编写接口,定义接口里面的方法,然后实现接口等复杂操作交由框架实现.我们只管用就好了.
4.支持动态sql、数据缓存
mybatis搭建(跟着操作,不要多想,先跟这一步步配置,完成后就容易理解了)
#Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html
在了解完以上背景以及优点后,开始mybatis的搭建:
1.创建一个maven项目
2.在pom.xml中导入mybatis包和mysql驱动包
dependency的解释就是依赖,使用mysql和mybatis需要的jar需要我们自己配置,然后联网下载:
(1)mybatis的jar包导入(使用mybatis框架依赖于响应的jar包)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
(2)导入sql驱动包导入(使用mysql需要依赖相关的jar包)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
导入后的截图:
依赖(dependency)赋值进去之后进行下载相应配置的jar包:
下载完成后就不再报红了,到这一步,使用mybatis框架的第一步基本上完成了,接下来就是进行mybatis的相关配置,再进行下一步:
3.创建 MyBatis 全局配置文件
在resources目录下创建框架的全局配置文件 ,命名为:mybatis.xml(命名并没有约束,但最好起的名字和所用框架相吻合),用于配置全局文件,并且运行时mybatis只读取这一个全局配置文件.
**注:**为了防止思维混乱,在这里说明一下,java提供了mysql的标准接口,但是需要mysql开发商自己来用java实现这些接口,所以我们在java中使用mysql是需要导入mysql相关的实现类,这些实现类在一个jar包里面,我们在使用时导入即可,mybatis的使用也需要jar包,我们同样也需要导入,在学习了maven之后就不需要像之前那样,找到相关的jar包,然后手动的将这个jar包复制到项目中才能够使用,现在只需要在maven官网上找到我们所需要的用到的jar包,然后根据官网提供的相关导入依赖,复制到pom.xml文件当中,点击更新下载即可. 而使用mybatis这个框架,只加载一个全局的配置文件.其他配置文件通过这个配置文件可以实现去访问数据库相关的文件,并且在映射中放置建立映射的地址,从而避免了之前jdbc将java代码和ql语句混在一起的弊端.
具体操作如下:
1.在resources文件夹下,创建一个myatis.xml文件,这是一个配置文件,后缀为.xml,文件名和所使用的的框架保持一致
将下面的配置模板赋值到我们创建好的.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"><!--指的是下面默认的某一个id-->
<!--配置数据的事务管理方式-->
<environment id="development">
<!--数据源配置 type="JDBC" -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED"><!--POOLED数据库连接池-->
<property name="driver" value=""/> //
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
<environment id="work">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
</dataSource>
</environment>
</environments>
接下来需要进行相关信息的更新,解释上述的模板
<dataSource type="POOLED"><!--POOLED数据库连接池-->
<property name="driver" value=""/> //
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
这一部分使我们需要去跟新的,这个标签名property的意思是属性,我们要更新上面的四个属性:
- driver是一个mysql的驱动,相当于之前的Class.forName(“com.mysql.cj.jdbc.Driver”);用于驱动mysql,
我们给driver的value值就是:value=“com.mysql.cj.jdbc.Driver”;
- url是资源定位:jdbc:mysql://127.0.0.1:3306/web_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
- username就是account账号,我设置的数据库账号时root
- password就是密码,设置的密码是root,读者根据自己的设置连接数据库
租后配置好的结果就是:
<?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配置,是一个根标签
<configuration>
//环境
<environments default="development"> //系统默认应用id="development"的环境配置
<environment id="development">
<transactionManager type="JDBC"/> //事务管理器的类型是JDBC
<dataSource type="POOLED"> //数据资源类型是一个数据库连接池
<property name="driver" value="com.mysql.cj.jdbc.Driver"/> //驱动
<property name="url" value="jdbc:mysql://127.0.0.1:3306/web_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"/> //连接地址
<property name="username" value="root"/> //账号
<property name="password" value="root"/> //密码
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
- transactionManager标签是一个事务管理程序,这个不需要做过多的解释,就是这个框架管理的事务就是一个数据库,连接数据库使用的是JDBC,它的事务管理类型就是JDBC
- dataSource数据资源的类型是一个数据库连接池,我们在不是mybatis框架的时候,需要创建连接Connection
Connection connection = DriverManager.getConnection(url,"root","root");
,每次请求到数据库之后,都需要建立connection对象,负责java与数据库的交互,现在使用的是一个数据库连接池,吃的概念就是里面已经有若干个connection对象,来了一个JDBC请求之后直接进入池找到一个空闲对象使用即可,不用每次交互都创建连接对象,并且池里面的connection对象不会去销毁,以下是JDBC和使用数据库连接池的对比:
以上mybatis框架的基本搭建就完成了,接下来就是检验这个框架,也可以理解为怎么来使用这个看框架。
测试mybatis
mybatis的搭建里面需要解释的几个点上面已经做了简单的介绍,有些地方不懂很正常,重要的是跟着搭建起来,往后多用几次,多搭建几次就熟悉并理解了.
下面进行mybatis的使用测试,前期需要明确以下几点:
-
开始我们就说了mybatis是一个持久层框架(Dao层),并且通俗解释了持久层的概念.所以这个框架简化了Dao层的操作
-
理清原来不使用框架的时候有哪些缺点;工作量大,我们需要做大量底层并且基础的操作,比如从mysql中一个个get数据,好不容易get完了,还需要再set进我们java中相关组件对象的属性中去
属性还不算多的时候,如果属性量更大的话,不仅写代码繁琐,也增加了出错的概率.
- java和sql语句混合在一起,我们使用框架就可以使java组件中的属性和sql中的属性列形成映射,并不混杂在一起.
清楚了以上的内容后我们来进行测试的前期准备工作:
-
在左侧main目录中的java文件夹下创建package,我自己创建的如下:
在java包一级一级创建在,在dao的package中创建UserDao接口,这个类前面有一个飞鸟,先不要管,它是一个插件,我们最后再来导入.
UserDao接口中的内容如下:
package com.ffyc.mybatispro.dao;
import com.ffyc.mybatispro.model.User;
/*现在的dao中就写的不是jdbc连接了,是一些接口*/
public interface UserDao {
/*定义了一个功能*/
User findUserById(int id);
}
接口中有一个User 类型的findUserById(int id)方法(功能):即通过id来找User的一个方法.
model包中是两个类: 1.User类 2.Grade类:
User类
package com.ffyc.mybatispro.model;
public class User {
private int id;
private String account;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", account='" + account + '\'' +
", password='" + password + '\'' +
'}';
}
}
Grade类
package com.ffyc.mybatispro.model;
public class Grade {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Grade{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
这是两个来封装和数据库中相对应的基本表的各个属性以及对应属性的get和set方法的类(组件)
这两个封装好的类和数据库中的基本表之间的映射简化了从数据库get,然后set到和数据库中表相对应的类的属性当中,通过System.out.println(要输出的内容)打印显示.框架通过映射把get和set做了.
1.创建 sql 映射文件(可以理解为创建一个写SQL语句的文件)
使用框架的优点之一就是将java代码可mysql数据库的sql语句分开,是调理更清晰.并且mybatis是一个dao问的框架,简化dao层操作.
如何创建一个sql的映射文件?
- 在resources文件夹下建立一个mapper文件夹,做到见名知意,这个mapper文件夹用于存放sql的映射,我们先建立两个映射,一个年级映射(GradeMaper.xml),一个用户映射(Usermapper.xml),注意两个映射都是xml类型的映射.
- 建立好mapper的package之后,创建文件(File):GradeMapper.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标签中的部分用来写sql-->
<!--sql映射文件 namespace="地址空间",地址空间它是一个唯一标识.namespace名字必须与接口的类路径一致-->
<mapper namespace="com.ffyc.mybatispro.dao.UserDao">
<!--以下的select标签就是sql的查询操作-->
<!--id名,必须要与接口中的方法名相同 参数返回值都一致,相匹配-->
<select id="findUserById" parameterType="int" resultType="User">
/*原来的路径很长,现在进行了简化*/
select id,password,account from user where id = #{id}
</select>
</mapper>
地址空间的路径就是我们通过这个路径进行sql查询的具体操作:
通过spacename路径找到响应的原来的dao层,只不过使用框架之后,现在的dao层不再是由程序员进行具体的操作(例如在mysql中查数据get,然后在通过set写数据),我们在dao层只需要写响应的接口.
在java文件夹中,创建一个package,命名为dao,表示dao层,在这个文件夹下创建 UserDao接口,具体如下
2.创建测试类
package com.ffyc.mybatispro.test;
import com.ffyc.mybatispro.dao.UserDao;
import com.ffyc.mybatispro.model.Grade;
import com.ffyc.mybatispro.model.User;
import com.ffyc.mybatispro.util.MybatisUtil;
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 Test3 {
public static void main(String[] args) throws IOException {
String resource = "mybatis.xml";
//读取mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
/*
构造出一个SqlSessionFactory对象,用来创建SqlSession对象,
在一个项目中由于SqlSessionFactory创建开销较大,一个项目中只创建一个,
*/
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
/*
创建SqlSession对象,用来每次与数据库交互的,用完即关闭.
*/
SqlSession sqlSession = sqlSessionFactory.openSession();
Grade grade = sqlSession.selectOne("com.grade.findGrade", 1);
System.out.println(grade);
sqlSession.close();
}
}
读取配置文件
String resource = “mybatis.xml”;
//读取mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
构造出一个SqlSessionFactory对象,用来创建SqlSession对象,在一个项目中由于SqlSessionFactory创建开销较大,一个项目中只创建一个,
创建 SqlSession (sql会话)
SqlSession sqlSession = sessionFactory.openSession();
Sqlsession 中的方法:
sqlSession.selectOne(namespace,参数); 选择其中的一个会话,有两个参数,第一个是对应的sql的地址空间,可以唯一找到要执行的sql,和响应键值对的键.
sqlSession .close();关闭
2.配置映射
使用mybatis框架和直接在dao进行jdbc配置的区别是:&位置会报错,需要在&后面加上amp; 才可以.
url:*url指的是统一资源定位系统。*url是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。URL = HTTP协议 + 域名 + 路径 + 查询参数 + 锚点。也就是标识网页或者其他资源的地址.
我们假设一个应用场景:在mysql中查询一个年级的信息,传入一个id将数据库中的一行信息返回回来改如何做?
创建 sql 映射文件就是下面的创建mapper映射文件
还需要在resources目录下建立一个mapper映射文件,mapper映射文件是有很多的,一个表就需要在java中与一个model组件里的类产生映射,比如在model中的Student类就需要与mysql中的student表建立映射
<?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="com.grade">
<!--这以部分用来写sql-->
<!-- resultType="com.ffyc.mybatispro.model.Grade"
这部分传递了一个类的地址,根据这个类的地址,通过反射机制,会创建这个类的对象
由于在数据库中的类列名与Grade类中的属性名是完全一样的,通过mybatis框架会实现一个自动的封装-->
<select id="findGrade" parameterType="int" resultType="com.ffyc.mybatispro.model.Grade">
select * from grade where id = #{id}
</select>
</mapper>
<select id="findUserById" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
这个select标签中的参数:id要和接口中的方法名相同;参数类型:就是方法中的参数类型;结果类型:就是方法的返回值类型.
以上就完成了,可以启动测试类测试一下.
总结一下流程:
搭建:
创建maven项目
加入框架依赖的jar的坐标,mysql驱动
连接数据库信息
sql映射文件
创建数据库表
创建model类
创建sql映射文件
命名空间=“接口类路径”
<select id=“接口中的方法名相同” 参数类型 返回值类型>
标签里面写sql
创建访问接口
定义方法名,参数,返回值;
使用mybatis:
读取配置mybatis 的配置文件:mybatis.xml文件
创建SqlSessionFactory,创建SqlSession,只创建一次,因为创建的开销比较大.
SqlSessionFactory.openSession() 创建sqlSession
SqlSession的作用就是创建数据库与sql之间的会话,使用时创建,使用完关闭