MyBatis的三层架构

Posted lflikyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis的三层架构相关的知识,希望对你有一定的参考价值。

MyBatis的三层架构

1.界面层:用来接收客户端的输入,调用业务逻辑层进行功能处理,返回结果给客户端,过去的servlet就是界面层的功能。
2.业务逻辑层:用来进行整个项目的业务逻辑处理,向上为界面层提供处理结果,向下问数据访问层要数据。
3.数据访问层:专门用来进行数据库的增删改查操作,向上为业务逻辑层提供数据。

各层之间的调用顺序是固定的,不允许跨层访问:
界面层<----->业务逻辑层<----->数据访问层

为什么要使用三层?

1.结构清晰、耦合度低,各层分工明确。
2.可维护性高,可扩展性高。
3.有利于标准化。
4.开发人员可以只关注整个结构中的其中某一层的功能实现。
5.有利于各层逻辑的复用。

常用的SSM框架

Spring:它是整合其他框架的框架,它的核心是IOC和AOP,它由多个模块构成,在很多领域都提供了很好的解决方案。
SpringMVC:它是Spring家族的一员,专门用来优化控制器(servlet)的,提供了极简单的数据提交,数据携带,页面跳转功能。
MyBatis:是持久化的一个框架,用来进行数据库访问的优化,专注于sql语句,极大的简化了jdbc的访问。

什么是框架

它是一个半成品软件,将所有的公共的,重复的功能解决掉,帮助程序快速高效的进行开发,它是可复用,可扩展的。

MyBatis框架基础

框架

框架概述

软件开发常用结构

三层架构

三层架构包含的三层:
界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)

三层的职责

1、界面层(表示层、视图层):主要功能是接收用户的数据,显示请求的处理结果。使用web页面和用户交互,手机app也就是表示层的,用户再app中操作,业务逻辑在服务器端处理。(jsp,html,servlet)

2、业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。

3、数据访问层:与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库中

三层对应的包

界面层:controller包(servlet)

业务逻辑层:service包(XXXService类)

数据访问层:dao包(XXXDao类)

三层的处理请求的交互:
用户–>界面层–>业务逻辑层–>数据访问层–>DB数据库

三层对应的处理框架

界面层----servlet----springmvc(框架)

业务逻辑层----service类----spring(框架)

数据访问层----dao类----mybatis(框架)

框架

框架是一个舞台,一个模板

模板:

1、规定好了一些条款,内容

2、加入自己的东西

框架是一个模板

1、框架中定义好了一些功能,这些功能是可用的。

2、可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。

简单的说框架其实就是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架是一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。

框架安全的,可复用的,不断升级的软件

框架的特点:

1、框架一般不是全能的,不能做所有事情

2、框架是针对某一个领域有效。特长在某一个方面,比如mybatis做数据库操作强,但是它不能做其他的。

3、框架是一个软件

JDBC的缺陷

1、代码比较多,开发效率低

2、需要关注Connection,Statement,ResultSet对象创建和销毁

3、对ResultSet查询的结果,需要自己封装为List

4、重复的代码比较多些

5、业务代码和数据库的操作混在一起

mybatis框架

一个框架,早期叫做ibatis,代码在github上

mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)

1)sql mapper:sql映射

​ 可以把数据库表中的一行数据 映射为一个Java对象。

​ 一行数据可以看做一个Java对象,操作这个对象,就相当于操作表中的数据

2)data access object(DAOs):数据访问,对数据库执行增删改查。

mybatis提供了哪些功能:

1、提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了

2、提供了执行sql语句的能力,不用你执行sql

3、提供了循环sql,把sql的结果转为Java对象,List集合的能力

while(rs.next())
	Student stu=new Student();
    stu.setId(rs.getInt("id"));
    stu.setName(rs.getString("name"));
    stu.setAge(rs.getInt("age"));
    //从数据库取出数据转为Student对象,封装到List集合
    stuList.add(stu);

4、提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet

开发人员做的是:提供sql语句

最后是:开发人员提供sql语句–mybatis处理sql—开发人员得到List集合或Java对象(表中的数据)

总结:
mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC,

使用mybatis让开发人员集中精力写sql就行了,不必关系Connection,Statement,ResultSet的创建,销毁,sql的执行。

mybatis使用步骤

ch01-hello-mybatis:第一个入门的mybatis例子

实现步骤:

1、新建的student表

2、加入maven的mybatis坐标,mysql驱动的坐标

3、创建实体类,Student—保存表中一行数据

4、创建持久层的dao接口,定义操作数据库的方法

5、创建一个mybatis使用的配置文件

​ 叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件

​ 这个文件是xml文件。

​ 1、写在接口所在的目录中,
​ 2、文件名称和接口保持一致

6、创建mybatis的主配置文件:

​ 一个项目就一个主配置文件。

