软件框架技术简介
软件框架(software framework),通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。
框架的功能类似于基础设施,与具体的软件应用无关,但是提供并实现最为基础的软件架构和体系。
一. 为什么需要框架技术:
帮我们更快更好地构建程序
是一个应用程序的半成品
提供可重用的公共结构
按一定规则组织的一组组件
二. 优势:
不用再考虑公共问题
专心在业务实现上
结构统一,易于学习、维护
新手也可写出好程序
不要重复造轮子(Stop Trying to Reinvent the Wheel),已经成为开发人员的基本原则。
Java世界中的主流框架技术: Spring、SpringMVC、MyBatis、Struts、Hibernate、SpringBoot等。
1.MyBatis简介
1.1.ORM思想的提出
数据库中数据是以表的形式存在的,而java中使用的数据都是对象型的。所以不得不要将表数据转换成对象数据。 这样就会产生大量的没有技术含量的纯 “体力” 型代码。
while(rs.next()) {
Business business = new Business();
business.setBusinessId(rs.getInt("businessId"));
business.setPassword(rs.getString("password"));
business.setBusinessName(rs.getString("businessName"));
business.setBusinessAddress(rs.getString("businessAddress"));
business.setBusinessExplain(rs.getString("businessExplain"));
business.setStarPrice(rs.getDouble("starPrice"));
business.setDeliveryPrice(rs.getDouble("deliveryPrice"));
list.add(business);
}
上面代码就属于纯 “体力” 型代码。这些代码工作量大、单调枯燥、占用大量开发时间。为了解决这个问题,出现了ORM思想。
ORM(对象-关系映射):完成对象数据到关系型数据映射的机制称为对象-关系映射。
1.2.MyBatis框架
MyBatis就是一个ORM框架。当然,也是一个持久层框架。
MyBatis封装了JDBC, 将数据库中的表数据自动封装到对象中。这样就可以以面向对象的方式操作数据了。它的出现,使得开发工作量变小了,可以将精力集中在业务逻辑的处理上。代码精简易读。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。 也就是说:iBatis3.0之后都要改名为MyBatis 。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
实际上,MyBatis最核心的功能,就是实现了输入映射和输出映射。
2.MyBatis实例
2.1.添加Mybatis依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
2.2.创建MyBatis配置文件
在 resources 文件夹中创建 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>
<!-- 配置数据源相关属性和事务 -->
<environments default="development">
<!-- 可以配置多个数据源环境,默认使用default中的值 -->
<environment id="development">
<!-- 使用jdbc的事务管理 -->
<transactionManager type="JDBC" />
<!-- 配置数据源,并使用自带数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/emp?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 配置映射文件,可配置多个 -->
<mappers>
<mapper resource="com/neusoft/po/Emp.xml" />
</mappers>
</configuration>
一. transactionManager标签的type属性有两种取值:
JDBC:全部使用jdbc的事务管理
MANAGED:不使用事务管理,也从不提交
二. dataSource标签的type属性有三种取值:
POOLED:使用Mybatis自带的数据库连接池
UNPOOLED:不使用任何数据库连接池
JNDI:jndi形式使用数据库连接
2.3.创建po类
创建 Emp.java类
package com.neusoft.po;
public class Emp {
private Integer empno;
private String ename;
private String job;
private String hiredate;
private Double sal;
private Integer deptno;
@Override
public String toString() {
return empno+"\t"+ename+"\t"+job+"\t"+hiredate+"\t"+sal+"\t"+deptno;
}
//get/set方法...
}
注意:po类属性名必须与数据库表的字段名一致。
2.4.创建映射文件
在 po 类所在包下,创建相同名称的映射文件:Emp.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="emp">
<select id="getEmpById" parameterType="int" resultType="com.neusoft.po.Emp">
select * from emp where empno = #{empno}
</select>
</mapper>
注意: mapper标签:映射文件的根标签。 mapper标签namespace属性:命名空间,对sql进行分类管理,可防止id重复
select标签:表示查询。 select标签id属性:此属性要唯一。这个id可称为statement的id。 select标签parameterType属性:sql参数的类型。 select标签resultType属性:sql语句执行后返回的类型。
sql语句:{}: 表示sql参数,一个占位符。
当parameterType属性为对象类型时:#{} 中的参数名为对象的属性名。 当parameterType属性为单个值时,参数名可以任意。
从映射文件中可以看到:MyBatis会根据字段名与实体对象中的属性名进行映射,从而实现自动将查询数据注入到实体对象的每一个属性中。这就是输出映射。
2.5.测试
package com.neusoft;
import java.io.InputStream;
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 com.neusoft.po.Emp;
public class Test {
public static void main(String[] args) {
try {
//读取配置文件,获得配置文件信息
InputStream input = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过配置信息创建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(input);
//通过SqlSessionFactory打开数据库会话
SqlSession sqlSession = ssf.openSession();
//通过SqlSession的selectOne(返回一行记录时使用)方法执行sql语句
Emp emp = sqlSession.selectOne("emp.getEmpById",7521);
System.out.println(emp);
//关闭数据库会话
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.当返回一条记录时,使用 SqlSession 的 selectOne 方法执行sql语句,MyBatis会将返回记录输出映射为一个java对象。
2.当返回多条记录时,使用 SqlSession 的 selectList 方法执行sql语句,MyBatis会将返回记录输出映射为一个java集合。
3.selectOne 方法和 selectList 方法都只有两个参数:
第一个参数为指定的sql语句,根据映射文件中的id,注意要加上命名空间
第二个参数是给 sql语句参数传值(可以是一个值、或一个对象)
2.6.使用log4j输出日志
上面实例运行后,在控制台中只输出了查询结果,却没有中间的执行过程信息。这对我们开发时进行错误调试是非常不利的。我们希望在开发时,能够看到详细的执行过程
MyBatis默认使用log4j输出日志。所以,下面使用log4j来让MyBatis输出更多的日志信息。
1.添加log4j依赖
<!-- 使用log4j输出更多的日志信息 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.在resources文件夹中添加log4j配置文件(log4j.properties)
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
### direct messages to file mylog.log ###
### log4j.appender.file=org.apache.log4j.FileAppender
### log4j.appender.file.File=d:mylog.log
### log4j.appender.file.layout=org.apache.log4j.PatternLayout
### log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%n
### set log levels - for more verbose logging change 'debug?info?warn?error' ###
### log4j.rootLogger=debug,stdout,file
log4j.rootLogger=debug,stdout
3.MyBatis核心接口和类
1.SqlSessionFactoryBuilder负责构建SqlSessionFactory,并且提供了多个build()方法的重载。也就是说:此对象可以从xml配置文件,或从Configuration对象来构建SqlSessionFactory。
2.SqlSessionFactory就是创建SqlSession实例的工厂。通过openSession方法来获取SqlSession对象。而且,SqlSessionFactory一旦被创建,那么在整个应用程序期间都存在。
3.SqlSession是一个面向程序员的接口,它提供了面向数据库执行sql命令所需的所有方法。SqlSession对应一次数据库会话,它是线程不安全的。
4.封装持久层
MyBatis开发DAO层有两种方式:
原始dao方式
mapper代理方式
4.1.原始dao方式
按照JDBC课程中封装dao层的方式,我们可以先封装一个 Util 工具类,在此工具类中封装一个获取SqlSessionFactory的方法。然后创建dao接口和实现类。
SqlSessionFactory工具类: