cannot resolve symbol问题+@Transactional+list和数组转换注意+mysql替换某个字段中某个字符-8/25~9/4

一、cannot resolve symbol问题

有时候pull代码之后有些类或者某一个controller和service层之间突然就没关联了。代码爆红但是不影响编译运行。具体原因暂不清楚,每次都通过清除缓存解决。不知道是不是电脑内存太小啥的。( 点击菜单中的 “File” -> “Invalidate Caches / Restart”,然后点击对话框中的 “Invalidate and Restart”,清空 cache 并且重启。)

还有其他情况的cannot resolve symbol参考:https://www.cnblogs.com/myibm/p/9511847.html

二、@Transactional

在更新两个表的操作的时候往往需要加上事务。我使用的是声明式。利用@Transactional,它可以根据你的配置,设置是否自动开启事务;自动提交事务或者遇到异常自动回滚。
捕获异常时,要想使事务生效,需要手动抛出RuntimeException异常或者添加rollbackFor = Exception.class

/*
 * 捕获异常时,要想使事务生效,需要手动抛出RuntimeException异常或者添加rollbackFor = Exception.class
*/
@Override
@Transactional
public Long addBook(Book book) {
     
    Long result = null;
    try {
     
        result = bookDao.addBook(book);
        int i = 1/0;
    } catch (Exception e) {
     
        e.printStackTrace();
        throw new RuntimeException();
    }
    return result;
}

@Override
@Transactional(rollbackFor = Exception.class)
public Long addBook(Book book) {
     
    Long result = null;
    try {
     
        result = bookDao.addBook(book);
        int i = 1/0;
    } catch (Exception e) {
     
        e.printStackTrace();
        throw e;
    }
    return result;
}

另:要是public修饰的方法;自调用的方法不生效;
其他注意点及参考:https://blog.csdn.net/u013929527/article/details/102596243

三、list和数组转换

list->数组:有for循环和toArray();
for循环都好理解,需要说的是toArray
不能这样写:

ArrayList<String> list=new ArrayList<String>();
String strings[]=(String [])list.toArray();

这样写编译没有什么问题,但是运行时会报ClassCastException,这是因为Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组的类型是java.lang.Object。把java.lang.Object转换成java.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。

而是这样写:

 List<String> testList = new ArrayList<String>()
 //{
     {add("aa");add("bb");add("cc");}};
 String[] array2 = testList.toArray(new String[testList.size()]);

但是:
会出现这样的提示:

Call to 'toArray()' with pre-sized array argument 'new String[list.size()]'
Inspection info: There are two styles to convert a collection to an array: either using a pre-sized array (like c.toArray(new String[c.size()])) or using an empty array (like c.toArray(new String[0]).

转换集合为数组的时候,有两种方式:使用初始化大小的数组(这里指的是初始化大小的时候使用了集合的size()方法)和空数组。

在低版本的 Java 中推荐使用初始化大小的数组,因为使用反射调用去创建一个合适大小的数组相对较慢。但是在 openJDK 6 之后的高版本中方法被优化了,传入空数组相比传入初始化大小的数组,效果是相同的甚至有时候是更优的。因为使用 concurrent 或 synchronized 集合时,如果集合进行了收缩,toArray()size()方法可能会发生数据竞争,此时传入初始化大小的数组是危险的。

因此在高版本的 Java 上面可以改为

List<String> list = new ArrayList<>();
String[] array = list.toArray(new String[0]);

参考:
https://www.cnblogs.com/dirgo/p/10314330.html
https://blog.csdn.net/QasimCyrus/article/details/88674516

四、mysql替换

mysql利用REPLACE把 users表 中的 name字段 中所有‘#’换成‘{’:

UPDATE users set `name`=REPLACE(`name`,'#','{')

你可能感兴趣的:(java,idea,java)