​ 主配置文件提供了数据库的连接信息和sql映射文件的位置信息

7、创建使用mybatis类

​ 通过mybatis访问数据库

sql映射文件

<?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="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #id
  </select>
</mapper>

sql映射文件:写sql语句的,mybatis会执行这些sql

1、指定约束文件

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

mybatis-3-mapper.dtd:是约束文件的名称,扩展名是dtd的。

2、约束文件的作用:限制,检查,在当前文件中出现的标签,属性必须符合mybatis的要求

3、mapper 是当前文件的根标签,必须的

​ namespace:叫做命名空间,唯一值的,可以自定义的字符串

​ 要求你使用dao接口的全限定名称。(接口的绝对路径)

4、在当前文件中,可以使用特定的标签,表示数据库的特定操作。

<select>:表示执行查询 , select语句

<update>:表示更新数据库的操作,就是说在<update>标签中 写的update sql语句

<insert>:表示插入,放的是insert语句

<delete>:表示删除,执行的delete语句

标签中的属性

select表示查询操作

id:你要执行的sql语句的唯一标识,mybatis会使用这个id的值来找到药执行的sql语句可以自定义,但是要求你使用接口中的方法名称。

resultType:表示结果类型的,是sql语句执行后得到的ResulSet,遍历这个ResultSet得到的Java对象的类型

值写的是类型的全限定名称

mybatis主配置文件

<?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">
        <environment id="development">
            <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="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置

1、约束文件

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

mybatis-3-config.dtd:约束文件的名称

2、configuration:根标签

环境配置:数据库的连接信息

<environments default="development">
    	<!--environment:一个数据库信息的配置,环境
			id:一个唯一值,自定义,表示环境的名称-->
        <environment id="development">
            <!--
			transactionManager:mybatis的事务类型
			type:JDBC(表示使用JDBC中的Connection对象的commit,rollback做事务处理)
-->
            <transactionManager type="JDBC"/>
            <!--dataSource:表示数据源,连接数据库的
				type:表示数据源的类型,POOLED表示使用连接池-->
            <dataSource type="POOLED">
                <!--driver,user,username,password 是固定的,不能自定义-->
                <!--数据库的驱动类名-->
                <property name="driver" value="$driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="$url"/>
                <!--访问数据库的用户名称-->
                <property name="username" value="$username"/>
                <!--访问数据库的密码-->
                <property name="password" value="$password"/>
            </dataSource>
        </environment>
    </environments>

default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。访问哪个数据库

<!--    sql mapper(sql映射文件)的位置-->
    <mappers>
<!--        一个mapper标签指定一个文件的位置
            从类路径开始的路径信息。 target/clasess(类路径)-->
        <mapper resource="com\\hr\\qjb\\dao\\StudentDao.xml"/>
    </mappers>
</configuration>

测试类

public class MyApp 
    public static void main(String[] args) throws IOException 
        //访问mybatis读取student数据
        //1、定义mybatis主配置文件的名称,从类路径的根开始
        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对象,从SqlSessionFactory中获取SqlSession
        SqlSession sqlSession =factory.openSession();
        //6、指定要执行sql语句的标识。sql映射文件中的namesapce+"."+标签的id值
        String sqlId="com.hr.qjb.dao.StudentDao"+"."+"selectStudents";
        //7、执行sql语句,通过sqlId找到语句
        List<Student> studentList =sqlSession.selectList(sqlId);
        //8、输出结果
        //for (Student student : studentList) 
            //System.out.println(student);
        //
        //lambda表达式语法
        studentList.forEach(student -> System.out.println(student));
        //9、关闭SqlSession对象
        sqlSession.close();
    

如果xml文件没有到target文件下解决方案

1、第一种:点击右边maven Lifecvcle中的clean清除一下target,再点击compile,编译一下

2、第二种:点击左上角的Build,点击Rebuild project,在执行一下代码

3、第三种:直接将配置文件拷贝到target相应的目录下

查询数据库实例

首先创建Dao接口,并且定义查询方法

StudentDao

public interface StudentDao 
    //查询student表的所有数据
    public List<Student> selectStudents();

创建实体类,用来接收数据库中的每一条数据

Student

