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
21222324252627282930313233343536373839404142434447484950515253555657585960616263656667686970717273747576777879808182838485868788 99 100 104 105 106 110 114 118 119
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
6
8 10 11 13 14 17 19 21
24
25 28 30 32
35 37 39
spring-service
实际的开发过程中事务⼀般都是在service层进⾏操作。因此⽤⼀个单独的spring-service.xml来进⾏事务的相关的配置
spring-web.xml
配置SpringMVC;需要说明⼀下,⼀般我们在实际的开发过程中,会配置json2map解析。这⾥没有⽤到就不贴出来,读者可以⾃⾏⽹上搜索⼀波。
web.xml
⾄此,所有的配置⽂件结束,下⾯将进⾏具体的代码环节
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 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 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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务