> 文档中心 > javaEE(SSM)-2:Mybatis入门

javaEE(SSM)-2:Mybatis入门

Mybatis简介

一个封装了JDBC对数据库操作的框架,也是一个ORM(对象关系映射)框架。

最主要特点

简化对数据库的操作,并能够将查询结果自动映射到Java的对象POJO(Persistent Object Java Object /Plain(简单) Ordinary(普通的) Java Object ,就是简单的java实体类)

1.理解使用mybatis框架的好处

1.1使用jsp实现对数据库的查询的典型示例(对比效果)

拼接url链接字符串,作为参数获取连接对象拼接SQL语句,作为参数,创建语句对象Statement/PreparedStatement执行SQL,获取结果集对象从结果集中获取不同类型数据,进行转换数据类型在保存关闭对象

1.手动创建数据库连接对象,最后手动关闭数据库对象
2.手动给SQL参数赋值;
3.查询结果需要手动设置到对象的属性
最关键的是:每个servlet中都需要重复的操作—代码冗余

如JSP添加数据和查询数据:

String url="jdbc:mysql://localhost/mybatis?serverTimezone=Asia/Shanghai";try {Connection conn=DriverManager.getConnection(url,"root","root");String sql="insert into customer(username,phone,jobs) values(?,?,?)";PreparedStatement pst=conn.prepareStatement(sql);pst.setString(1, "张三");pst.setString(2, "123339999");pst.setString(3, "工程师");int ret=pst.executeUpdate();pst.close();//查询sql="select * from customer where id=?";pst=conn.prepareStatement(sql);pst.setInt(1, 2);ResultSet rs=pst.executeQuery();if (rs.next()) {Customer c=new Customer();c.setId(rs.getInt("id"));c.setUsername(rs.getString("username"));c.setPhone(rs.getString("phone"));c.setJobs(rs.getString("jobs"));System.out.println(c.getId()+","+c.getUsername());}rs.close();pst.close();conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}

1.2mybatis框架实现:

使用配置文件,不需要手动连接数据;不需要为SQL语句占位符转换类型赋值;获取结果后,不需要手动进行类型转换给java对象赋值;不需要重复创建链接对象、语句对象和释放相关对象。

配置文件,设置数据源(仅需要一次)编写SQL语句执行SQL语句,自动转换数据类型并保存结果

你只需要专注于SQL语句的构建:构建sql语句;传入java对象参数,自动填充到SQL的占位符位置;获取查询结果后,自动实现转换类型给Java对象赋值。

面对的现实:需要付出学习成本。

工作原理图例—解释;配合实际例子理解。

执行映射文件中SQL语句中的真正对象是SqlSession,它提供各种方法实现数据的增删查该方法,根据id查询对应的sql语句(id映射实际的sql),并接收参数填充到sql语句,使用配置的数据源信息,然后将执行结果转换为POJO。

查询id–分析和填充输入参数到对应的sql—执行—根据输出参数类型,包装结果返回

而SqlSession对象由SqlSessionFactory对象的openSession方法提供,该方法主要是在执行SQL语句前的准备工作,主要是是否准备以事务方式执行,以及是否缓存SQL语句、是否批量执行。

SqlSessionFactoryBuilder负责读取和解析XML配置文件,同时根据配置文件还会装载mapper文件,并将解析的结果保存到配置对象Configuraion,最后返回操作配置对象的SqlSessionFactory对象,从配置对象获取mybatis的运行环境、以及sql执行环境(如何执行SQL语句,但其本身并不执行SQL)。

结论:

1.你无须创建连接接对象、语句对象,无须手动关闭这些对象;只需要专注SQL的编写设计、调用即可。

2.由于mybatis的核心对象封装太多细节,你无法知道具体如何根据配置文件内容来执行,为了使项目运行起来,你只需要简单了解对象的创建过程和步骤即可。

2.Mybatis入门示例

【需求】:获取数据库Customer表的记录数。
【目的】:通过创建一个最简单的基于mybatis项目,实现数据库访问,从而理解mybatis工作原理
【提示】:初学会觉得麻烦,熟悉后才会体会到好处
【实现思路】:

1.创建数据库和创建Customer表,以便实现查询。
2.创建maven项目,添加依赖到pom.xml(首次)
3.配置mybatis运行环境(首次)
4.创建SQL映射文件(根据需求重复)
5.测试:执行查询并获取查询结果

2.1 创建数据库和表

使用navicat创建mybatis数据库,并添加一个客户表Customer,Customer表结构如下:.

id int; primary key ;auto_increment //客户IDusername varchar(250) //客户名称jobs varchar(250) //客户职业phone varchar(250) //联系电话

2.2 创建Mybatis的配置文件

2.2.1 创建maven项目,添加依赖pom.xml

项目创建过程:见在eclipse中,Maven项目的创建与配置

在eclipse中,创建一个项目名称为chap1的项目,在pom.xml文件中添加mybatis必须的依赖:

1.mybatis :mybatis框架必须的
2.connector/J:用于数据库操作

<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency></dependencies>

这些依赖,是通过maven 仓库中获的,但至少要知道依赖的名称(artifaceId)和作用
https://mvnrepository.com/ 输入 依赖名,找到排名最高的,复制其pom.xml内容,再粘贴到项目的pom.xml文件的依赖位置。

2.2.2 mybatis的配置文件

在项目的src/main/resource文件夹下,添加mybatis-config.xml文件;该文件夹一般放置配置文件。

操作:对resource文件夹按右键–>new–>other->展开,选择XML:XML File–>输入:mybatis-config.xml–>完成

配置内容如下:

<configuration>     <environments default="mysql">  <environment id="mysql">     <transactionManager type="JDBC" />  <dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver" /><property name="url"value="jdbc:mysql://localhost:3306/mybatis?     serverTimezone=Asia/Shanghai" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments><mappers></mappers></configuration>

当前只需要记住该模版即可;对于你而言,不同的是数据库用户名和密码,其他标记和属性都基本固定不变

这是mybatis运行时所必须的最小配置,告诉mybatis你当前运行的数据库环境是什么,然后就是SQL文件所在的mapper文件(下一步写)的位置

注意拼写要正确!!!最可能的异常,出于拼写。

2.3 创建映射文件

包含所有需要执行的SQL语句的文件;

基于mybatis,你所需要关注的就是要执行的SQL语句写在哪里。

通常:每一个mapper文件,都包含对一个表增删查改的操作;

在src/main/java文件中,添加一个包(不是文件夹,是包package),如本例包名为mapper,通常所有的映射文件mapper都会放在这个包中,进行分类管理。

如果创建的项目看不到src/main/java文件夹,在build path中,选择你更高版本的 JRE,并刷新mava项目

在src/main/java/mapper包中,添加映射文件CustomerMapper.xml,注意,是XML文件!内容如下:

<mapper namespace="mapper.CustomerMapper">        <select id="getCount" parameterType="int" resultType="int">    select count(*) from customer     </select></mapper>

id:执行sql的标识,类似方法名;

parameterType:执行getCount时,传入给sql语句的参数,这里没有,可以不传入,如果有参数,则传入int类型的数据,类似方法参数

resultType:执行getCount后,sql语句返回的结果,需要指定类型,这里简单起见,使用普通类型。

select标记对应sql的select语句,在select标记(注意:是标记)书写你要执行的SQL语句.

强调命名空间作用:通过命名空间区分不同mapper的SQL映射语句中相同的id,类似包作用;同时,在后续介绍:mybatis内部会以命名空间名创建实现类(学完该框架后回头来理解)。

2.4 在配置文件中添加CustomerMapper.xml

找到步骤2.2.2的mybatis-config.xml文件,在mappers标记中输入:

<mappers><mapper resource="mapper/CustomerMapper.xml" /></mappers>

resource的值得是类路径;这里配置主要目的是让myabtis框架在初始化时加载并解析mapper文件。

2.5 执行所定义的SQL语句

要执行CustomerMapper.xml所定义的sql语句,需要建立测试类创建Mybatis的用户接口对象来使用Mybatis,测试类基本都放在src/test/java文件夹中。在src/test/java文件中,添加类MyTest.java,默认包名为chap1。

基本思路:

1.mybatis提供API加载配置文件mybatis-config.xml
2.加载后,使用其构建对象来分析配置文件内容,并编译mapper文件,从而构建会话工厂对象;这样会话工厂对象可以知道当前使用的数据源,即如何连接数据库,知道有哪些mapper接口,如id为getCount的接口方法
3.最后通过会话工厂的openSesson方法获取真正执行SQL语句的对像sqlSession,并返回执行的结果(数据)。

具体实现:

package chap1;import java.io.IOException;import java.io.Reader;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 org.junit.Test;public class MyTest {@Test//测试方法注解 ,如果出现红色波浪线,鼠标停留该处,选择“add JUtil4 to build path”public void test1() throws IOException{ //1.读取配置文件,参数为类路径下的文件 Reader reader=Resources.getResourceAsReader("mybatis-config.xml");//2.构建会话工厂SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(reader);//3.获取会话对象SqlSession sqlSession=ssf.openSession();//4.执行映射的SQL语句int count=sqlSession.selectOne("getCount");//5输出结果System.out.println("count="+count);}}

步骤1-3 ;基本是固定不变的操作

理解执行SQL的过程 :

1.所有mapper文件中定义的SQL语句,都需要SqlSession对象提供的方法来执行;

2.SqlSession对象由SqlSessionFactory对象来获取;

3.而SqlSessionFactory对象要由SqlSessionFactoryBuilder对象的build方法来构建

三者了解即可,都是封装好了的对象,你无法知道它内部如何实现,知道过程即可,以后只需要知道创建mapper文件,编写SQL语句,然后按照上面步骤来执行。

执行:对测试文件按右键:Run as ==>JUnit Tes,开始执行测试函数

结果:在控制台上可以看到输入的记录数。

如何编辑MyBatis的XML文件在离线的时候出现输入提示?

https://blog.csdn.net/yang5726685/article/details/80072954

3.Mybatis更进一步

需求:根据客户id查询客户信息。
目的:如何查询语句传入参数,并获取返回的数据参数—自动映射:字段类型和java类型自动匹配;体验ORM框架好处。

3.1 新增POJO类

POJO类是普通的Java类,也是实体类,即定义的属性,与数据表的字段对应:名称和类型;

这里定义的目的,是保存查询返回的数据。

Customer表的结构:id;username;jobs;phone

POJO类对应的属性:id;username;jobs;phone

具体实现:

在src/main/java中创建pojo包,再在pojo包中添加一个Customer.java类。通常pojo类型与表名一致。

package pojo;public class Customer {int id;String username, jobs, phone;    //自动产生public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getJobs() {return jobs;}public void setJobs(String jobs) {this.jobs = jobs;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}

3.2 修改mapper文件,新增映射语句

修改CustomerMapper.xml文件,添加一个id为getById的SELECT映射语句。

 select count(*) from customer select * from customer where id=#{id} 

参数格式:#{传入的参数} —对于传入参数是普通类型的,#{可以是任意标识名,或者直接使用0}

如果传入的参数是POJO类型,那么 #{POJO属性名名}

resultType:查询结果返回类型,这里需要全限定名,即带包名+类名

3.3 修改测试类

package chap1;import java.io.IOException;import java.io.Reader;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 org.junit.Test;import pojo.Customer;public class MyTest {@Testpublic void test1() throws IOException{ //1.读取配置文件 Reader reader=Resources.getResourceAsReader("mybatis-config.xml");//2.构建会话工厂SqlSessionFactory ssf=new SqlSessionFactoryBuilder().build(reader);//3.获取会话对象SqlSession sqlSession=ssf.openSession();//4.执行映射的SQL语句;//5输出结果//int count=sqlSession.selectOne("getCount"); //System.out.println("count="+count);  //新增测试语句 Customer c=sqlSession.selectOne("getById",1);//参数2 传入SQL的参数String s=c.getUsername()+","+c.getJobs()+","+c.getPhone();System.out.println("客户信息:"+s);}}

selectOne(id名,参数)

结果类似如下:

客户信息:zsssssssssss,zs-jobs,phone

可见,返回值直接为Customer的对象c赋值了,这就是映射结果===字段名自动对应对象的属性名进行自动类型转换和赋值。

项目结构

在这里插入图片描述

重要:按照以上步骤,如果确保在思路和步骤正确前提下,出现异常,基本是拼写问题,需认真检查。