您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页SSM框架简介及整合教程

SSM框架简介及整合教程

来源:华佗健康网
SSM框架简介及整合教程

1.Spring

Spring 框架是 Java 应⽤最⼴的框架,它的成功来源于理念,⽽不是技术本⾝,它的理念包括 IoC (控制反转) 和 A⾯向切⾯编程)。Spring框架是个轻量级的Java EE框架,所谓轻量级,是指不依赖于容器就能运⾏的。简单来说,Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的容器框架。

2.Spring MVC

作⽤于web层,相当于controller,与struts中的action⼀样,都是⽤来处理⽤户请求的。同时,相⽐于struts2来说,更加细粒度,它是基于⽅法层⾯的,⽽struts是基于类层⾯的。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的⾓⾊,这种分离让它们更容易进⾏定制。

Struts2 与 SpringMVC 的对⽐:

3.MyBatis

MyBatis 本是apache的⼀个开源项⽬iBatis, 2010年这个项⽬由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis 是⼀款优秀的持久层框架,它⽀持定制化 SQL、存储过程以及⾼级映射。MyBatis 避免了⼏乎所有的 JDBC 代码和⼿动设置参数以及获取结果集。MyBatis 可以使⽤简单的 XML 或注解来配置和映射原⽣信息,将接⼝和 Java 的 POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。Hibernate 和 MyBatis 的对⽐:

Hibernate功能强⼤,数据库⽆关性好,O/R映射能⼒强,如果你对Hibernate相当精通,⽽且对Hibernate进⾏了适当的封装,那么你的项⽬整个持久层代码会相当简单,需要写的代码很少,开发速度很快,⾮常爽。

Hibernate的缺点就是学习门槛不低,要精通门槛更⾼,⽽且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样⽤好Hibernate⽅⾯需要你的经验和能⼒都很强才⾏。

MyBatis⼊门简单,即学即⽤,提供了数据库查询的⾃动对象绑定功能,⽽且延续了很好的SQL使⽤经验,对于没有那么⾼的对象模型要求的项⽬来说,相当完美。

MyBatis的缺点就是框架还是⽐较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要⾃⼰写的,⼯作量也⽐较⼤,⽽且不太容易适应快速数据库修改。

4.SSM框架整合

本项⽬将以购物为背景,主要包括商品信息及库存【因为想顺便学习⼀下事务的处理】、订单信息。下⾯将从数据库创建、项⽬结构说明、配置⽂件、业务代码等⽅⾯进⾏⼀步步说明。

4.1 数据库创建

1. 商品表

初始化表数据

2. 订单表

1

