初识框架之mybatis

tiandaochouqin1      2022-04-25     116

关键词:

一、什么是框架

  1)传统 的JDBC编程

    JDBC作为Java语言连接数据库的一个重要的技能点,不可否认的是在一个程序中,如果我们需要多次进行与数据库的交互,那我们所需要的重复操作就就会有很多:

      1.加载数据库驱动

      2.获取数据库连接(Connection),获取Statement对象

      3.使用Statement操作sql语句

      4.如果是查询的话还需要获取一个ResultSet对象,并进行处理才能获取到查询的信息

      5.关闭数据库连接

    而且每次进行数据库交互,都需要进行一次类似与以上5个步骤的操作,这样就会对我们的工作量提升了许多,而且还是没有必要的。除此之外,我们还需要对以上操作不断地进行异常的捕捉,在我们工作的项目一般都很复杂,那么,这些操作是不是可以交给一个类似与第三方的工具进行处理,那我们的工作量不久会减轻好多吗?

  2)持久化与ORM

      1.持久化:持久化就是字面上的意思,很好理解,就是要数据以文件的形式,或者数据库等等方式永久的保存就是所谓的持久化。

        比较官方的解释就是:是程序数据在瞬时状态和持久状态之间转换的过程被称之为持久化。让对象的生存期超越使用对象的程序的运行期。(瞬时状态就是内存中的数据)

      2.ORM(Object Relational Mapping)

        编写程序时,与面向对象的方式处理数据(对象)

        保存数据时,以关系型数据库方式保存数据(表)

  3)框架的含义与好处:(比如我们在写简历的时候通常都会上网找一些模板来写,这时候我们就不需要考录简历的排版问题了,我们只需要把其中的内容填写好。使用框架的原因就类似与它)

 

    •  是一个应用程序的半成品。
    • 提供可重用的公共结构。
    • 按一定规则组织的一组组件
    • 不用再考虑公共性的问题
    • 专心在业务实现上
    • 结构统一,易于学习,维护
    • 新手也可以写出好程序

 