//推荐和表名一致,容易记忆
public class Student 
    //定义属性,目前要求是属性名和列名一致
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    public Integer getId() 
        return id;
    
    public void setId(Integer id) 
        this.id = id;
    
    public String getName() 
        return name;
    
    public void setName(String name) 
        this.name = name;
    
    public String getEmail() 
        return email;
    
    public void setEmail(String email) 
        this.email = email;
    
    public Integer getAge() 
        return age;
    
    public void setAge(Integer age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "Student" +
                "id=" + id +
                ", name='" + name + '\\'' +
                ", email='" + email + '\\'' +
                ", age=" + age +
                '';
    
    public Student(Integer id, String name, String email, Integer age) 
        this.id = id;
        this.name = name;
        this.email = email;
        this.age = age;
    
    public Student() 
    

编写StudentDao.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">
<!--3、mapper  是当前文件的根标签,必须的
	  namespace:叫做命名空间,唯一值的,可以自定义的字符串
				要求你使用dao接口的全限定名称。(接口的绝对路径)-->
<mapper namespace="com.hr.qjb.dao.StudentDao">
    <!--select表示查询操作
id:你要执行的sql语句的唯一标识,mybatis会使用这个id的值来找到药执行的sql语句可以自定义,但是要求你使用接口中的方法名称。
resultType:表示结果类型的,是sql语句执行后得到的ResulSet,遍历这个ResultSet得到的Java对象的类型
值写的是类型的全限定名称-->
    <select id="selectStudents" resultType="com.hr.qjb.domain.Student">
            select id,name,email,age from student order by id
    </select>
</mapper

配置mybatis.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">

<!--        mybatis-3-config.dtd:约束文件的名称
            2、configuration:根标签
            环境配置:数据库的连接信息
            -->
<configuration>
<!--    settings:控制mybatis全局行为-->
    <settings>
<!--        设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
<!--default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。访问哪个数据库-->
    <environments default="mydev">
        <!--environment:一个数据库信息的配置,环境
			id:一个唯一值,自定义,表示环境的名称-->
        <environment id="mydev">
            <!--
			transactionManager:mybatis的事务类型
			type:JDBC(表示使用JDBC中的Connection对象的commit,rollback做事务处理)
-->
            <transactionManager type="JDBC"/>
            <!--dataSource:表示数据源,连接数据库的
				type:表示数据源的类型,POOLED表示使用连接池-->
            <dataSource type="POOLED">
                <!--driver,user,username,password 是固定的,不能自定义-->
                <!--数据库的驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                <!--访问数据库的用户名称-->
                <property name="username" value="root"/>
                <!--访问数据库的密码-->
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

    </environments>

<!--    sql mapper(sql映射文件)的位置-->
    <mappers>
<!--        一个mapper标签指定一个文件的位置
            从类路径开始的路径信息。 target/clasess(类路径)-->
        <mapper resource="com\\hr\\qjb\\dao\\StudentDao.xml"/>
    </mappers>
</configuration>

最后测试类

MyApp

public class MyApp 
    public static void main(String[] args) throws IOException 
        //访问mybatis读取student数据
        //1、定义mybatis主配置文件的名称,从类路径的根开始
        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对象,从SqlSessionFactory中获取SqlSession
        SqlSession sqlSession =factory.openSession();
        //6、指定要执行sql语句的标识。sql映射文件中的namesapce+"."+标签的id值
        String sqlId="com.hr.qjb.dao.StudentDao.selectStudents";
        //7、执行sql语句,通过sqlId找到语句
        List<Student> studentList =sqlSession.selectList(sqlId);
        //8、输出结果
        //lambda表达式语法
        studentList.forEach(student -> System.out.println(student));
        //9、关闭SqlSession对象
        sqlSession.close();
    

重要的是获得SqlSession对象,通过用SqlSession对象中的方法去获得查询结果

插入数据库实例

首先接口类中定义插入方法

    //插入方法
    //参数student,表示要插入到数据库的数据
    //返回值:int , 表示执行insert操作后的 影响数据库的行数
    public int insertStudent(Student student);

在StudentDao.xml中的配置文件中加入插入语句

values中的参数是Student类中的属性,用#xxx包起来

<!--    插入操作-->
    <insert id="insertStudent">
        insert into student values(#id,#name,#email,#age);
    </insert>

下面时测试类

TestMyBatis

public class TestMyBatis 

        public static void main(String[] args) throws IOException 
            //访问mybatis读取student数据
            //1、定义mybatis主配置文件的名称,从类路径的根开始
            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对象,从SqlSessionFactory中获取SqlSession
            SqlSession sqlSession =factory.openSession();
            //6、指定要执行sql语句的标识。sql映射文件中的namesapce+"."+标签的id值
            String sqlId="com.hr.qjb.dao.StudentDao.insertStudent";
            //创建Student实体类对象,为属性赋值,可以用有参构造器,也可以用set方法
            Student student = new Student(1005,"张飞","zhangfei@qq.com",1200);
			//返回的参数是影响的行数,参数sqlId是方法的路径,student是传入的sql语句中的参数
            int nums = sqlSession.insert(sqlId, student);
            //默认不是自动提交事务的,所以在insert , update, delete后要手工提交事务
            sqlSession.commit以上是关于MyBatis的三层架构的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis框架基础

MyBatis框架基础

MyBatis框架基础

java里分的三层到底是哪三层?

Mybatis

Mybatis