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的优劣
  1. 资源浪费。SQL连接不停地创建和释放;
  2. 不易维护。SQL语句中存在大量硬编码,在传统JDBC编程中SQL的变动需要改变Java代码,违反了开闭原则;用PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码;JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。

Mybatis

是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。是一张为了解决面向对象与关系型数据库中数据类型不匹配的技术,通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。

SQLSession

SqlSession提供select/insert/update/delete方法。SQLSession的四个重要对象:

  1. Execute:是真正执行Java与数据库交互的东西。调度执行StatementHandler、ParmmeterHandler、ResultHandler执行相应的SQL语句;
  2. StatementHandler:使用数据库中Statement(PrepareStatement)执行操作,即底层是封装好了的prepareStatement;
  3. ParammeterHandler:处理SQL参数;
  4. 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文件的配置信息。

软件工程笔记

P15 软件危机 在软件开发中要遵循如下几点准则: “软件工程”是在1968年召开的一个讨论“软件危机”问题的 […]

Operation System

操作系统理论 操作系统(Operation System)是配置在计算机硬件上的第一层软件,是对硬件系统的首次 […]

基于建立私有DERP节点与私有Headscale优化Tailscale组网的实践学习

警告 本文仅用于学习讨论企业内部组网架构且不涉境外流量。本文所讲述的均为技术实践话题且实践内容仅供个人参考,任 […]

如何防止微信内置浏览器缓存

如何防止微信内置浏览器缓存 WebView 缓存策略 微信内置浏览器(微信WebView)中的缓存策略可能导致 […]

用了HTTPS 防火墙就不知道你在访问什么了吗?

什么是SNI? SNI(Server Name Indication)是TLS的扩展,用来解决一个服务器拥有多 […]

Bibliography

· Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis ISBN:7115461023.
· wikipedia.org
· www.itheima.com

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

富强民主文明和谐