框架

框架(Framework)是一种编程模型,是一组相互协作的类和工具集合,它们一起提供了一种通用的方法来解决特定领域中的问题。框架一般会提供一些预定义的解决方案和编程范例,开发人员可以基于这些方案和范例来快速构建自己的应用程序,同时还可以减少重复代码,提高开发效率和代码质量。

框架可以是基于某个编程语言或者特定平台的,比如Java EE、.NET等等。它们可以为开发人员提供一系列的工具和函数库,帮助他们快速开发、测试和部署应用程序。同时,框架还能提供一些标准化的结构和流程,使得应用程序在不同开发团队之间能够更加一致和可维护。

框架的使用可以大大提高开发效率和代码质量,因为它们能够解决一些通用性的问题,同时还能使代码更加易于维护和升级。然而,框架也有一些限制和约束,开发人员需要遵循框架的规范和约定来编写应用程序。

Mybatis框架背景

MyBatis是一种Java持久化框架,它可以将SQL查询和结果映射到Java对象中,从而实现Java对象与关系型数据库的映射。使用MyBatis可以避免手写JDBC代码,简化数据访问层的开发。

MyBatis最初是由Apache软件基金会下的iBATIS项目发展而来的。后来,iBATIS更名为MyBatis,并于2010年成为一个独立的开源项目,现在由MyBatis团队维护和开发。

MyBatis提供了许多高级特性,包括动态SQL,缓存机制,延迟加载等等。它也支持多种数据源,包括关系型数据库和NoSQL数据库等。 MyBatis被广泛应用于Java项目中,是Java持久化框架中的一员,并被认为是一个简单易用的ORM框架。

使用Mybatis框架的原因

使用MyBatis框架的主要原因包括:

  1. 简化开发:MyBatis可以大大简化数据访问层(DAO)的开发,避免了手写JDBC代码的繁琐,同时也减少了出错的可能性。

  2. 灵活性:MyBatis提供了许多高级特性,包括动态SQL、缓存机制、延迟加载等等。它允许开发人员根据具体的需求进行自定义配置,从而使得开发过程更加灵活。

  3. 易于维护:MyBatis的数据访问层代码通常比较简洁明了,易于阅读和维护。同时,MyBatis也提供了一些工具来简化开发、调试和测试的过程,如MyBatis Generator等。

  4. 性能优越:MyBatis的SQL语句是预编译的,可以提高数据库的执行效率。同时,MyBatis也支持缓存机制,可以避免频繁的数据库访问,提高应用程序的性能。

  5. 多数据源支持:MyBatis支持多种数据源,包括关系型数据库和NoSQL数据库等。这使得开发人员可以更加方便地切换不同的数据源,同时也降低了应用程序的耦合性。

综上所述,MyBatis框架具有简化开发、灵活性、易于维护、性能优越以及多数据源支持等优点,因此在Java应用程序中得到了广泛的应用。

使用Mybatis框架技术需要配置Mybatis环境和配置文件,那么我们只要配置好环境和文件就可以使用Mybatis框架。

下面我们用案例来演示如何使用配置Mybatis.

创建MySQL数据库

drop database if exists mydb;
create database mydb;
use mydb;
create table emp
(
eid int primary key AUTO_INCREMENT, #员工工号
ename varchar(20), #员工姓名
dept varchar(20), #员工部门
job varchar(20),#职位
sal double,#薪资
phone varchar(11),#电话
address varchar(100)#地址
);
insert into emp(ename,dept,job,sal,phone,address) values('张翠萍','测试部','测试工程
师',5800,'15821563548','郑州');
insert into emp(ename,dept,job,sal,phone,address) values('李耀菲','测试部','测试经
理',9800,'13658942168','许昌');
insert into emp(ename,dept,job,sal,phone,address) values('王长林','研发部','开发工程
师',8800,'13954865721','南阳');
insert into emp(ename,dept,job,sal,phone,address) values('陈清泰','研发部','开发经
理',14900,'13785463249','洛阳');
insert into emp(ename,dept,job,sal,phone,address) values('赵德保','运维部','运维工程
师',5200,'15785642139','信阳');
insert into emp(ename,dept,job,sal,phone,address) values('刘瑞琳','运维部','产品经
理',12600,'17956248563','商丘');

表如下图

使用IDEA创建一个项目使用mybatis框架完成如下功能

//1.查询所有的员工信息
List<Emp> selectAll();
//2.根据员工id查询员工信息
Emp selectById(int eid);
//3.添加员工信息
int addEmp(Emp emp);
//4.修改员工信息
int reviseEmp(Emp emp);
//5.删除员工信息
int delEmp(int eid);

在bean中我们跟数据库表创建了Emp实体类

package com.wang.bean;public class Emp {private Integer eid;private String ename;private String dept;private String job;private Double sal;private String phone;private String address;@Overridepublic String toString() {return "Emp{" +"eid=" + eid +", ename='" + ename + '\'' +", dept='" + dept + '\'' +", job='" + job + '\'' +", sal=" + sal +", phone='" + phone + '\'' +", address='" + address + '\'' +'}';}public Integer getEid() {return eid;}public void setEid(Integer eid) {this.eid = eid;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public String getDept() {return dept;}public void setDept(String dept) {this.dept = dept;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Double getSal() {return sal;}public void setSal(Double sal) {this.sal = sal;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

在dao层创建EmpDao接口放入我们的功能方法

package com.wang.dao;import com.wang.bean.Emp;import java.util.List;public interface EmpDao {// 1.查询所有的员工信息List<Emp> selectAll();//2.根据员工id查询员工信息Emp selectById(int eid);//3.添加员工信息int addEmp(Emp emp);//4.修改员工信息int reviseEmp(Emp emp);//5.删除员工信息int delEmp(int eid);
}

下面是我们真正的配置Mybatis

1.需要导入Mybatis运行环境也就是Mybatis的jar文件,放入lib包中

2.在src包下创建配置文件,包含了 MyBatis 数据库连接和映射器的相关配置信息,取名为Mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- MyBatis 配置文件根元素 --><!-- 环境配置,指定默认数据源环境为 mysql --><environments default="mysql"><environment id="mysql"><!-- 事务管理器配置,指定使用 JDBC 事务管理器 --><transactionManager type="jdbc"></transactionManager><!-- 数据源配置,指定使用连接池数据源 --><dataSource type="pooled"><!-- 数据源属性,指定连接 MySQL 数据库的相关信息 --><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 映射器配置,指定使用的映射器类 --><mappers><mapper class="com.wang.dao.EmpDao"></mapper></mappers></configuration>

3.在dao层里创建映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wang.dao.EmpDao"> <!-- 映射器命名空间,指定映射器接口的完整限定名 --><!-- 查询所有员工信息的 SQL 语句定义,指定结果类型为 com.wang.bean.Emp --><select id="selectAll" resultType="com.wang.bean.Emp">select * from emp</select><!-- 根据员工编号查询员工信息的 SQL 语句定义,指定参数类型为 int,结果类型为 com.wang.bean.Emp --><select id="selectById" resultType="com.wang.bean.Emp">select * from emp where eid = #{eid}</select><!-- 添加新员工信息的 SQL 语句定义,指定参数类型为 com.wang.bean.Emp --><insert id="addEmp" parameterType="com.wang.bean.Emp">insert into emp(ename,dept,job,sal,phone,address) values(#{ename},#{dept},#{job},#{sal},#{phone},#{address});</insert><!-- 修改员工信息的 SQL 语句定义,指定参数类型为 com.wang.bean.Emp --><update id="reviseEmp" parameterType="com.wang.bean.Emp">update  emp set ename=#{ename},dept=#{dept},job=#{job},sal=#{sal},phone=#{phone},address=#{address} where eid=#{eid}</update><!-- 删除员工信息的 SQL 语句定义,指定参数类型为 int --><delete id="delEmp">delete from emp where eid=#{eid}</delete></mapper>

id:方法名

resultType/parameterType:返回结果类型

这里要注意的是用#{}包裹起来的参数是从Emp存在的属性。

4.最后创建一个MyBatis测试类,具体解释在代码注释里

package com.wang.Test;import com.wang.bean.Emp;
import com.wang.dao.EmpDao;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class Test01 { //定义Test01类InputStream stream = null; //定义输入流变量并赋值为nullSqlSessionFactoryBuilder builder = null; //定义会话工厂构建器变量并赋值为nullSqlSessionFactory factory = null; //定义会话工厂变量并赋值为nullSqlSession sqlSession = null;//定义会话变量并赋值为nullEmpDao empDao = null;//定义EmpDao接口变量并赋值为nullList<Emp> empList = null;//定义Emp列表变量并赋值为null@Beforepublic void innt() throws IOException { //定义innt方法并抛出IO异常stream = Resources.getResourceAsStream("Mybatis.xml"); //从Mybatis.xml文件获取输入流builder = new SqlSessionFactoryBuilder(); //创建会话工厂构建器对象factory = builder.build(stream); //使用输入流构建会话工厂对象sqlSession = factory.openSession(); //从会话工厂对象获取会话对象empDao = sqlSession.getMapper(EmpDao.class); //从会话对象获取EmpDao接口的代理实现类对象}@Testpublic void selectAll() { //定义selectAll测试方法List<Emp> emps = empDao.selectAll(); //调用EmpDao接口的selectAll方法查询所有员工信息并返回一个列表for (Emp emp : emps) { //遍历员工列表System.out.println(emp); //打印每个员工对象的信息}}@Testpublic void selectByuid() { //定义selectByuid测试方法Emp emp = empDao.selectById(1); //调用EmpDao接口的selectById方法根据id查询一个员工信息并返回一个对象System.out.println(emp); //打印员工对象的信息}@Testpublic void addEmp(){ //定义addEmp测试方法Emp emp = new Emp(); //创建一个新的员工对象emp.setEname("高启强"); //设置员工姓名为高启强emp.setDept("强盛部");  //设置员工部门为强盛部emp.setJob("执行董事");  //设置员工职位为执行董事emp.setSal(100000d);   //设置员工薪水为100000元emp.setPhone("12345678909");  //设置员工电话为12345678909emp.setAddress("京海");  //设置员工地址为京海int i = empDao.addEmp(emp);  //调用EmpDao接口的addEmp方法添加新的员工信息并返回受影响的行数if (i>0){  //判断是否添加成功System.out.println("add  succeed");  //打印添加成功的提示信息}}@Testpublic void uptest(){  //定义uptest测试方法Emp emp = new Emp(); //创建一个新的员工对象emp.setEid(7); //设置员工id为7emp.setEname("静云"); //设置员工姓名为静云emp.setDept("财务部");  //设置员工部门为财务部emp.setJob("财务经理");  //设置员工职位为财务经理emp.setSal(10000d);   //设置员工薪水为10000元emp.setPhone("12345678909");  //设置员工电话为12345678909emp.setAddress("安阳");  //设置员工地址为安阳int i = empDao.reviseEmp(emp);  //调用EmpDao接口的reviseEmp方法修改员工信息并返回受影响的行数if (i>0){  //判断是否修改成功System.out.println("update  succeed");  //打印修改成功的提示信息}}@Testpublic void deltest(){ //定义deltest测试方法int i = empDao.delEmp(9); //调用EmpDao接口的delEmp方法根据id删除一个员工信息并返回受影响的行数if (i>0){ //判断是否删除成功System.out.println("del  succeed"); //打印删除成功的提示信息}}@Afterpublic void distory() throws IOException { //定义distory方法并抛出IO异常,该方法在每个测试方法执行后运行sqlSession.commit();//提交会话对象中的事务,使数据库中的数据变化生效sqlSession.close(); //关闭会话对象,释放资源stream.close(); //关闭输入流对象,释放资源}
}

此项目只是简单演示Mybatis的配置简单用法,项目结构如下图

演示效果(动图时间有点长...)

(有小案例)初始Mybatis框架及使用相关推荐

  1. 第一章初始mybatis框架

    mybatis框架 ORM: 常见的ORM框架: ----认识MyBatis: ----开发步骤: ----认识配置文件: ---认识映射文件: -----加载映射文件: ORM: ORM(Objec ...

  2. python爬虫基础小案例, scrapy框架,思路和经验你全都有。

    目录 一.scrapy介绍 二.爬取步骤 三.代码 1.创建爬虫项目    scrapy startproject 项目名字                注意: 项目名字不能出现中文,也不能以数字开 ...

  3. MyBatis-学习笔记03【03.自定义Mybatis框架】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  4. java ssm小案例_简易的SSM框架整合小案例

    简易的SSM框架整合小案例 一.创建一个web工程的maven项目 1.项目名随便起 2.选择好你的maven路径,然后finish 二.配置pom.xml文件 org.springframework ...

  5. Mybatis案例升级版——小案例大道理

    纯Mybatis案例升级版--小案例大道理 前言: 这几天看了一本书<原则>,在上面看到了一句话叫"每个人都把自己眼界的局限当成世界的局限",大学生是?,大学就是鱼缸, ...

  6. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。

    多表联合查询 一个根据机场查询航线的例子.有两张表,机场表包含机场信息:机场id.机场名字.机场城市. 航班包含航线信息:航班id.飞机编号.飞行时间.票价.起飞机场id.降落机场id. 需要查询的结 ...

  7. golang gin框架gorilla的websocket小案例

    golang gin框架中gorilla的websocket案例 在gin框架下 导入包 "github.com/gorilla/websocket" r.GET("/t ...

  8. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件

    一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...

  9. spring Boot 2 基础篇 。内含 整合一个spring boot 的 小案例

    目录 springBoot2基础篇 前言与开发环境 一.快速创建Boot项目 1.使用spring提供的快速构建 2.基于maven的手动构建 3.在Idea中隐藏指定文件/文件夹 二.SpringB ...

最新文章

  1. inet_pton和inet_ntop函数
  2. 服务器设备监控系统,服务器设备监控系统
  3. SpringMVC注解@RequestParam(value=xxxx,required=false)解释
  4. 看《你必须知道的.NET》有感--工厂模式的另类解读
  5. 算法分析与设计——蛮力法0/1背包
  6. 在 SAP 电商云 Spartacus UI 里手动注入 module 的几种排列组合
  7. 前端学习(3288):react hook state-hook
  8. oracle 压力测试工具benchmarksql
  9. 7-模块开发卷宗(GB8567——88)
  10. 批量下载花瓣图片脚本--抖机灵
  11. 【BIM入门实战】Navisworks2018简体中文安装教程(附安装包下载)
  12. USB (二)硬件概念 以 STM32F4为例
  13. 多功能扫描仪设备 可识别护照
  14. Eclipse绿豆沙护眼
  15. fstream,ifstream,ofstream 详解与用法
  16. android 横竖切换demo,移动页面横竖屏切换提示 - 轩枫阁
  17. 45个超实用网站,超强整理!外贸人收藏
  18. 国内终端安全防护市场报告发布 360网神排行第一
  19. 唯品会OAuth api_sign
  20. xps in html5,好看的轻薄笔记本,戴尔XPS 13 2in-1评测

热门文章

  1. 网友发帖问阿里P7和协和主治医师谁更成功,BAT员工纷纷嘲笑.
  2. echarts图表入门级教程(An introductory chart tutorial)
  3. 为什么学python?怎么学?怎样算学会?
  4. android拍照保存照片方向,android 拍照的照片方向问题,读取图片EXIF信息
  5. 跟着小马哥学系列之 Spring AOP(AbstractAutoProxyCreator 详解)
  6. HCPL3120手册翻译
  7. html+css设置背景图移动以及人物行走的动画效果
  8. 简单工厂方法模式(Simple Factory Methord)
  9. iOS NSFileManager文件管理(沙盒)
  10. [转载]Navicat12.1系列破解教程,Navicat12.1.16破解亲测有效!!