框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交与的方法;
另一种定义认为,框架是可被应用开发者定制的应用骨架。
前者是从应用方面而后者是从目的方面给出的定义。简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
框架要解决的最重要的一个问题是技术整合的问题,在J2EE 的 架中,有着各种各样的技术,不同的软件企业需要从J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。
这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。
框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为了实现 软件工程中的“高内聚、低合"。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的 MVC 软件设计思想就是很好的分层思想。
常见的JavaEE开发框架:
解决数据的持久化问题的框架
MyBatis本是apache的一个开源项目Batis,2010年这个项目由apache software foundation 迁移d到了googe code,并且改名为MyBatis。2013年11月迁移到Github。
iBATIS一词来源于"intemer和“abatis的组合,是一个基于Java的持久层框架。BATIS提供的持久层框架包括SQL Maps和DataAccess Objects (DAOs)
作为持久层的框架,还有一个封装程度更高的架就是Hibernate,但这个框架因为各种原因目前在国内的流行程度下降大多,现在公司开发也越来越少使用。目前使用SpringData来实现数据持久化也是一种趋势。
2. 解决WEB层问题的MVC框架
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,Spring 摇架提供了构建Web 应用程序的全功能MVC模块。使用 Spring 可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts仰扁挫蹦傍靶哀现在一般不用),Struts2等。
3. 解决技术整合问题的框架
Spnng挺架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松合性角度而言,绝大部分Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代智EJB,并提供了更多的企业应用功能
范围:任何Java应用
Spring是一个轻量级控制反转(loC)和面向切面(AOP)的容器框架。
MyBatis是一个开源轻量级的数据持久化框架,是JDBC和Hibernate的替代方案。
MyBatis 前身为IBatis,2002 年由 Clinton Begin 发布。2010 年从Apache 移到 Google并改名为 MyBatis,2013 年又迁移到了Github。
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement 配置起来并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为iava对象并返回。
采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbcapi底层访问细节,使我们不用与jdbcapi打交道,就可以完成对数据库的持久化操作。
MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。
MyBatis 的中文官网:https://mybatis.org/mybatis-3/zh/index.html
MvBatis主要的目的就是简化]DBC操作,并且满足高并发和高响应的要求.
回顾一下DBC代码:
public class GoodsDao {private String jdbcdriver="com.mysql.cj.jdbc.Driver";private String jdbcurl="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";private String jdbcuser="root";private String jdbcpassword="root";private Connection con=null;private PreparedStatement pstm=null;private ResultSet rs=null;private int row=0;public Goods FindById(int gid){Goods goods=new Goods();try {//1.加载驱动Class.forName(jdbcdriver);//2.获取数据库连接con=DriverManager.getConnection(jdbcurl,jdbcuser,jdbcpassword);//3.编写sql语句String sql="select * from t_goods where gid=?";//4.预处理对象pstm=con.prepareStatement(sql);//传参pstm.setObject(1,gid);//5.执行sql语句rs=pstm.executeQuery();if (rs.next()){//把当前数据行中的数据取出来,存储到Goods对象中goods.setGid(rs.getInt("gid"));goods.setGname(rs.getString("gname"));goods.setPrice(rs.getDouble("price"));goods.setMark(rs.getString("mark"));}} catch (Exception e) {e.printStackTrace();}finally {try {if (pstm!=null){pstm.close();}if (con!=null){con.close();}} catch (Exception e) {e.printStackTrace();}}return goods;}
}
分析以上JDBC存在的问题:
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题.
sql 语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
使用preparedStatement向占有位符号传参数存在硬编码,因为sql语的where条件不一定可能多也可能少,修改sql还要修改代码,系统不易维护。
对结果集解析存在硬编码(查询列名),sl 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
再次回顾mybatis特点:
mybatis 内部封装了jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载动、创建连接、创建 statement等繁杂的过程。
mybatis 通过 ml或注解的方式将要执行的各种statement 配置起来,并通过 ava对象和statement 中sal 的动态参数进行射生成最终执行的sql语句,最后由mybatis框架执行sgl并将结果映射为java对象并返回。
采用ORM 思想解决了实体和数据库映射的问题,对 dbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。
下面我们来用一个入门的案例,了解一下MyBatis的基本操作步骤和使用方法。
-- 判断存在即删除数据库
drop database if exists mydb;
-- 创建数据库
create database mydb;
-- 使用数据库
use mydb;drop table if exists t_user;
-- 创建表
create table t_user(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');select * from t_user where username=? and password=?;
select * from t_user;
在项目中创建一个lib文件夹放入mybatis框架的jar包,并导入项目中。
在src中创建com.chen.bean包,然后创建User实体类。
package com.zhao.bean;public class User {private Integer uid;private String username;private String password;private String phone;private String address;public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}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;}@Overridepublic String toString() {return "User{" +"uid=" + uid +", username='" + username + '\'' +", password='" + password + '\'' +", phone='" + phone + '\'' +", address='" + address + '\'' +'}';}
}
在src中创建com.chen.dao包,然后创建UserDao的接口,然后在接口中定义针对数据库的增删
改查等操作。
package com.zhao.dao;import com.zhao.bean.User;import java.util.List;public interface UserDao {/*** 查询所有用户信息*/List selectAll();int add(User user);int delete(int uid);}
在dao接口的同目录下创建跟接口名字一样的配置文件。
insert into t_user(username,password,phone,address) values(#{username},#{password},#{phone},#{address});
在src中创建一个文件,命名为SqlMapConfig.xml,在该配置文件中配置连接数据库的参数。
使用mybatis框架需要按照框架的步骤进行。
package com.zhao.test;import com.zhao.bean.User;
import com.zhao.dao.UserDao;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;public class UserTest {//1.加载核心配置文件的字节输入流InputStream stream = null;//2.创建SalSessionFactory的构建对象--框架使用的是构建者模式SqlSessionFactoryBuilder builder = null;//3.通过构建对象加载配置文件的输入流获取SqlSessionFactorySqlSessionFactory factory = null;//4.通过工厂对象获取SqlSession对象--执行jabc的SqlSession sqlSession = null;//5.通过SqlSession对象获取接口对应的代理对象UserDao userDao = null;@Beforepublic void init() throws IOException {//1.加载核心配置文件的字节输入流stream = Resources.getResourceAsStream("mybatis.xml");//2.创建SalSessionFactory的构建对象--框架使用的是构建者模式builder = new SqlSessionFactoryBuilder();//3.通过构建对象加载配置文件的输入流获取SqlSessionFactoryfactory = builder.build(stream);//4.通过工厂对象获取SqlSession对象--执行jabc的sqlSession = factory.openSession();//5.通过SqlSession对象获取接口对应的代理对象userDao = sqlSession.getMapper(UserDao.class);}@Afterpublic void distroy() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}
@Testpublic void testSelectAll() throws IOException {//6.通过代理对象执行查询方法List userList = userDao.selectAll();//7.遍历集合for (User user : userList) {System.out.println(user);}}
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
User{uid=1, username='张三', password='666', phone='18965423548', address='南阳'}
User{uid=2, username='李四', password='333', phone='18754263548', address='许昌'}
User{uid=3, username='小美', password='123', phone='18565234759', address='信阳'}
User{uid=4, username='mybatis', password='333', phone='111', address='来来来'}
User{uid=5, username='mybatis', password='333', phone='111', address='来来来'}
Process finished with exit code 0
@Testpublic void testAdd() throws IOException {//定义user对象,封装数据User user = new User();user.setUsername("mybatis");user.setPassword("333");user.setPhone("111");user.setAddress("来来来");int n = userDao.add(user);if (n > 0) {System.out.println("success");} else {System.out.println("error");}}
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
success
Process finished with exit code 0
数据库添加成功:
@Testpublic void testDelete() throws IOException {int n = userDao.delete(4);if (n > 0) {System.out.println("删除成功");}}
删除运行结果:
log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
删除成功
Process finished with exit code 0
数据库删除成功: