框架(Framework)是一种编程模型,是一组相互协作的类和工具集合,它们一起提供了一种通用的方法来解决特定领域中的问题。框架一般会提供一些预定义的解决方案和编程范例,开发人员可以基于这些方案和范例来快速构建自己的应用程序,同时还可以减少重复代码,提高开发效率和代码质量。
框架可以是基于某个编程语言或者特定平台的,比如Java EE、.NET等等。它们可以为开发人员提供一系列的工具和函数库,帮助他们快速开发、测试和部署应用程序。同时,框架还能提供一些标准化的结构和流程,使得应用程序在不同开发团队之间能够更加一致和可维护。
框架的使用可以大大提高开发效率和代码质量,因为它们能够解决一些通用性的问题,同时还能使代码更加易于维护和升级。然而,框架也有一些限制和约束,开发人员需要遵循框架的规范和约定来编写应用程序。
MyBatis是一种Java持久化框架,它可以将SQL查询和结果映射到Java对象中,从而实现Java对象与关系型数据库的映射。使用MyBatis可以避免手写JDBC代码,简化数据访问层的开发。
MyBatis最初是由Apache软件基金会下的iBATIS项目发展而来的。后来,iBATIS更名为MyBatis,并于2010年成为一个独立的开源项目,现在由MyBatis团队维护和开发。
MyBatis提供了许多高级特性,包括动态SQL,缓存机制,延迟加载等等。它也支持多种数据源,包括关系型数据库和NoSQL数据库等。 MyBatis被广泛应用于Java项目中,是Java持久化框架中的一员,并被认为是一个简单易用的ORM框架。
使用MyBatis框架的主要原因包括:
简化开发:MyBatis可以大大简化数据访问层(DAO)的开发,避免了手写JDBC代码的繁琐,同时也减少了出错的可能性。
灵活性:MyBatis提供了许多高级特性,包括动态SQL、缓存机制、延迟加载等等。它允许开发人员根据具体的需求进行自定义配置,从而使得开发过程更加灵活。
易于维护:MyBatis的数据访问层代码通常比较简洁明了,易于阅读和维护。同时,MyBatis也提供了一些工具来简化开发、调试和测试的过程,如MyBatis Generator等。
性能优越:MyBatis的SQL语句是预编译的,可以提高数据库的执行效率。同时,MyBatis也支持缓存机制,可以避免频繁的数据库访问,提高应用程序的性能。
多数据源支持: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 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;
@Override
public 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 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
3.在dao层里创建映射文件
insert into emp(ename,dept,job,sal,phone,address) values(#{ename},#{dept},#{job},#{sal},#{phone},#{address});
update emp set ename=#{ename},dept=#{dept},job=#{job},sal=#{sal},phone=#{phone},address=#{address} where eid=#{eid}
delete from emp where eid=#{eid}
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; //定义输入流变量并赋值为null
SqlSessionFactoryBuilder builder = null; //定义会话工厂构建器变量并赋值为null
SqlSessionFactory factory = null; //定义会话工厂变量并赋值为null
SqlSession sqlSession = null;//定义会话变量并赋值为null
EmpDao empDao = null;//定义EmpDao接口变量并赋值为null
List empList = null;//定义Emp列表变量并赋值为null
@Before
public 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接口的代理实现类对象
}
@Test
public void selectAll() { //定义selectAll测试方法
List emps = empDao.selectAll(); //调用EmpDao接口的selectAll方法查询所有员工信息并返回一个列表
for (Emp emp : emps) { //遍历员工列表
System.out.println(emp); //打印每个员工对象的信息
}
}
@Test
public void selectByuid() { //定义selectByuid测试方法
Emp emp = empDao.selectById(1); //调用EmpDao接口的selectById方法根据id查询一个员工信息并返回一个对象
System.out.println(emp); //打印员工对象的信息
}
@Test
public void addEmp(){ //定义addEmp测试方法
Emp emp = new Emp(); //创建一个新的员工对象
emp.setEname("高启强"); //设置员工姓名为高启强
emp.setDept("强盛部"); //设置员工部门为强盛部
emp.setJob("执行董事"); //设置员工职位为执行董事
emp.setSal(100000d); //设置员工薪水为100000元
emp.setPhone("12345678909"); //设置员工电话为12345678909
emp.setAddress("京海"); //设置员工地址为京海
int i = empDao.addEmp(emp); //调用EmpDao接口的addEmp方法添加新的员工信息并返回受影响的行数
if (i>0){ //判断是否添加成功
System.out.println("add succeed"); //打印添加成功的提示信息
}
}
@Test
public void uptest(){ //定义uptest测试方法
Emp emp = new Emp(); //创建一个新的员工对象
emp.setEid(7); //设置员工id为7
emp.setEname("静云"); //设置员工姓名为静云
emp.setDept("财务部"); //设置员工部门为财务部
emp.setJob("财务经理"); //设置员工职位为财务经理
emp.setSal(10000d); //设置员工薪水为10000元
emp.setPhone("12345678909"); //设置员工电话为12345678909
emp.setAddress("安阳"); //设置员工地址为安阳
int i = empDao.reviseEmp(emp); //调用EmpDao接口的reviseEmp方法修改员工信息并返回受影响的行数
if (i>0){ //判断是否修改成功
System.out.println("update succeed"); //打印修改成功的提示信息
}
}
@Test
public void deltest(){ //定义deltest测试方法
int i = empDao.delEmp(9); //调用EmpDao接口的delEmp方法根据id删除一个员工信息并返回受影响的行数
if (i>0){ //判断是否删除成功
System.out.println("del succeed"); //打印删除成功的提示信息
}
}
@After
public void distory() throws IOException { //定义distory方法并抛出IO异常,该方法在每个测试方法执行后运行
sqlSession.commit();//提交会话对象中的事务,使数据库中的数据变化生效
sqlSession.close(); //关闭会话对象,释放资源
stream.close(); //关闭输入流对象,释放资源
}
}
此项目只是简单演示Mybatis的配置简单用法,项目结构如下图
演示效果(动图时间有点长...)