一、什么是框架?
框架顾名思义,他是一个架子,类似于人初期搭建的房基,是个半成品,需要我们后期为他添加些东西装饰。
在系统开发中,框架是整个或者部分系统的可重用涉及,表现为一组抽象构架及构建实例间交互的方法;另一种定义认为,框架是可应用开发者定制的股价。前者是从应用方面而后是从目的方面给出的意义。
框架就是某种应用的半成品,是一组组件,供你选用完成自己的系统。简单来说就是使用别人搭建好的舞台,你来做表演。框架一般是成熟的,不断升级的软件。
因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
二、框架解决什么问题?
技术整合的问题,在将J2EE的框架中,有各种各样的技术,不同的软件企业需要从J2EE中选择不同的的技术,这样就使得企业最终依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而且应用是软件企业的核心,是竞争力的关键所在。
因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
在现在个个软件开发公司所用的框架基本不同,这样也就促进了技术的进步。在开发中,框架一般在底层应用平台和高层业务逻辑之间的中间层
三、为什么软件开发要分层?
框架重要是实现了部分功能,并且能够很好的将底层应用平台和高级业务逻辑进行了缓和。
为什么软件开发要分层,因为软件工程规定程序要“高内聚,低耦合”,分层的思想是将问题划分开来,单个解决,这样易于控制、易于延展、易于分配资源。
在常见的MVC软件中就是应用分层的思想。
通过分层更好的实现各个部分的职责,将每一层再细化出不同框架,分层解决问题。
四、分层开发常用框架
常见的 JavaEE 开发框架:
MyBatis
1、解决数据的持久化问题的框架
目前使用 Spring Data 来实现数据持久化也是一种趋势。在从前使用比较多的是一个封装程度更高的框架就是 Hibernate,现在不流行了,具体原因可以百度。
2、解决 WEB 层问题的 MVC 框架
spring MVC
3、解决技术整合问题的框架
spring框架
五、MyBatis 框架详解
概念:
mybatis是一个优秀的的基于Java的持久层框架,它内部封装了JDBC,开发者只需要关注sql语句本身,而不需要过多关注数据库驱动、创建链接、创建statement等复杂步骤。
mybatis 是通过xml或者注解的方式将要执行的各种statement配置开来,并通过Java对象和statement中SQL的动态参数进行映射生成最终执行的 sql 语句,最后再通过mybatis框架执行SQL语句并将结果映射为 java 对象并返回。
采用ORM思想解决了实体和数据库映射的问题,对JDBC进行封装,屏蔽了jdbc api的底层访问细节,我们不需要与jdbc api交流,就可以实现完成数据库持久化操作。
引入:
为什么要使用mybatis框架?
在以前,使用jdbc时,在开发人员使用中发现JDBC有以下问题:
- 数据库连接创建、释放会造成系统资源浪费进而影响系统性能,如果使用数据库连接池可解决此类问题。
- sql 语句在代码中硬解码,造成不宜维护,在实际开发中SQL语句变化很大,更改sql语句就要更改Java代码。
- 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
- 对结果解析存在硬解码(查询列名),sql 变化导致解析代码发生变化,系统不宜维护,如果将数据库查询记录进行封装pojo对象,这样解析更方便。
下载
百度搜索mybatis download获取最新版本,
搭建Mybatis开发环境
1、创建工程文件
2、添加 Mybatis 的坐标--在 pow.xml 添加Mybatis坐标
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
3、编写实体类
package com.itheima.domain; import java.io.Serializable; import java.util.Date; /** * @Company http://www.ithiema.com */ public class User implements Serializable{ private Integer id; private String username; private Date birthday; private String sex; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
4、编写持久层IUserDao
IUserDao 接口就是我们的持久层接口(也可以写成 UserDao 或者 UserMapper),具体代码如下: /** * * <p>Title: IUserDao</p> * <p>Description: 用户的持久层操作</p> * <p>Company: http://www.itheima.com/ </p> */ public interface IUserDao { /** * 查询所有用户 * @return */ List<User> findAll(); }
5、编写持久层接口的映射文件IUserDao.xml
要求:
创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.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"> <mapper namespace="com.itheima.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.itheima.domain.User"> select * from user </select> </mapper>
6、编写SqlMapConfig.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"> <configuration> <!-- 配置 mybatis 的环境 --> <environments default="mysql"> <!-- 配置 mysql 的环境 --> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ee50"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置的位置 --> <mappers> <mapper resource="com/itheima/dao/IUserDao.xml"/> </mappers> </configuration>
7、编写测试类
/** * * <p>Title: MybatisTest</p> * <p>Description: 测试 mybatis 的环境</p> * <p>Company: http://www.itheima.com/ </p> */ public class MybatisTest { public static void main(String[] args)throws Exception { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建 SqlSessionFactory 的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.使用构建者创建工厂对象 SqlSessionFactory SqlSessionFactory factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession session = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 IUserDao userDao = session.getMapper(IUserDao.class); //6.使用代理对象执行查询所有方法 List<User> users = userDao.findAll(); for(User user : users) { System.out.println(user); } //7.释放资源 session.close(); in.close(); } }
以上便是简单的mybatis入门,从中可以发现,我们需要改的地方不多,只需要编写Dao接口,并按照要求编写mybatis的两个配置文件,就可实现功能。
更为简单,使用注解,只需编写一个mybatis配置文件就可实现功能。
修改
在持久层接口中添加注解
/** * * <p>Title: IUserDao</p> * <p>Description: 用户的持久层操作</p> */ public interface IUserDao { /** * 查询所有用户 * @return */ @Select("select * from user") List<User> findAll(); }
修改 SqlMapConfig.xml
<!-- 告知 mybatis 映射配置的位置 --> <mappers> <mapper class="com.itheima.dao.IUserDao"/> </mappers>
//在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(IUserDao.xml)。