JavaEE学习笔记
Spring+Spring MVC+Mybatis
- Spring,开源框架,主要优势之一是分层架构。Spring提供了更完善的开发环境,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。Spring 没有直接实现任何的编程模型,但它已经在 Java 社区中广为流行,基本上完全代替了企业级JavaBeans(EJB)模型。
- Spring MVC是一个Web开发框架,可以理解为Servlet的替代品。在MVC模式中,Spring MVC作为控制器(controller)用于实现模型与视图的数据交互,是结构最清晰的。Spring MVC框架采用松耦合、可插拔的组件结构,具有高度的可配置性,与其他的MVC框架相比,具有更强的扩展性和灵活性。
- Mybatis是Apache的一个开源项目iBatis,2010年这个项目由Apache迁移到了Google,并改名为Mybatis,2013年11又被迁移到了Github。Mybatis是一个持久层框架,可在实体类和SQL语句之间建立映射关系,是一种半自动ORM(Object/Reaction Mapping,即对象关系映射)实现。Mybatis封装性要低于Hibernate,但性能优越、简单易学。
- Spring Boot框架是Pivotal团队基于Spring开发的全新框架,初衷是为了简化Spring的配置,使用户能够构建独立运行的程序,提高开发效率。Spring Boot框架本身不提供SPring框架的核心特性与扩展功能,只是用于了快速敏捷新一代基于Spring框架的应用,同时还集成了大量的第三方类库(Jackson、JDBC、Redis等)。
- Spring Cloud是一系列框架的有序集合,为开发人员构建微服务架构提供了完整的解决方案,利用Spring Boot的开发便捷性巧妙地简化了分布式系统的开发。
传统JDBC的优劣
- 资源浪费。SQL连接不停地创建和释放;
- 不易维护。SQL语句中存在大量硬编码,在传统JDBC编程中SQL的变动需要改变Java代码,违反了开闭原则;用PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码;JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。
Mybatis
是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。是一张为了解决面向对象与关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
SQLSession
SqlSession提供select/insert/update/delete方法。SQLSession的四个重要对象:
- Execute:是真正执行Java与数据库交互的东西。调度执行StatementHandler、ParmmeterHandler、ResultHandler执行相应的SQL语句;
- StatementHandler:使用数据库中Statement(PrepareStatement)执行操作,即底层是封装好了的prepareStatement;
- ParammeterHandler:处理SQL参数;
- ResultHandler:结果集ResultSet封装处理返回。
SQLSession用法案例:
//example
User user = session.selectOne("cn.mybatis.demo.mapper.PersonMapper.selectPersonById", 1);
<?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>
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
<?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.xuemian168.User">
<select id="findById"
parameterType="int"
resultType="int">
select * from user03 where uid = #{id}
</select>
</mapper>
import com.xuemian168.User;
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.InputStream;
public class UserTest {
@Test
public void findById() throws Exception {
//1.获取核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建sqlSession对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3.创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.执行SQL语句
User user = sqlSession.selectOne("com.xuemian168.com.User.findById", 1);
System.out.println(user);
//5.释放资源
sqlSession.close();
}
}
SQLSessionFactory
在构建SQLSessionFactory对象时,建议使用单例模式。因为SqlSessionFactory对象是线程安全的,一旦被创建就不需要多次创建,会长期存在于程序运行过程中。如果多次创建针对同一数据库的SQLSessionFactory对象,该数据库的资源很容易耗尽。
其中,SqlSessionFactoryBuilder构建Build()方法,完整的是build(InputStream inputStream,String environment,Properties properties),参数inputStream是字节流,封装了XML文件形式的配置信息;参数environment和参数properties为可选参数。其中参数environment决定将要加载的环境,包括数据源和事务管理器;参数properties决定将要加载的properties文件。
另一种build(Reader reader,String environment,Properties properties)和第一种形势大体一致,第一种形式的build()方法使用InputStream字节流封装了XML文件形式的配置信息,而第二种形式的build()方法使用Reader字符流封装了XML文件的配置信息。
Bibliography
· Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis ISBN:7115461023.
· wikipedia.org
· www.itheima.com