后台架构上分为4层:DAO、POJO、controller、service

(配合ssmbuild工程一起看)

1、POJO层

2、持久层:DAO层(mapper)

  • DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此
  • DAO层的首先任务是设计接口(BookMapper.interface)
  • 第二步来写接口的实现类,这里用XML配置文件来实现BookMapper.interface

3、Controller层

Controller层负责具体的业务模块流程的控制

  • 在此层里面要调用Service层的接口来控制业务流程,
  • 控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。
@Controller
@RequestMapping("/book")
public class BookController {//controller调service层@Autowired@Qualifier("BookServiceImpl")private BookService bookService;//查询全部书籍并且返回到页面@RequestMapping("/allBook")public String list(Model model){List<Books> list = bookService.queryAllBooks();model.addAttribute("list", list);return "allBook";}
}
  • @Controller
  • @Controller表示在tomcat启动的时候,把这个类作为一个控制器加载到Spring的Bean工厂,如果不加,就是一个普通的类
  • 在spring-mvc.xml中有以下配置:base-package表示会扫描com.han.controller目录下所有的包,一旦发现有个类上面加了类似于@Controller的注解,在容器启动的时候系统就会把它加载到Spring的Bean工厂,并且对其实例化。这也是为什么,我们只是写了Controller,但是从来没有在一个地方new这个Controller的原因,因为在Web容器启动的时候,这个Controller已经被Spring加载到自己的Bean工厂里面去了。
        <context:component-scan base-package="com.han.controller" />
  • @RequestMapping

  • @RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

4、WEB层

 logging.properties:加上后,控制台报错会更加详细

org.apache.catalina.core.ContainerBase.[Catalina].level=INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers=java.util.logging.ConsoleHandler

BookMapper.xml

<mapper namespace="com.han.dao.BookMapper">

