使用MySQL完成车站售票管理系统的设计与实现,完成一个小型数据库应用系统的数据库设计开发。
考察市长途汽车站、火车站售票业务,设计车站售票管理系统。要求:
①具有方便、快速的售票功能,包括车票的预订和退票功能,能够支持团体的预订票和退票。
②能准确地了解售票情况,提供多种查询和统计功能,如车次的查询、时刻表的查询等;
③能按情况所需实现对车次的更改、票价的变动及调度功能;
④完善的报表系统;
⑤具备一定的维护功能,如数据安全管理(含备份与恢复)、操作员管理、权限设置等;
请问怎么建立呢?
参考:https://blog.csdn.net/u011748319/article/details/82808061/
spring作为开发平台,对数据库的访问支持的很完善,对事务的支持也比较完善,主要分为两种编程式事务与声明式事务,编程式事务能够更细的控制事务回滚与提交的粒度,但是需要在代码中编写,耦合性更高,并且与业务代码混合在一起,这与spring的无入侵的特性相违背,因此一般会采用声明式事务的方式进行事务管理,因为在很多需要操作数据的逻辑都需要进行事务管理,抛开不同开发者写的代码差异性不谈,单从重复性的代码导致系统难以维护,内聚性很差这点就足以证明这种方式不可取,但是这不正是AOP的使用场景吗,因此使用切面编程技术生成动态代理完成事务管理,业务代码更加的单纯,。主要分为三大部分,数据源,事务管理器,代理机制。其中处于核心地位的接口为PlatformTransactionManager,它的定义比较简单:
// 获取spring配置的事务传播机制
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// 提交
void commit(TransactionStatus status) throws TransactionException;
// 或则回滚
void rollback(TransactionStatus status) throws TransactionException;
getTransaction定义了事务的开启范围,这个可以在网上找到更详细的讲解,这里不累述。commit与rollback就是基本的事务控制机制。
AbstractPlatformTransactionManager实现了该接口,这个抽象类定义一些基本的对事务支持的操作,但是抽象了不同的orm框架对事务管理的细节。jdbc是通过dataSource Connection来进行事务管理,而hibernate是通过SqlSession进行事务管理。使用jdbc进行事务管理,就注入DataSourceTransactionManager即可。并制定对应的数据源,然后只需要制定需要代理的类即可。
数据源的配置:
<bean id="driver" class="com.mysql.jdbc.Driver"></bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="url" value="${url}" />
<property name="driver" ref="driver" />
</bean>
首先我们制定事务管理器:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
然后我们定义需要事务传播机制,我们来创建一个常见,也可以采用其他的方式创建advice,这里的advice通知就是定义了需要做什么,这里就是 如果有事务加入事务,没有的话创建新事务:
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 如果有事务加入事务,没有的话创建新事务 -->
<tx:method name="*" propagation="REQUIRED" timeout="3"/>
</tx:attributes>
</tx:advice>
做什么定义完了,就需要指定在哪里做(pointcut)即切点,代理的方式有很多种,可以使用默认的代理DefaultAdvisorAutoProxyCreator。也可以使用注解的方式,很灵活,主要就是明白定义好切点(一般spring支持较好的是方法级别的拦截)即可。这里我们使用比较方便的schema标签支持aop代理:
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* micro.test.spring.service..*Service*.*(..))" />
<aop:advisor advice-ref="advice" pointcut-ref="txPointcut"/>
</aop:config>
很多时候我们引入新的xml标签会报错,这个时候检查xml文件头是否引入了相关的schema即可,这点是初学者很容易犯错的地方。
<!-- 扫描到advice -->
<context:component-scan base-package="micro.test.spring" />
<!-- mybatis中sqlSession由这个类来完成 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations">
<list>
<value>classpath:/sqlmap/ComputerMapper.xml</value>
</list>
</property>
</bean>
其他必要的配置跟本文不太相关就不贴了。
前面execution(* micro.test.spring.service…Service.*(…))就表示在这个包下面的所有方法都是切点,会被代理。这是service的一个方法,执行它:
public void testTransaction2() {
Computer computer = new Computer();
computer.setBrand("test");
computerMapper.insert(computer);//事务会回滚
ComputerExample computerExample = new ComputerExample();
computerExample.or().andBrandEqualTo(computer.getBrand());
int a = 1;
a /= 0; // 制造异常
computerMapper.insert(computer);
}
如果没事务管理机制,会插入一条记录。引入了事务管理机制,抛出异常(spring要求运行时异常)就不会插入记录,因为遇到了异常,当然如果去掉异常,两条都会插入进去,值得一提的是我数据库设置的默认应该不是读未提交,因为在调试到还没抛异常的时候也不会看到一条记录,如果是读未提交应该是看到出现了一条记录然后又消失了(被回滚),测试了几次,要么有0条,要么有两条(正常执行)。没有造成脏读的情况至少应该是读已提交。查询了一下:
果然可重复读,是能够不免脏读和不可重复度两个问题的。但是无法避免幻读。
看了此篇文章是不是感觉收获蛮大
我可以提供以下建议:
1.首先需要进行数据库设计,定义需要的表(例如车票表、车次表、用户表等等),表之间的关联关系以及相应的字段。可以使用MySQL Workbench等工具进行设计。
2.根据设计好的数据库,创建对应的数据表并插入初始数据。
3.在Java中使用JDBC连接MySQL数据库,进行增删改查操作,并将数据和Java类进行映射(可以使用ORM框架如MyBatis等,也可以手写映射代码)。
4.实现具体的售票、预订、退票、查询、统计等功能,包括相应的业务逻辑和界面交互,可以使用Spring框架搭建项目骨架、实现事务管理、注入依赖等。
5.考虑一些高级功能,例如调度、报表系统、数据安全管理等,也可以通过调用相应的API实现。
6.对于权限设置和操作员管理,可以使用Spring Security等安全框架进行实现。
7.最后,进行测试、调试和部署上线,确保系统稳定性和安全性。
以上是大致的开发步骤和建议,其中一些细节还需要具体实现时再考虑。若具体实现过程中遇到困难,可以参考上述参考资料或查找相关资料。如果解决不了,也可以考虑寻求专业的技术支持。