二、MyBatis

  1)MyBatis的构成

    1.SqlSessionFactoryBuilder

      SqlSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory 的,通过它可以构建多个SessionFactory。它的作用仅仅是一个构建器而已,一旦我们构建了SessionFactory,那么它将毫无意义,应立即回收!

    2.SqlSessoinFactory

      SqlSessionFactory的作用是创建SqlSession,而SqlSession相当于一个会话,相当于JDBC中的connection对象,每次应用程序需要访问数据库,我们就要通SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在整个应用的生命周期中。而如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建的SqlSessionFactory会打开更多的数据库连接资源,那么连接资源很开会被耗尽,因此SqlSessionFactory的职责是唯一的。果断的采取单例模式,在应用中使用同一个SqlSessionFactory对象即可

    3.SqlSession

      SqlSession是一个会话,相当于JDBC中的一个Connection对象,它的生命周期应该是在请求数据库处理事务的过程中,SqlSession是线程非安全的对象,涉及多线程时要特别的当心,每次创建的SqlSession对象都要及时的关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能影响很大

  2)使用MyBatis做简单的数据库增删改查

    1.导入jar包(https://github.com/mybatis/mybatis-3/releases)

      以上时官方下载地址,jar包的就导入方式在这里就不做介绍了(每个开发工具都有所不同)

      如果是使用idea的话也可以导入pom节点(https://mvnrepository.com/artifact/org.mybatis/mybatis)

      除了以上的MyBatis所依赖的包之外我们还需要导入JDBC的jar包或者pom,这些都可以在官方或者maven仓库中找到

    2.创建表结构

      技术分享图片

    3.准备resources目录

      1>database.properties文件(不会的就上网找一下,就是几个数据连接参数)

      2>configuration.xml文件(名字随便不是固定的,但是必须是xml文件)

        

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- xml文件的头文件,起到对文件的约束作用(例如:必须存在哪些节点) -->
 3 <!DOCTYPE configuration
 4         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 5         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 6 <configuration>
 7     <!--指向配置文件-->
 8     <properties resource="database.properties"></properties>
 9     <!--声明别名-->
10     <typeAliases>
11         <!--第一种方法-->
12         <!--<typeAlias type="com.cn.Dao.类名" alias="Monkey"></typeAlias>-->
13         <!--第二种方法,这玩意好用,别名就是其类名-->
14         <package name="com.cn.entity"></package>
15     </typeAliases>
16     <environments default="development">
17         <environment id="development">
18             <!--事务管理器:type JDBC or UNSIGNED(托管)-->
19             <transactionManager type="JDBC"></transactionManager>
20             <!--数据源:type jndi pooled unpooled-->
21             <dataSource type="POOLED">
22                 <!--连接数据库的4个连接参数-->
23                 <property name="driver" value="${driver}"></property>
24                 <property name="url" value="${url}"></property>
25                 <property name="username" value="${username}"></property>
26                 <property name="password" value="${password}"></property>
27             </dataSource>
28         </environment>
29     </environments>
30     <!--指向小配置文件xml-->
31     <mappers>
32         <package name="com.cn.Dao"></package>
33     </mappers>
34 </configuration>

    4.设置扫描路径+database.properties

    以上代码中有一个节点<mappers>中指定了一个相对路径,不难发现,这里是指定了xml的路径。但是有一定经验的会发现,idea中xml文件不是不可以在java目录下吗?当然,默认情况下是不可以的,即便是你放到了java目录下也不会被识别,更不要说说是使用了。但是上帝在把一扇门关上的同时自然也会给你打开一扇窗的。只需要在pom.xml文件中加入着呢一个接单就可以了

 

 1 <build>
 2   <resources>
 3     <resource>
 4       <directory>src/main/java</directory>
 5       <includes>
 6         <include>**/*.xml</include>
 7       </includes>
 8     </resource>
 9   </resources>
10 </build>

其中resource的节点就是祈祷这个作用的,resource节点是位于<build>节点下的,把<resource>节点放到该节点下就行了

    5.生成实体类(这个就不用多说了把)

    6.创建dao层的接口,并且声明相对应的方法

    技术分享图片

    7.生成mapper映射文件,起名与接口对应(UserDao.xml)

    

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!--namespace:该属性值为本配置文件所指向的接口的相对路径-->
 6 <mapper namespace="com.cn.Dao.UserDao">
 7     <!--增加语句-->
 8     <insert id="addUser" parameterType="User"><!--这里id为接口中的方法名,parameterType入参的类型(设置了configuration.xml中的别名这里就是该别名了,否则就是全类名)-->
 9         insert into user values(default ,#{name},#{pwd})/*如果接口的入参是对象,那么这里的name和pwd就是对象中的属性名*/
10     </insert>
11     <!--修改语句-->
12     <update id="updateUser" parameterType="User">
13         update user set name=#{name},pwd=#{pwd} where id=#{id}
14     </update>
15     <!--删除语句-->
16     <delete id="delUser" parameterType="int">
17         delete from user where id=#{id}/*如果接口的入参是基本类型,那么这里的id就是其变量名*/
18     </delete>
19     <!--查询语句-->
20     <select id="getUser" parameterType="int" resultType="User">/*resultType是返回值的类型*/
21         select * from user where id=#{id}
22     </select>
23 </mapper>

    8.创建工厂

 1 package com.cn.util;
 2 
 3 import org.apache.ibatis.session.SqlSessionFactory;
 4 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 5 
 6 import java.io.InputStream;
 7 
 8 public class SqlSessionUtil {
 9     private static SqlSessionFactory factory;
10     public static SqlSessionFactory getFactory(){
11         if (factory==null){
12             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
13             //将配置文件configuration.xml,也就是最外层的配置Mybatis的xml文件放转换成流
14             InputStream is = SqlSessionUtil.class.getResourceAsStream("/configuration.xml");
15             //获取工厂
16             factory = builder.build(is);
17         }
18         return factory;
19     }
20 }

上边介绍中说过对于同一个数据库我们只需要一个工厂就可以了,所以在这里我们选择是使用单例模式

    9.基于我们初步使用MyBatis,在这里我们还要创建接口的实现类来完成测试

package com.cn.Dao;

import com.cn.entity.User;
import com.cn.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;


public class UserDaoImpl implements UserDao {
    @Override
    public void addUser(User user) {
        //获取会话(SqlSessoin)对象
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            //把入参传入该会话的insert房中,其中“addUser为接口中的方法名,也就是小配置文件中的id属性”
            session.insert("addUser", user);
            //提交事务
            session.commit();
        } catch (Exception e) {
            //如果发生异常,回滚事务
            session.rollback();
        } finally {
            //最后必须要把此次会话关闭
            session.close();
        }
    }

    @Override
    public void delUser(int id) {
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            session.delete("delUser", id);
            session.commit();

        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
    }

    @Override
    public void updateUser(User user) {
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            session.update("updateUser", user);
            session.commit();
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
    }

    @Override
    public User getUser(int id) {
        SqlSession session = SqlSessionUtil.getFactory().openSession();
        try {
            User getUser = (User)session.selectOne("getUser", id);
            session.commit();
            return getUser;
        } catch (Exception e) {
            session.rollback();
        } finally {
            session.close();
        }
        return null;
    }
}

    10.编写测试方法

    

package com.cn.text;

import com.cn.Dao.UserDao;
import com.cn.Dao.UserDaoImpl;
import com.cn.entity.User;
import org.junit.Test;

public class TextMybatis {
    UserDao ud= new UserDaoImpl();
    @Test
    public void test1(){
        User user=new User(-1,"sjdf","123");
        ud.addUser(user);
    }
    @Test
    public void test2(){
        User user=new User(1,"山间的风","789132");
        ud.updateUser(user);
    }
    @Test
    public void test3(){
        ud.delUser(1);
    }
    @Test
    public void test4(){
        User user = ud.getUser(1);
        System.out.println(user.toString());
    }
}

这里我使用junit单元测试,其中增删改大家自行测试

 

 

      

      

初识mybatis

框架技术  使用框架构建项目,当确定使用哪个技术框架后,就已经有了一个“半成品”,然后在这个半成品上填上内容,完成任务需求。  框架技术的优点:     (1)不用再考虑公共问题,框架已经帮我们... 查看详情

初识mybatis框架,实现增删改查等操作

此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢?这个问题在我的另一篇blogs中有专门的讲解,今天我主要是带着大家来探讨... 查看详情

初识mybatis

MyBatis简介MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供... 查看详情

mybatis-plus——初识mybatis的增强框架mp(代码片段)

文章目录:1.写在前面2.MP的第一个案例1.1insert1.2update1.3delete1.4select1.写在前面在持久层框架中,MyBatis的应用还是比较多的,而且比重在逐渐的上升。通常项目的组合框架是SSM。那么MyBatis之所以火,是因为它的灵活... 查看详情

初识mybatis

MyBatis简介 1.MyBatis的前身是iBatis,本是Apache的一个开源的项目后来加入谷歌之后改名MyBatis 2.MyBatis是一个数据库持久层(ORM)框架,把实体类和SQL语句之间建立了映射关系,是一种半自动的ORM实现。搭建MyBatis开发环境 使用MyBatis的... 查看详情

第6章初识mybatis(代码片段)

6.1什么是MyBatisMybatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。MyBatis框架也被称为ORM(Object/RelationalMapping,即对象关系映射)框架,所谓的ORM就是一种为了解决面向对象与关系型数据库中数据... 查看详情

mybatis基础学习—初识mybatis

一、MyBatis是什么?    MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。    MyBatis是一个优秀的持久层框架... 查看详情

mybatis解读系列-初识

mybaits简单介绍    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。   MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射... 查看详情

初识mybatis(代码片段)

初识MyBatis什么是MyBatisMyBatis是一个支持普通SQL查询、储存过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口... 查看详情

mybatis进阶之自定义mybatis框架(代码片段)

MyBatis进阶之自定义MyBatis框架1.自定义MyBatis框架流程分析2.自定义框架原理介绍3.准备工作:1)创建maven工程Groupid:com.itheimaArtifactId:custom-mybatisPacking:jar2)添加pom依赖:<dependency><groupId>mysql</groupId&g 查看详情

