精华内容
下载资源
问答
  • Java编程:删除 List 元素的三种正确方法

    万次阅读 多人点赞 2016-11-30 16:44:59
    删除 List 中的元素会产生两个问题: ...我们通过代码示例演示正确的删除逻辑package com.ips.list;import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.

    删除 List 中的元素会产生两个问题:

    1. 删除元素后 List 的元素数量会发生变化;
    2. 对 List 进行删除操作可能会产生并发问题;

    我们通过代码示例演示正确的删除逻辑

    package com.ips.list;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    public class ArrayListRemove {
    	public static void main(String[] args) {
    		ArrayList<String> list = new ArrayList<String>();
    		list.add("beijing");
    		list.add("shanghai");
    		list.add("shanghai");
    		list.add("guangzhou");
    		list.add("shenzhen");
    		list.add("hangzhou");
    		remove11(list, "shanghai");
    
    	}
    	
    	private static void print(List<String> list){
    		for (String item : list) {
    			System.out.println("元素值:" + item);
    		}
    	}
    
    	/*
    	 * 错误
    	 */
    	public static void remove11(List<String> list, String target){
    		int size = list.size();
    		for(int i = 0; i < size; i++){
    			String item = list.get(i);
    			if(target.equals(item)){
    				list.remove(item);
    			}
    		}
    		print(list);
    	}
    	/*
    	 * 错误
    	 */
    	public static void remove12(List<String> list, String target){
    		for(int i = 0; i < list.size(); i++){
    			String item = list.get(i);
    			if(target.equals(item)){
    				list.remove(item);
    			}
    		}
    		print(list);
    	}
    	/*
    	 * 正确
    	 */
    	public static void remove13(List<String> list, String target){
    		int size = list.size();
    		for(int i = size - 1; i >= 0; i--){
    			String item = list.get(i);
    			if(target.equals(item)){
    				list.remove(item);
    			}
    		}
    		print(list);
    	}
    	/*
    	 * 正确
    	 */
    	public static void remove14(List<String> list, String target){
    		for(int i = list.size() - 1; i >= 0; i--){
    			String item = list.get(i);
    			if(target.equals(item)){
    				list.remove(item);
    			}
    		}
    		print(list);
    	}
    	
    	/*
    	 * 错误
    	 */
    	public static void remove21(List<String> list, String target){
    		for(String item : list){
    			if(target.equals(item)){
    				list.remove(item);
    			}
    		}
    		print(list);
    	}
    	
    	/*
    	 * 正确
    	 */
    	public static void remove22(ArrayList<String> list, String target) {
    		final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(list);
    		for (String item : cowList) {
    			if (item.equals(target)) {
    				cowList.remove(item);
    			}
    		}
    		print(cowList);
    	}
    	
    	/*
    	 * 错误
    	 */
    	public static void remove31(List<String> list, String target){
    		Iterator<String> iter = list.iterator();
    		while (iter.hasNext()) {
    			String item = iter.next();
    			if (item.equals(target)) {
    				list.remove(item);
    			}
    		}
    		print(list);
    	}
    	/*
    	 * 正确
    	 */
    	public static void remove32(List<String> list, String target){
    		Iterator<String> iter = list.iterator();
    		while (iter.hasNext()) {
    			String item = iter.next();
    			if (item.equals(target)) {
    				iter.remove();
    			}
    		}
    		print(list);
    	}
    
    }
    
    

    执行 remove11 方法,出现如下错误:

    Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
    at java.util.ArrayList.rangeCheck(ArrayList.java:635)
    at java.util.ArrayList.get(ArrayList.java:411)
    at com.ips.list.ArrayListRemove.remove11(ArrayListRemove.java:33)
    at com.ips.list.ArrayListRemove.main(ArrayListRemove.java:17)

    由于int size = list.size();提前获取了 List 的大小,for 循环中删除了两个元素,导致出现数组越界问题。

    执行 remove12 方法,出现如下错误:

    元素值:beijing
    元素值:shanghai
    元素值:guangzhou
    元素值:shenzhen
    元素值:hangzhou

    字符串“shanghai”没有被删除,该方法解决了数组越界问题,但没有解决彻底删除数据的问题,原因是这样的,跟踪 ArrayList.remove(Object 0) 方法:

        public boolean remove(Object o) {
            if (o == null) {
                for (int index = 0; index < size; index++)
                    if (elementData[index] == null) {
                        fastRemove(index);
                        return true;
                    }
            } else {
                for (int index = 0; index < size; index++)
                    if (o.equals(elementData[index])) {
                        fastRemove(index);
                        return true;
                    }
            }
            return false;
        }
    
    

    删除元素时执行 else 逻辑,调用了 fastRemove(index) 方法:

        private void fastRemove(int index) {
            modCount++;
            int numMoved = size - index - 1;
            if (numMoved > 0)
                System.arraycopy(elementData, index+1, elementData, index,
                                 numMoved);
            elementData[--size] = null; // clear to let GC do its work
        }
    

    通过代码我们发现:List 删除元素的逻辑是将目标元素之后的元素往前移一个索引位置,最后一个元素置为 null,同时 size - 1;这也就解释了为什么第二个“shanghai”没有被删除。

    执行 remove13 方法,正确:

    元素值:beijing
    元素值:guangzhou
    元素值:shenzhen
    元素值:hangzhou

    执行 remove14 方法,正确:

    元素值:beijing
    元素值:guangzhou
    元素值:shenzhen
    元素值:hangzhou

    那么 remove13 与 remove14 有什么区别呢?答案是没有区别,但是 remove11 与 remove12 是有区别的,remove12 中每次for(int i = 0; i < list.size(); i++)执行都会计算 size 值,比较耗性能。

    执行 remove21 方法,出现如下错误:

    Exception in thread "main" java.util.ConcurrentModificationException
    	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    	at java.util.ArrayList$Itr.next(ArrayList.java:831)
    	at com.ips.list.ArrayListRemove.remove21(ArrayListRemove.java:82)
    	at com.ips.list.ArrayListRemove.main(ArrayListRemove.java:17)
    
    

    产生java.util.ConcurrentModificationException异常。foreach 写法实际上是对的 Iterable、hasNext、next方法的简写。因此我们从List.iterator()着手分析,跟踪iterator()方法,该方法返回了 Itr 迭代器对象。

    	public Iterator<E> iterator() {
    		return new Itr();
    	}
    

    Itr 类定义代码:

        private class Itr implements Iterator<E> {
            int cursor;       // index of next element to return
            int lastRet = -1; // index of last element returned; -1 if no such
            int expectedModCount = modCount;
    
            public boolean hasNext() {
                return cursor != size;
            }
    
            @SuppressWarnings("unchecked")
            public E next() {
                checkForComodification();
                int i = cursor;
                if (i >= size)
                    throw new NoSuchElementException();
                Object[] elementData = ArrayList.this.elementData;
                if (i >= elementData.length)
                    throw new ConcurrentModificationException();
                cursor = i + 1;
                return (E) elementData[lastRet = i];
            }
    
            public void remove() {
                if (lastRet < 0)
                    throw new IllegalStateException();
                checkForComodification();
    
                try {
                    ArrayList.this.remove(lastRet);
                    cursor = lastRet;
                    lastRet = -1;
                    expectedModCount = modCount;
                } catch (IndexOutOfBoundsException ex) {
                    throw new ConcurrentModificationException();
                }
            }
    
            final void checkForComodification() {
                if (modCount != expectedModCount)
                    throw new ConcurrentModificationException();
            }
        }
    
    

    通过代码我们发现 Itr 是 ArrayList 中定义的一个私有内部类,在 next、remove方法中都会调用 checkForComodification 方法,该方法的作用是判断 modCount != expectedModCount是否相等,如果不相等则抛出ConcurrentModificationException异常。每次正常执行 remove 方法后,都会对执行expectedModCount = modCount赋值,保证两个值相等,那么问题基本上已经清晰了,在 foreach 循环中执行 list.remove(item);,对 list 对象的 modCount 值进行了修改,而 list 对象的迭代器的 expectedModCount 值未进行修改,因此抛出了ConcurrentModificationException异常。

    执行 remove22 方法,正确:

    元素值:beijing
    元素值:guangzhou
    元素值:shenzhen
    元素值:hangzhou
    通过 CopyOnWriteArrayList 解决了 List的并发问题。

    执行 remove31 方法,出现如下错误:

    Exception in thread “main” java.util.ConcurrentModificationException
    at java.util.ArrayListItr.checkForComodification(ArrayList.java:859)atjava.util.ArrayListItr.checkForComodification(ArrayList.java:859) at java.util.ArrayListItr.checkForComodification(ArrayList.java:859)atjava.util.ArrayListItr.next(ArrayList.java:831)
    at com.ips.list.ArrayListRemove.remove31(ArrayListRemove.java:109)
    at com.ips.list.ArrayListRemove.main(ArrayListRemove.java:17)

    与执行 remove21 产生的异常一致,问题产生的原因也一致。

    执行 remove32 方法,正确:

    元素值:beijing
    元素值:guangzhou
    元素值:shenzhen
    元素值:hangzhou

    展开全文
  • MybatisPlus中的删除和逻辑删除

    千次阅读 2020-07-28 22:26:53
    删除又分为逻辑删除和物理删除,那么它们有什么区别呢? 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。 逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”...

    删除又分为逻辑删除和物理删除,那么它们有什么区别呢?
    物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。
    逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。
    在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看物理删除与逻辑删除怎么实现的吧
    首先假设我有这样一张表
    在这里插入图片描述
    实体类:

    package com.atguigu.mybatis_plus.entity;
    import java.util.Date;
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableLogic;
    import lombok.Data;
    @Data
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        // @TableField(fill = FieldFill.UPDATE)
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
        
    }
    

    userMapper接口:

    package com.atguigu.mybatis_plus.mapper;
    import com.atguigu.mybatis_plus.entity.User;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    // 继承BaseMapper后UserMapper就具有了CRUD功能
    public interface UserMapper extends BaseMapper<User>{
    }
    

    一、物理删除
    1、根据id删除记录

    @Test
        public void testLogicDelete() {
            int count = userMapper.deleteById(1L);  // 删除id为1的数据
            System.out.println("受影响的行数"+count);
        }
    

    2、批量删除

    @Test
    public void testDeleteBatchIds() {
        int result = userMapper.deleteBatchIds(Arrays.asList(2, 3, 4)); // 删除id为2,3,4的数据
        System.out.println(result);
    }
    

    结果:
    在这里插入图片描述
    物理删除比较简单,接下来我们看看逻辑删除怎么实现吧!
    二、逻辑删除
    (1)数据库修改,添加 deleted字段
    在这里插入图片描述(2)实体类修改,添加deleted 字段,并加上 @TableLogic 注解

     /*
        加@TableLogic的情况下,程序内部会将delete语句变为update语句
        实际上我们写的代码并不需要做出什么改变
        */
        @TableLogic
        private Integer deleted;
    

    (3)测试

    	/**
         * 逻辑删除
         */
        @Test
        public void testLogicDelete() {
            int count = userMapper.deleteById(5L);
            System.out.println("受影响的行数"+count);
        }
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    • 测试后发现,数据并没有被删除,deleted字段的值由0变成了1
    • 测试后分析打印的sql语句,是一条update
    • 注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作
      (5)测试逻辑删除后的查询,MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断
    @Test
        public void testSelect() {
            List<User> users = userMapper.selectList(null); // 查询所有记录
            users.forEach(System.out::println); // 遍历输出
        }
    

    结果:
    在这里插入图片描述

    展开全文
  • java批量删除

    千次阅读 2015-12-29 20:57:23
    java批量删除  在学习DRP项目过程中,视频中使用逐条删除的方式,但考虑到逐条删除在数据量大的情况下,可能性能较低的因素,对其进行了优化升级。采用字符拼接、批量删除。  首先,批量删除的sql语句语法为:...
    java批量删除

            在学习DRP项目过程中,视频中使用逐条删除的方式,但考虑到逐条删除在数据量大的情况下,可能性能较低的因素,对其进行了优化升级。采用字符拼接、批量删除。
            首先,批量删除的sql语句语法为:delete t_table from id_key in (value1, value2, ……)
            sql语句说明:删除t_table表中,id_key主键为value1, value2, ……等数据项。
           
            从jsp的JavaScript中进提交(MVC中的V层)
    	/**
    	 * 删除用户
    	 * 		* 批量删除
    	 */
    	function deleteUser() {
    		var userID = new Array();
    		var selectFlags = document.getElementsByName("selectFlag");
    		var j = 0;
    		for(var i=0; i<selectFlags.length; i++) {
    			if(selectFlags[i].checked == true) {
    				userID[j] = (selectFlags[i].id).toString();
    				j++;
    			}
    		}
    		var del = "del";
    		window.self.location = "user_maint.jsp?userID[]=" + userID + "&command=" + del;
    		
    	}
           
            在DRP中,是在jsp文件中插入java服务器端代码的方式进行处理的(MVC中的C层)       
    <%	
    	String [] userId;
    	userId = request.getParameterValues("userID[]");
    	String command = request.getParameter("command");
    	if("del".equals(command)){
    		UserManager.getInstance().removeUser(userId);
    		out.println("删除用户成功!");
    	}
    %>	

            执行批量删除的代码:(MVC中的M层,包括负责与数据库进行交互)
    	/**
    	 * 根据用户ID,删除用户
    	 * @param 用户ID:userId
    	 * @throws SQLException
    	 */
    	public void removeUser(String [] userId) throws SQLException{
    		
    		String aString = null;
    		StringBuffer delSql = new StringBuffer();
    		
    		String userID = userId[0]; 
    	    String[] strarray = userID.split(","); 
    
    		// 将需要删除的 用户ID数组 循环装载到 StringBuffer中
    		if(strarray.length > 1) {
    			delSql.append("delete from t_user where user_id in (" + "'" + strarray[0] +"'");
    			for (int i = 1; i < strarray.length; i++) {
    				delSql.append(",")
    				.append("'")
    				.append(strarray[i])
    				.append("'")
    				.append(")");
    			}
    		}else {
    			delSql.append("delete from t_user where user_id in (" + "'" + strarray[0]+ "'" + ")");
    		}
    		
    		//delSql.append("delete from t_user where user_id in ('a12345','a1234')");    // 拼串示例效果
    		
    		Connection conn = null;
    		PreparedStatement patmt = null;
    		try {
    			conn = DbUtil.getConnection();
    			patmt = conn.prepareStatement(delSql.toString());
    			
    			patmt.executeUpdate();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			patmt.close();
    			conn.close();
    		}
    	}
           
            在DRP中,项目比较古典,由于没有使用hibernate、struts2等,使得项目比较紧凑,层与层之间还有较强的耦合性,代码混乱,逻辑紊乱的情况还是较明显。但正是对工具的泛泛使用,内容中对原理的结束又细致、反复,对servlet的内部流程有了较深的认识。很值得点赞!!!

    展开全文
  • java开发的代码规范

    千次阅读 2017-03-22 09:26:25
    java开发代码规范及部分注意事项

    java开发规范其实有很多内容的,在这里我只选一些我认为比较重要或者比较容易忽略的部分,主要是有点懒,大家别见怪啊。

    1.各层命名规约:

    A) Service/DAO 层方法命名规约
    1) 获取单个对象的方法用 get 做前缀。
    2) 获取多个对象的方法用 list 做前缀。
    3) 获取统计值的方法用 count 做前缀。
    4) 插入的方法用 save(推荐)或 insert 做前缀。
    5) 删除的方法用 remove(推荐)或 delete 做前缀。
    6) 修改的方法用 update 做前缀。
    B) 领域模型命名规约
    1) 数据对象:xxxDO,xxx 即为数据表名。
    2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
    3) 展示对象:xxxVO,xxx 一般为网页名称。
    4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。

    2. 【强制】大括号的使用约定

    如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则:
    1) 左大括号前不换行。
    2) 左大括号后换行。
    3) 右大括号前换行。
    4) 右大括号后还有 else 等代码则不换行;表示终止右大括号后必须换行。

    3. 【强制】括号内空格问题

    左括号和后一个字符之间不出现空格;同样,右括号和前一个字符之间也不出现空格。详见第 5 条下方正例提示。
    【强制】if/for/while/switch/do 等保留字与左右括号之间都必须加空格。
    【强制】任何运算符左右必须加一个空格。 说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运行符等。
    【强制】代码块缩进 4 个空格,如果使用 tab 缩进,请设置成 1 个 tab 为 4 个空格。
    正例:

    4.定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。

    5.关于基本数据类型与包装数据类型的使用标准

    如下:
    1) 所有的 POJO 类属性必须使用包装数据类型。
    2) RPC 方法的返回值和参数必须使用包装数据类型。
    3) 所有的局部变量推荐使用基本数据类型。

    6. 类内方法定义顺序

    依次是:公有方法或保护方法 > 私有方法 > getter/setter 方法。
    说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;而私有方法外部一般不需要特别关心,是一个黑盒实现;因为方法信息价值较低,所有 Service 和 DAO 的 getter/setter 方法放在类体最后。

    7.高度注意 Map 类集合 K/V 能不能存储 null 值

    如下表格:

    8.大括号问题

    在 if/else/for/while/do 语句中必须使用大括号,即使只有一行代码,避免使用下 面的形式:if (condition) statements;

    9.推荐尽量少用 else

    , if-else 的方式可以改写成:

    if(condition){             
     …            
     return obj;    
    }   

    // 接着写 else 的业务逻辑代码;
    说明:如果使用要 if-else if-else 方式表达逻辑,请勿超过 3 层,超过请使用状态设计模式。

    10.注释

    10.1类、类属性、类方法的注释必须使用 javadoc 规范,使用/*内容/格式,不得使用 //xxx 方式。
    说明:在 IDE 编辑窗口中,javadoc 方式会提示相关注释,生成 javadoc 可以正确输出相应注释;在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
    10.2所有的抽象方法(包括接口中的方法)必须要用 javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
    说明:如有实现和调用注意事项,请一并说明。
    10.3所有的类都必须添加创建者信息。

    11.后台输送给页面的变量

    后台输送给页面的变量必须加!varvar=null{var}会直接显示在页面上。

    12.注意 Math.random() 的返回类型

    Math.random() 这个方法返回是 double 类型,注意取值范围
    0≤x<1(能够取 到零值,注意除零异常),如果想获取整数类型的随机数,不要将 x 放大 10 的若干倍然后取整,直接使用 Random 对象的 nextInt 或者 nextLong 方法。

    13.获取当前毫秒数

    获取当前毫秒数:System.currentTimeMillis(); 而不是 new Date().getTime(); 说明:如果想获取更加精确的纳秒级时间值,用 System.nanoTime。在 JDK8 中,针对统计时间等场景,推荐使用 Instant 类。

    14.防止 NPE

    防止 NPE,是程序员的基本修养,注意 NPE 产生的场景:
    1) 返回类型为包装数据类型,有可能是 null,返回 int 值时注意判空。
    反例:public int f(){ return Integer 对象},如果为 null,自动解箱抛 NPE。
    2) 数据库的查询结果可能为 null。
    3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
    4) 远程调用返回对象,一律要求进行 NPE 判断。
    5) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。
    6) 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。

    15. DRY 原则

    避免出现重复的代码(Don’t Repeat Yourself),即 DRY 原则。
    说明:随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副本,容易遗漏。必要时抽取共性方法,或者抽象公共类,甚至是共用模块。
    正例:一个类中有多个 public 方法,都需要进行数行相同的参数校验操作,这个时候请抽取:

    private boolean checkParam(DTO dto){...}

    16.应用中的扩展日志命名方式

    如打点、临时监控、访问日志等:
    appName_logType_logName.log。logType:日志类型,推荐分类有 stats/desc/monitor/visit等;logName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。
    正例:mppserver 应用中单独监控时区转换异常,如:

    mppserver_monitor_timeZoneConvert.log 

    说明:推荐对日志进行分类,错误日志和业务日志尽量分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。

    17.toString方法重写

    输出的 POJO 类必须重写 toString 方法,否则只输出此对象的 hashCode 值(地址值),没啥 参考意义。

    18.表名、字段名

    必须使用小写字母或数字;禁止出现数字开头,禁止两个下划线中间只 出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

    正例:getter_admin,task_config,level3_name 
    反例:GetterAdmin,taskConfig,level_3_name 

    19.唯一索引名

    唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。 说明:uk_ 即 unique key;idx_ 即 index 的简称。

    20.表必备三字段

    表必备三字段:id, gmt_create, gmt_modified。 说明:
    其中 id 必为主键,类型为 unsigned bigint、单表时自增、步长为 1;分表时改为从TDDL Sequence 取值,确保分表之间的全局唯一。gmt_create, gmt_modified 的类型均为date_time 类型。

    21.字符存储长度

    合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
    正例:人的年龄用 unsigned tinyint(表示范围 0-255,人的寿命不会超过 255 岁);海龟就必须是 smallint,但如果是太阳的年龄,就必须是 int;如果是所有恒星的年龄都加起来,那么就必须使用 bigint。

    22.count(distinct col)

    计算该列除 NULL 之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0。

    23.NULL 值的判断

    使用 ISNULL()来判断是否为 NULL 值。注意:NULL 与任何值的直接比较都为 NULL。
    说明:
    1) NULL<>NULL 的返回结果是 NULL,不是 false。
    2) NULL=NULL 的返回结果是 NULL,不是 true。
    3) NULL<>1 的返回结果是 NULL,而不是 true。

    24.数据库表格查询

    在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。 说明:
    1)增加查询分析器解析成本。
    2)增减字段容易与 resultMap 配置不一致。

    25.xml 配置

    xml 配置中参数注意使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。

    26.@Transactional 事务不要滥用

    事务会影响数据库的 QPS,另外使用事务的地方需要 考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。

    27.不要用 resultClass 当返回参数

    即使所有类属性名与数据库字段一一对应,也需要 定义;反过来,每一个表也必然有一个与之对应;
    不允许直接拿 HashMap 与 HashTable 作为查询结果集的输出。
    说明:配置映射关系,使字段与 DO 类解耦,方便维护。
    反例:某同学为避免写一个,直接使用 HashTable 来接收数据库返回结果,结果出现日常是把 bigint 转成 Long 值,而线上由于数据库版本不一样,解析成 BigInteger,导致线上问题。

    展开全文
  • Java基础——java代码规范详细版

    万次阅读 多人点赞 2019-07-03 11:41:57
    Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以SUN Java标准为准。 1. 标识符命名规范 ...
  • MyBatis-Plus(十四)逻辑删除

    万次阅读 2020-07-23 09:38:20
    逻辑删除逻辑删除并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据中的一个逻辑删除字段置为删除状态。比如该数据有一个字段 deleted_flag,当其值为 0 表示未删除,值为 1 表示删除。那么...
  • MyBatis-Plus 之逻辑删除

    千次阅读 2020-10-16 11:47:38
    MyBatis-Plus 之逻辑删除实现 概念 逻辑删除:文件没有被真正的删除,只不过是文件名的第一个字节被改成操作系统无法识别的字符,通常这种删除操作是可逆的,就是说用适当的工具或软件可以把删除的文件恢复出来。 ...
  • 对于物理删除和逻辑删除

    千次阅读 2017-10-08 09:47:38
    一般基础数据都是逻辑删除 仅关联关系表使用物理删除.
  • tkmybatis逻辑删除踩坑原理详解

    千次阅读 2020-07-15 17:29:53
    tkmybatis逻辑删除踩坑原理详解逻辑删除示例(前景提要)QuestionSolution解决方法总结 逻辑删除示例(前景提要) 在实体类中加入@LogicDelete字段,表示在数据库中对这张对应的表进行逻辑删除。 Question 在引入 ...
  • JAVA代码优化

    千次阅读 2018-10-21 23:27:45
    一、类、方法、变量尽量指定final修饰 public static void test(){ final String x=&amp;amp;quot;1&amp;amp;...二、字符串拼接背后不一定是StringBuilder、上面代码没有用StringBuilde
  • 后台实现逻辑删除回收处理

    千次阅读 2018-01-05 22:55:20
    1.后台删除数据时一般不会真正的删除,而是将数据库中的某个字段更改标记为删除状态,实现逻辑删除; a class="link-recycle" art_id="{$val.art_id}" href="javascript:void(0)">删除a> script> $('.link-...
  • Java Web安全之代码审计

    千次阅读 2019-02-13 09:14:00
    通俗的说Java代码审计就是通过审计Java代码来发现Java应用程序自身中存在的安全问题,由于Java本身是编译型语言,所以即便只有class文件的情况下我们依然可以对Java代码进行审计。对于未编译的Java代码文件我们...
  • Java代码规范

    万次阅读 多人点赞 2018-01-10 10:06:02
    Java代码规范 本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以本文档为准。 1. ...
  • JAVA代码规范

    万次阅读 2016-06-08 15:19:46
    1. 介绍 为统一Java项目编码规范,提高可读性,特制定本规范。 本规范同样适用于Android项目。 本规范基于Google Java Style,...只要有一定逻辑性即可,不做严格限制。但要求未使用的import语句必须删除 对Androi
  • 在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,而mybatis-plus正好也提供了这一功能,在第一节中生成代码的时候,我们指定了逻辑删除字段的值,代码如下: StrategyConfig sc = new ...
  • Google Java代码规范

    千次阅读 2018-03-09 16:09:59
    原文地址:https://google.github.io/styleguide/javaguide.htmlGIthub上GoogleCode风格的配置文件(支持Eclipse IDE和IntelliJ IDE):...-styleguide1简介本文档作为Java编程语言中源代码的Google编码标准的完整定义...
  • java代码执行速度问题

    千次阅读 2016-11-09 18:45:13
    java代码执行速度问题
  • Mybatis plus逻辑删除失败的BUG

    千次阅读 2018-10-15 17:37:53
    开发调试的时候发现Mybatis Plus的逻辑删除失效了,看了下配置文件发现没有问题,通过查看以下源码发现 逻辑删除需要注入的bean,查看这个bean的源码如下 查看其中一个实例的类的源码,如通过ID逻辑删除...
  • javaparser 我最喜欢的事情之一是解析代码... 作为JavaParser的贡献者,我反复阅读了一些有关从Java代码提取信息的非常相似的问题。 因此,我认为我可以帮助提供一些简单的示例,以帮助您开始解析Java代码。 Gi...
  • JAVA代码效率优化

    千次阅读 2015-01-04 13:54:46
    代码只是实现了功能,至于效率高不高没怎么关注,这应该是JAVA程序员进阶的时候需要考虑的问题,不再是单纯的实现功能,也不是完全依赖GC而不关注内存中发生了什么,而要考虑到代码的性能。下面是网上找的一篇关于...
  • 通过安卓修改大师可以很轻松的在任何apk中添加新的代码逻辑,实现额外添加的功能,本次教程通过对一款名为“VMware Horizon”的软件进行反编译,实现在登录界面添加自动登录功能(该登录界面之前已经有自动登录功能...
  • JAVA 代码实现链表

    千次阅读 2019-09-27 19:27:43
    JAVA 代码实现链表
  • 数据库数据物理删除和逻辑删除

    万次阅读 2018-11-02 22:09:06
    今天负责的项目,有个重要的表数据被某个同事写的业务代码给delete删除了,导致系统一直报空指针异常告警。然后,运维那边MySQL的bin log设置的没6个小时生成一次,恰巧要等一段时间,客户着急做业务,幸好从阿里云...
  • 我最喜欢的事情之一是解析... 作为JavaParser的贡献者,我反复阅读了一些非常类似的问题,这些问题涉及从Java代码提取信息。 因此,我认为我可以帮助提供一些简单的示例,以帮助您开始解析Java代码。 Github上提...
  • Java代码规范编程

    千次阅读 2013-10-30 17:18:59
    1、代码注释规范 【情景一】在接口类添加方法注释  对接口的方法加以说明是相当有必要的,方法的作用、参数的名称、以及返回类型都需要做出明确的定义。如果接口添加了完整的注释,在它的实现类基本上都不需要注释...
  • java定时删除日志

    千次阅读 2017-09-28 18:04:01
    其中的Quartz管理工具 该类参考网络代码  package my.ceshi.data.deletelog; import java.text.ParseException; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Schedul
  • 史上最全的Java代码规范

    千次阅读 多人点赞 2018-12-28 21:28:09
    不管学习什么,头脑里要有一定的规范,这样才能形成自己逻辑,命名好自己的代码,也是不但为了自己,而且为了别人更好的定位你这个人的人品,以及个人的能力。没有学习好的同学,跟着我的脚步,学习Java的命名规范,...
  • Java代码优化提点

    万次阅读 2013-10-30 11:04:16
    程序代码可以是中间代码,也可以是目标代码。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码更加轻松自如(运行时间更短、占用空间更小)地工作,时空效率优化。 ...
  • java优化代码常见套路

    万次阅读 多人点赞 2019-12-28 11:32:03
    程序员的痛点(烂代码) 每次做完项目之后,自己想重新回顾一下以前写的代码,整理出一些东西,却发现如同看天书一般,头晕眼花,完全感觉不像自己的写的代码,辣眼睛 所以为了爱护本人的眼睛,所以觉得很有必要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 229,007
精华内容 91,602
关键字:

java逻辑删除代码

java 订阅