在BookMapper.xml的<mapper>中的namespace属性值表示该xml配置文件与com.han.dao.BookMapper构成一一映射关系,注意BookMapper接口只能有一个xml与之映射。

    <insert id="addBook" parameterType="Books">INSERT INTO ssmbuild.books (bookName, bookCounts, detail) VALUES (#{bookName},#{bookCounts},#{detail});</insert><!--主键bookID不需要写进去,因为它可以自增--><delete id="deleteBookById" parameterType="int">DELETE FROM ssmbuild.books WHERE bookID = #{bookID};</delete><update id="updateBook" parameterType="Books">UPDATE ssmbuild.booksSET bookName=#{bookName}, bookCounts=#{bookCounts}, detail=#{detail}WHERE bookID = #{bookID};</update><select id="queryBookById" resultType="Books">SELECT * FROM ssmbuild.books WHERE bookID=#{bookID};</select><select id="queryAllBooks" resultType="Books">SELECT * FROM ssmbuild.books;</select>
  • 标签中的id代表标签所对应的BookMapper.interface中的方法
  • #{}代表占位符,即SQL预编译,#{} 能防止sql 注入。变量替换后,#{} 对应的变量自动加上单引号 ''。

#{}内参数的使用规范:

1、单个参数的情形:无MyBatis 默认值,可任意,且与参数名无关

public User getUser(int i);
    <select id="getUser" resultType="User">SELECT * FROM ssmbuild.books WHERE i=#{id};</select>
  • 可以看出这种情况下:int i 和 #{id} 的参数是可以不同的,因为只有一个输入参数,int i 和 #{id}是唯一对应的

2、多个参数的情形:使用MyBatis 默认值或者使用自定义参数名

        2.1 使用MyBatis 默认值 arg0、arg1、arg2 … 或 param1、param2、param3 …

2.2 使用自定义参数名,前提:在映射器接口方法的参数前加注解@Param("")

  • #{}使用建议:不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
  • parameterType 将会传入这条语句的参数的类全限定名或别名。可以不写的,mybatis会自动识别,但是为了规范,代码可读性,还是写上好。但是resultType一定要写上
  • 假如Dao层BookMapper.interface中的方法的返回类型为List<User>,但是在BookMapper.xml对应的resultType依然写User

5、resources资源

其实从命名空间上的内容可以看出:

        1、spring的配置文件有:applicationContext、spring-dao、spring-service,其中spring-dao、spring-service的命名空间相同,也就是代表他们可以合在一个配置文件中写。

        2、mybatis的配置文件:mybatis-config

        3、springMVC的配置文件:spring-mvc

5.1 mybatis核心配置文件:mybatis-config.xml

<configuration><!--mybatis-config是mybatis的核心配置文件--><!--配置数据源交给spring去做--><typeAliases><package name="com.han.pojo"/></typeAliases><mappers><!--注册绑定mapper.xml--><mapper class="com.han.dao.BookMapper"/></mappers></configuration>
  • 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType、resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声明该类型的全路径,java.lang.String,或者 cn.com.mybatis.pojo.User, 这时就可以通过 typeAliases 别名来设置,简化复杂度
            当通过设置 MyBatis 的核心配置文件中的 typeAliases 属性后,就可以为 sql 映射文件中的输入 / 输出参数设置类型别名,然后在 sql 映射配置文件中指定输入输出参数类型时使用的别名。首先,mybatis核心配置文件示例如下:

    <typeAliases><typeAlias alias="user" type="cn.com.mybatis.pojo.User"/><typeAlias alias="str" type="java.lang.String"/>
    </typeAliases>

    这样就可以在 sql 映射配置文件中使用别名来指定输入 / 输出参数的类型了,其示例代码如下:

    <select id="findUserByUsername" parameterType="str" resultType="user">SELECT * FROM USER WHERE username LIKE '%${value}%'
    </select>

    一个一个配置别名就会很麻烦,这时候就需要批量定义别名,批量指定很简单,只要指定包名即可,之后程序会为包下的所有类都自动加上别名,其定义别名的规范就是对应包装类的类名或者类名首字母变为小写,其示例1代码如下:

    <typeAliases><package name="cn.com.mybatis.pojo"/>
    </typeAliases>

    这时设置的包名下的类就都有了别名,别名就是类名(或者首字母小写),像刚才的 User 类,其别名就为 user或者User。

除了在配置文件中单独的配置别名和批量的配置别名两种方式外,还有一种方式,就是通过注解的方式来配置别名,方法也很简单,在需要配置别名的类前通过 @Alias 注解即可,参数就是别名名称,例如以下示例代码:

@Alias("user")
public class User{//其他代码
}
  • mybatis需要在核心配置文件中注册绑定对应的mapper.xml(这里是BookMapper.xml),使用<mappers><mappers/>

mappers 标签下有许多 mapper 标签,每一个 mapper 标签中配置的都是一个独立的映射配置文件的路径,配置方式有以下几种:

第一种:使用相对路径进行配置。示例代码如下:

<mappers><mapper resource="org/mybatis/mappers/UserMapper.xml"/><mapper resource="org/mybatis/mappers/ProductMapper.xml"/><mapper resource="org/mybatis/mappers/ManagerMapper.xml"/>
</mappers>

第二种:使用绝对路径进行配置。示例代码如下:

<mappers><mapper url="file:///var/mappers/UserMapper.xml"/><mapper url="file:///var/mappers/ProductMapper.xml"/><mapper url="file:///var/mappers/ManagerMapper.xml"/>
</mappers>

第三种:使用接口信息进行配置。示例代码如下:

<mappers><mapper class="org.mybatis.mappers.UserMapper"/><mapper class="org.mybatis.mappers.ProductMapper"/><mapper class="org.mybatis.mappers.ManagerMapper"/>
</mappers>

第四种:使用接口所在包进行配置。示例如下:

<mappers><package name="org.mybatis.mappers"/>
</mappers>

只有配置了 mappers 信息后,MyBatis 才知道去哪里加载 Mapper 映射文件,在日常开发中,可以根据项目中 Mapper 的配置偏好,选择整合配置文件的配置方式。

spring配置文件之一:spring-dao.xml:

        这个配置文件其实就是将spring和mybatis关联起来的文件,有时候也会命名为spring-mybatis.xml。

        有些参数在某些阶段中是常量,比如 :

a、在开发阶段我们连接数据库时的连接url,username,password,driverClass等

b、分布式应用中client端访问server端所用的server地址,port,service等

c、配置文件的位置

而这些参数在不同阶段之间又往往需要改变,比如:在项目开发阶段和交付阶段数据库的连接信息往往是不同的,分布式应用也是同样的情况。能不能有一种解决方案可以方便我们在一个阶段内不需要频繁书写一个参数的值,而在不同阶段间又可以方便的切换参数配置信息,spring3中提供了一种简便的方式就是context:property-placeholder/元素。

只需要在spring的配置文件里添加一句:<context:property-placeholder location="classpath:database.properties"/> 即可,这里location值为参数配置文件的位置,参数配置文件通常放在src目录下,而参数配置文件的格式跟java通用的参数配置文件相同,即键值对的形式。

    <!--关联数据库配置文件--><context:property-placeholder location="classpath:database.properties"/>

然后需要选择数据源,即数据库连接池的类,并连接数据库、配置数据库连接池的一些私有属性。(这里以c3p0连接池为例)

    <!--连接池--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!-- c3p0连接池的私有属性 --><property name="maxPoolSize" value="30"/><property name="minPoolSize" value="10"/><!-- 关闭连接后不自动commit --><property name="autoCommitOnClose" value="false"/><!-- 获取连接超时时间 --><property name="checkoutTimeout" value="10000"/><!-- 当获取连接失败重试次数 --><property name="acquireRetryAttempts" value="2"/></bean>

  接下来要配置SqlSessionFactory对象:

        在 MyBatis 中,使用 SqlSessionFactoryBuilder创建SqlSessionFactory ,进而来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭 session。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入数据库连接池 --><property name="dataSource" ref="dataSource"/><!-- 配置MyBaties全局配置文件:mybatis-config.xml --><property name="configLocation" value="classpath:mybatis-config.xml"/></bean>

下面这段配置暂时还没看明白什么意思

    <!--配置dao接口扫描包,动态实现Dao接口可以注入到Spring容器中--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><property name="basePackage" value="com.han.dao"/></bean>

spring配置文件之一:spring-service.xml:

    <!--扫描service下的包--><context:component-scan base-package="com.han.service"/>
  • 当在spring的配置文件中配置了<context:component-scan>标签后,,Spring会去自动扫描base-package的值所表示的包的位置中的java文件,如果扫描到有@Component、@Controller、@Service、@Repository等类似注解的类,会将这个类注册为Bean
    <!--声明式事务配置--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/><!--注入数据源--></bean><!--AOP事务支持-->
  • 这一段暂时没用上,也没看什么含义

SSM框架整合及详解相关推荐

  1. SSM框架搭建过程详解(一)环境及其层次配置

    1.创建maven项目 1.1GroupID和ArtifactID的区别 通俗来讲就是横坐标和纵坐标的区别,GroupID填写形式一般为com.xxx.xxx即包名,ArtifactID则填写工程项目 ...

  2. SSM框架整合:各种配置文件的整合和详解

    SSM框架整合:各种配置文件的整合和详解 前言 学习了ssm框架的整合之后,对于数量众多的配置文件,和各种不同的配置方式感到甚是头疼,接下来教给大家一个清晰明白的配置,分门别类的配置不同的xml文件. ...

  3. SSM Chapter 12 SpringMVC扩展和SSM框架整合

    SSM Chapter 12 SpringMVC扩展和SSM框架整合 笔记 本章目标: 掌握JSON对象的处理 理解数据转换和格式化 了解本地化 掌握Spring MVC+Spring+MyBatis ...

  4. SpringBoot 整合EasyExcel详解(一)-高性能Excel方案

    SpringBoot 整合EasyExcel详解(二)-写Excel SpringBoot 整合EasyExcel详解(三)-填充Excel-官方原版 一.概述 Java解析.生成Excel比较有名的 ...

  5. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  6. pythonmessage用法_django 消息框架 message使用详解

    前言 在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证 ...

  7. 定时任务框架APScheduler学习详解

    定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...

  8. java集合框架的结构_集合框架(Collections Framework)详解及代码示例

    简介 集合和数组的区别: 数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变. 集合存储对象,一个集合中可以存储多种类型的对象.空间可变. 严格地说,集合是存储对象的引用,每个 ...

  9. php ucword,ThinkPHP3.1.2整合UCenter详解(二)

    在ThinkPHP3.1.2整合UCenter详解(一) 中我们安装完了WBlog3.1.2.UCenter_Home_2.0_SC_UTF8和UCenter 1.6.0三个程序后.接下来接着上一篇讲 ...

  10. (转)淘淘商城系列——SSM框架整合之Dao层整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ...

最新文章

  1. 大型网站架构演化历程
  2. 将 Excel 导入到 SharePoint 列表
  3. 洛谷P1098 字符串的展开【字符串】【模拟】
  4. 将CSV文件存为HTML文件形式
  5. java-线程-用ThreadLocal类实现线程范围内的数据共享
  6. display:table-cell 在页面中的应用
  7. 文件删除后未释放磁盘
  8. 微信小程序npm引用ui框架
  9. atom n270 cpu linux,继续改造ATOM N270增加千兆口自制软路由
  10. linux7.6安装gcc,Centos7.6 安装gcc9
  11. Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before bundling.
  12. 【python数模小作业】动手‘预习‘高数之 人口预测(线性拟合)
  13. Android APP启动其他APP(一个APP拉起(跳转到)另一个APP)
  14. 简易 文章发布系统——前台界面
  15. Java实现LDAP认证(上)
  16. 分层和分段用什么符号_分段符号该怎么用
  17. 2020年书法落款_书法落款能不能写“年”字?
  18. springboot基于JAVA的电影推荐系统的开发与实现 附源码-毕业设计112306
  19. 对*p++与*++p;(*p)++ 与 ++(*p)的理解
  20. GPT专业应用:快速生成职位描述(JD)

热门文章

  1. 信息安全管理体系(ISMS)
  2. Lavas的简单入门
  3. 字节跳动笔试题-前端(互娱)
  4. 小米便签产品级的源码
  5. [Spark机器学习]基于Spark 2.0 机器学习之推荐系统实现
  6. 13.设计模式--外观模式(Facade模式)
  7. 如何在ubuntu-1804中增加swapfile
  8. rgb sw 线主板接口在哪_火力升级 华硕B460重炮手PRO主板豪横上市_搜狐汽车
  9. 前端在H5页面唤起微信支付(H5支付)
  10. Godot 导出 Android apk