javassm框架之mybatis3mybatis之动态sql

前言:  mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活。创建User表/*Tablestructurefortable`user`*/DROPTABLEIFEXISTS`user`;CREATETABLE`user`(`id`bigint(20)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(20)NOTNU 查看详情

django框架之初识(代码片段)

前言1.什么是Web应用程序?通过Web访问的应用程序,用户只需要有浏览器即可,不需要再安装其他软件应用程序有两种模式:C/S:C/S是客户端/服务器端程序,也就是说这类程序一般独立运行B/S:浏览器端/服务器端应用程序,一... 查看详情

mybatis框架入门

初识mybatis对原生jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理mybatis入门程序用户的增删查改mybatis开发dao两种方法原始dao开发方法(程序需要编写dao接口和dao实现类)mybatis的mapper接口(相当于dao接口)代理开发方法mybatis... 查看详情

mybatis框架之迭代器模式

迭代器模式,一直没用过,也不会用。恰巧MyBatis框架中也使用到了迭代器模式,而且看起来还比较简单,在以后的工作中,若有需要咱们可模仿它的套路来干。直接上代码importjava.util.Iterator;/***@authorClintonBegin*/publicclassPropertyToken... 查看详情

框架学习笔记之mybatis

一、动态sql  通过mybatis提供的标签,实现sql语句的拼接。  1.where<selectid="findUserList"parameterType="user"resultType="user">select*fromuser<!--使用where可以自动处理第一个and--><where><iftest="id!=nullandid!=‘ 查看详情

mybatis框架之适配器模式

MyBatis框架有多处使用了设计模式,我们在阅读其源码时,需要好好体会它对设计模式的使用,以便于照着葫芦画瓢。本篇主要是记录一下适配器模式的使用。适配器模式理解起来很简单,相当于使用了一个接口,将老旧的功能... 查看详情

django初识

Django1Django初识2http协议3web框架4Django简介5Django的路由控制6Django的视图层7Django的模板层8Django的模型层(1)9Django的模型层(2)10Django与Ajax11Django组件之分页器12Django组件之forms组件13Django组件之cookie与session组件14Django组件之用户认证组件... 查看详情

javaorm框架之mybatis篇(ibatis)

...的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系。本系列教程希望您能站在上帝的角度去观察(了解)Java体系。使Java的各种后端技术在你心中模块化;让你在工作... 查看详情