# SSMDemo **Repository Path**: addcandy/SSMDemo ## Basic Information - **Project Name**: SSMDemo - **Description**: SSM框架 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SSM框架 快速使用 ## 资源文件 - layUi - Jquery - BootStrap ## 用到技术 - Spring - SpringMVC - Mybatis - Druid ## 可能会用到的东东 ### 事务 @Transactional #### 注解 1. @Transactional(propagation=Propagation.REQUIRED) 如果有事务, 那么加入事务, 没有的话新建一个(默认情况下) 2. @Transactional(propagation=Propagation.NOT_SUPPORTED) 容器不为这个方法开启事务 3. @Transactional(propagation=Propagation.REQUIRES_NEW) 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务 4. @Transactional(propagation=Propagation.MANDATORY) 必须在一个已有的事务中执行,否则抛出异常 5. @Transactional(propagation=Propagation.NEVER) 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反) 6. @Transactional(propagation=Propagation.SUPPORTS) 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务. #### 事物超时设置 - @Transactional(timeout=30)//默认是30秒 ####事务隔离级别: 1. @Transactional(isolation= Isolation.READ_UNCOMMITTED) 读取未提交数据(会出现脏读, 不可重复读) 基本不使用 2. @Transactional(isolation = Isolation.READ_COMMITTED) 读取已提交数据(会出现不可重复读和幻读) 3. @Transactional(isolation = Isolation.REPEATABLE_READ) 可重复读(会出现幻读) 4. @Transactional(isolation = Isolation.SERIALIZABLE) 串行化 - MySQL:默认为REPEATABLE_READ - SQLSERVER: 默认为READ_COMMITTED #### 描述 - 脏读 :一个事务读取到另一事务未提交的更新数据 - 不可重复读 : 在同一事务中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. - 可重复读:在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据 - 幻读 :一个事务读到另一个事务已提交的insert数据 #### 注解中常用参数说明 | 参 数 名 称 | 功 能 描 述 | | ----------- | ------------------------------------------------------------ | | readOnly | 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true) | | rollbackFor | 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class,Exception.class}) | | 参 数 名 称 | 功 能 描 述 | | ---------------------- | ------------------------------------------------------------ | | rollbackForClassName | 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"}) | | noRollbackFor | 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class,Exception.class}) | | noRollbackForClassName | 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")指定多个异常类名称:@Transactional(noRollbackForClassName={"RuntimeException","Exception"}) | | propagation | 该属性用于设置事务的传播行为,具体取值可参考表6-7。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) | | isolation | 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置 | | timeout | 该属性用于设置事务的超时秒数,默认值为-1表示永不超时 | **用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw newRuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(thrownewException("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚要想所有异常都回滚,要加上@Transactional( rollbackFor={Exception.class,其它异常}).如果让unchecked例外不回滚:@Transactional(notRollbackFor=RunTimeException.class) 如下: @Transactional(rollbackFor=Exception.class)//指定回滚,遇到异常Exception时回滚 public void methodName() { throw new Exception("注释"); } @Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(thrownew RuntimeException("注释");)会回滚 public ItimDaoImpl getItemDaoImpl() { throw new RuntimeException("注释"); }** ### 序列化 如果有**性能上面的要求**可以使用**Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean** #### Gson 1. bean转换json:toJson ```java Gson gson = new Gson(); String json = gson.toJson(obj); ``` 2. json转换bean:fromJson ```java Gson gson = new Gson(); String json = "{\"id\":\"2\",\"name\":\"Json技术\"}"; Book book = gson.fromJson(json, Book.class); ``` 3. json转换复杂的bean,比如List,Set : fromJson ```java // 将json转换成复杂类型的bean,需要使用TypeToken Gson gson = new Gson(); String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]"; // 将json转换成List List list = gson.fromJson(json, new TypeToken() {}.getType()); // 将json转换成Set Set set = gson.fromJson(json, new TypeToken() {}.getType()); ``` 4. 通过json对象直接操作json以及一些json的工具 ```java GsonBuilder gsonBuilder = new GsonBuilder(); ResponseData responseData = gsonBuilder.create().fromJson(result, ResponseData.class); ``` #### Fastjson 1. bean转换json: toJSONString ```java // 将对象转换成格式化的json JSON.toJSONString(obj, true); // 将对象转换成非格式化的json JSON.toJSONString(obj, false); // 对于复杂类型的转换,对于重复的引用在转成json串后在json串中出现引用的字符,比如 // $ref":"$[0].books[1] Student stu = new Student(); Set books= new HashSet(); Book book = new Book(); books.add(book); stu.setBooks(books); List list = new ArrayList(); for(int i=0;i<5;i++) { list.add(stu); } String json = JSON.toJSONString(list, true); ``` 2. json转换bean:parseObject ```java String json = "{\"id\":\"2\",\"name\":\"Json技术\"}"; Book book = JSON.parseObject(json, Book.class); ``` 3. json转换复杂的bean,比如List,Map:parseObject ```java String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]"; // 将json转换成List List list = JSON.parseObject(json, new TypeReference(){}); // 将json转换成Set Set set = JSON.parseObject(json, new TypeReference(){}); ``` 4. 通过json对象直接操作json ```java String propertyName = 'id'; String propertyValue = ""; String json = "{\"id\":\"1\",\"name\":\"Json技术\"}"; JSONObject obj = JSON.parseObject(json); propertyValue = obj.get(propertyName)); ```