CREATE TABLE `orderinfo` (

2`order_id` varchar(20) NOT NULL COMMENT '订单编号',3`goods_id` bigint(18) NOT NULL COMMENT '商品ID',4`user_id` bigint(10) NOT NULL COMMENT '⽤户ID',

5`order_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '下单时间' ,6 PRIMARY KEY (`order_id`),

INDEX `idx_order_id` (`order_id`)

7) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表'8

OK,⾄此表结构及初始化数据构建完成,下⾯说下基于Mavan的项⽬结构。

4.2 项⽬结构说明

因为项⽬是使⽤maven来管理jar包的,先来贴⼀下,pom.xml的配置pom.xml

为了避免学习⼩伙伴崇尚拿来主义【也就是去除了xmlns之类的东西】,这⾥只放项⽬依赖的jar包的dependencies;本案例将本着“需则⽤”的原则,避免在⽹上看到的各种乱七⼋糟的依赖都丢进来的情况,造成资源浪费和⼲扰阅读。12345671011121314151617181920

junit junit 4.11

21222324252627282930313233343536373839404142434447484950515253555657585960616263656667686970717273747576777879808182838485868788

ch.qos.logback logback-classic 1.1.1

mysql

mysql-connector-java 5.1.37 runtime

c3p0 c3p0 0.9.1.2

org.mybatis mybatis 3.3.0

org.mybatis

mybatis-spring 1.2.3

taglibs

standard 1.1.2

jstl jstl 1.2

com.fasterxml.jackson.core jackson-databind 2.5.4

javax.servlet

javax.servlet-api 3.1.0

org.springframework spring-core 4.1.7.RELEASE

org.springframework spring-beans 4.1.7.RELEASE

org.springframework spring-context 4.1.7.RELEASE

org.springframework spring-jdbc 4.1.7.RELEASE

org.springframework spring-tx 4.1.7.RELEASE

99

100 org.springframework

spring-test101 4.1.7.RELEASE102 103

104 105

106 redis.clients

jedis107 2.7.3108 109

110 com.dyuproject.protostuff

protostuff-core111 1.0.8112 113

114 com.dyuproject.protostuff

protostuff-runtime115 1.0.8116 117

118 119

commons-collections120 commons-collections121 3.2122 123 124125126127128129130131132133134*项⽬结构图src/test/java:⽤于junit的测试类 src/main/java:dao:数据库处理service:业务处理enums:项⽬枚举

mapper:dao中⽅法对应mybatis映射⽂件,Sql就在这⾥⾯web:控制器,controller

entity:项⽬中的实体类,如:商品类和订单类

4.3 配置⽂件

jdbc.properties

logback.xml

这⾥直接⽤的是控制台输出,如果是⽣产环境,可以根据具体的需求进⾏配置。

mybatis-config

这⾥主要是MyBaties全局配置⽂件的配置,可以将⼀些类的别名、主键⾃增配置、驼峰命名规则配置等。

spring 相关配置⽂件

为了更加清晰的了解spring各个组件的作⽤,这⾥将数据源的配置、事务配置和视图解析器的配置分开来。spring-dao.xml

这⾥⾯主要就是spring配置整合mybatis的具体过程,具体包括:1. 引⼊数据库配置⽂件

2. 配置数据源【数据库连接池】3. 配置SqlSessionFactory对象

4. 配置扫描Dao接⼝包,动态实现Dao接⼝,注⼊到spring容器中12

3

4 5

6

7

8 9

10

11 12

13

14 15 16

17 18

19 20

21 2223

24

25 26

27

28 29

30 31

32 3334

3536

37 38

39 4041

spring-service

实际的开发过程中事务⼀般都是在service层进⾏操作。因此⽤⼀个单独的spring-service.xml来进⾏事务的相关的配置

spring-web.xml

配置SpringMVC;需要说明⼀下,⼀般我们在实际的开发过程中,会配置json2map解析。这⾥没有⽤到就不贴出来,读者可以⾃⾏⽹上搜索⼀波。

web.xml

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter true

encoding UTF-8

encodingFilter /*

org.springframework.web.context.ContextLoaderListener

org.springframework.web.util.IntrospectorCleanupListener

mvc-dispatcher

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring/spring-*.xml

mvc-dispatcher/

⾄此,所有的配置⽂件结束,下⾯将进⾏具体的代码环节

4.4 业务代码

这⾥mapper中的xml⽂件就不贴了,⾃⾏脑补。。。。实体类:包括商品和订单商品类

12/**

3 * 商品信息类

4 * @author glmapper5 * */6

public class Goods {7

private long goodsId;// 商品ID8

private String goodsName;// 商品名称9

private int number;// 商品库存10 11

public long getGoodsId() {12

return goodsId;13 }

14 public void setGoodsId(long goodsId) {15 this.goodsId = goodsId;16 }

17 public String getGoodsName() {18 return goodsName;19 }

20 public void setGoodsName(String goodsName) { this.goodsName = goodsName;21

22 }

23 public int getNumber() {24 return number;25 }

26 public void setNumber(int number) { this.number = number;27 }28}29订单类

123/**

4 * 订单信息类

* @author glmapper5 *6 */

7public class OrderInfo {

8 private String orderId;//订单ID9 private long goodsId;//商品ID10 private long userId;//⽤户ID

11 private Date orderTime;//下单时间12 public String getOrderId() {13 return orderId;14 }

15 public void setOrderId(String orderId) {16 this.orderId = orderId; }17

public long getGoodsId() {18

return goodsId;19 }

20 public void setGoodsId(long goodsId) {21 this.goodsId = goodsId;22 }

23 public long getUserId() {24 return userId;25 }

26 public void setUserId(long userId) { this.userId = userId;27 }

28 public Date getOrderTime() {29 return orderTime;30 }

31 public void setOrderTime(Date orderTime) {32 this.orderTime = orderTime;33 }}3435

商品dao

12

public interface GoodsDao {3 4 /**

5 * 通过ID查询单件商品信息6 *

7 * @param id8 * @return */9

Goods queryById(long id);10 11 /**

12 * 查询所有商品信息13 *

14 * @param offset 查询起始位置 * @param limit 查询条数15 * @return16 */

17 List queryAll(@Param(\"offset\") int offset, @Param(\"limit\") int limit);18

19 /**

20 * 减少商品库存 *

21 * @param bookId

22 * @return 如果影响⾏数等于>1,表⽰更新的记录⾏数23 */

24 int reduceNumber(long goodsId);25 26}2728

订单dao

1

2public interface OrderInfoDao {3 4 /**

5 * 插⼊订单记录6 *

* @param OrderInfo orderInfo7 * @return 插⼊的⾏数8 */

9 int insertOrderInfo(OrderInfo orderInfo);10 11 /**

12 * 通过主键查询订单记录,返回订单实体 * @param orderId13 * @return14 */

15 OrderInfo queryByOrderId(String orderId);16}17

下单服务接⼝orderService

123

4@Service(\"orderService\")

5public class OrderServiceImpl implements OrderService { //log⽣成器6

private Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);7

8 // 注⼊dao依赖【商品dao,订单dao】9 @Autowired

10 private GoodsDao goodsDao;11 @Autowired

12 private OrderInfoDao orderInfoDao;13

14 @Override

15 public Goods getById(long goodsId) { // TODO Auto-generated method stub16

return goodsDao.queryById(goodsId);17 }18

19 @Override

20 public List getList(int offset,int limit) {21 // TODO Auto-generated method stub22 return goodsDao.queryAll(offset, limit);23 }24

25 @Override

@Transactional

26 public OrderInfo buyGoods(long goodsId, long userId) {27 //扣减库存,插⼊订单 =⼀个事务 如果失败则执⾏回滚28 try {

29 // 减库存

30 int update = goodsDao.reduceNumber(goodsId);31 if (update <= 0) {// 库存不⾜

32 throw new NoNumberException(\"no number\");33 } else {

34 // 执⾏预约操作

35 OrderInfo orderInfo=new OrderInfo();36 orderInfo.setGoodsId(goodsId);

orderInfo.setUserId(userId);

37 orderInfo.setOrderTime(new Date());

38 String orderId=getRandomOrderId(goodsId);39 orderInfo.setOrderId(orderId);

int insert = orderInfoDao.insertOrderInfo(orderInfo);40

41 if (insert <= 0) {// 重复预约

42 throw new RepeatAppointException(\"repeat appoint\");43 } else {// 预约成功44 return orderInfo; }45 }

46 } catch (Exception e) {

47 //这⾥可以丰富下具体的返回信息48 logger.error(\"下单失败\");49 }

50 return null; }51 52

private String getRandomOrderId(long goodsId) {53

SimpleDateFormat dateFormater = new SimpleDateFormat(\"yyyyMMddhhmmss\");

String prefix=dateFormater.format(new Date());55 String goodsIdStr=goodsId+\"\";56 String temp=\"\";

57 for (int i = 0; i < 6; i++) {

58 Random random=new Random(goodsIdStr.length()-1);59 temp+=goodsIdStr.charAt(random.nextInt());60 }

61 return prefix+temp; }62}636566

OK,⾄此所有核⼼代码及配置⽂件罗列完毕;【mapper中的xml和具体的controller就不贴了,相信⼤家对这个也不陌⽣。本⽂主要意图在于梳理下⾃⼰学习中的⼀些点,SSM框架在实际的应⽤开发中还会有很多其他的开源技术结合进来,如:quartz,redis等。当前本⽂的列⼦就是⼀个空壳⼦,以备参考吧】

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务