车子的个人博客

正确的事情通常都是优雅的

JPA开发经验总结

Repository

1
2
3
4
5
public interface UserRepository extends JpaRepository<User, Long> {
// 自动实现CRUD
Optional<User> findByUsername(String username);
List<User> findByAgeGreaterThan(int age);
}

复杂查询

1
2
3
4
5
@Query("SELECT u FROM User u WHERE u.username = ?1")
User findByNameCustom(String name);

@Query(value = "SELECT * FROM user WHERE name = :name", nativeQuery = true)
User findByNameNative(@Param("name") String name);

事务

1
2
@Transactional
public void save(User user) {}

总结

JPA简化了数据访问层的开发。

Java并发编程读书笔记三:并发工具类

CountDownLatch

1
2
3
CountDownLatch latch = new CountDownLatch(3);
latch.countDown();
latch.await();

CyclicBarrier

1
2
CyclicBarrier barrier = new CyclicBarrier(3);
barrier.await();

Semaphore

1
2
3
Semaphore semaphore = new Semaphore(2);
semaphore.acquire();
semaphore.release();

总结

并发工具类简化了多线程协作的实现。

Servlet生命周期详解

生命周期阶段

  1. 初始化:init()
  2. 服务:service()
  3. 销毁:destroy()

执行流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 初始化
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) {
// 处理请求
}

@Override
public void destroy() {
// 销毁
}
}

总结

理解生命周期有助于资源管理和性能优化。

Java容器详解

Collection接口

List

  • ArrayList:数组实现,查询快,增删慢
  • LinkedList:链表实现,增删快,查询慢
  • Vector:同步ArrayList
1
2
3
4
List<String> list = new ArrayList<>();
list.add("a");
list.get(0);
list.remove(0);

Set

  • HashSet:哈希表,无序唯一
  • LinkedHashSet:保持插入顺序
  • TreeSet:红黑树,有序唯一
1
2
Set<String> set = new HashSet<>();
set.add("a");

Queue

  • LinkedList实现了Queue
  • PriorityQueue:优先级队列
  • BlockingQueue:阻塞队列

Map接口

  • HashMap:JDK1.8后用红黑树
  • LinkedHashMap:保持插入顺序
  • TreeMap:红黑树,有序
  • Hashtable:同步
1
2
3
4
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.get("a");
map.containsKey("a");

迭代器

1
2
3
4
5
6
7
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
}

// for-each
for (String s : list) {}

总结

Java容器是日常开发中最常用的类,需要根据场景选择合适的实现。

Java并发编程读书笔记二:同步机制

synchronized

1
2
3
4
5
// 同步方法
public synchronized void method() {}

// 同步代码块
synchronized(obj) {}

volatile

  • 保证可见性
  • 禁止指令重排序
  • 不保证原子性

Lock接口

1
2
3
4
5
6
7
Lock lock = new ReentrantLock();
lock.lock();
try {
// 临界区
} finally {
lock.unlock();
}

总结

同步机制是保证线程安全的基础。

Open EntityManager in View模式

什么是Open EntityManager in View

在Web请求过程中保持EntityManager开启,解决懒加载问题。

配置

1
2
3
spring:
jpa:
open-in-view: true # 默认开启

问题

  • 数据库连接长时间占用
  • 可能导致连接池耗尽

建议

  • 生产环境关闭
  • 使用EntityGraph或JOIN FETCH解决懒加载

总结

开发时方便,生产需关闭。

Java并发编程读书笔记一:线程基础

线程状态

  • NEW:新建
  • RUNNABLE:可运行
  • BLOCKED:阻塞
  • WAITING:等待
  • TIMED_WAITING:限时等待
  • TERMINATED:终止

创建线程

1
2
3
4
5
6
7
8
9
10
11
// 继承Thread
class MyThread extends Thread {
@Override
public void run() {}
}

// 实现Runnable
class MyRunnable implements Runnable {
@Override
public void run() {}
}

线程方法

  • start():启动线程
  • run():执行逻辑
  • join():等待结束
  • sleep():休眠
  • yield():让步

线程安全

  • 原子性
  • 可见性
  • 有序性

总结

理解线程基础是并发编程的第一步。

Hibernate级联删除问题

问题

配置了CascadeType.REMOVE,但删除父实体时子实体未删除。

原因

  • 可能是orphanRemoval配置
  • 可能是懒加载导致

解决方案

1
2
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> children;

总结

需要同时配置cascade和orphanRemoval。

hashcode和equals关系详解

equals方法

默认实现是比较对象引用,子类通常需要重写。

1
2
3
4
5
6
7
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return Objects.equals(id, user.id) && Objects.equals(name, user.name);
}

hashCode方法

返回对象的哈希码,用于哈希表(如HashMap)快速查找。

1
2
3
4
@Override
public int hashCode() {
return Objects.hash(id, name);
}

关系规则

  • 一致性:equals比较为true时,hashCode必须相同
  • 效率:hashCode相同,equals不一定为true

在集合中的使用

1
2
3
// HashMap先比较hashCode,再比较equals
Map<User, String> map = new HashMap<>();
map.put(new User(1, "Tom"), "value");

总结

重写equals必须重写hashCode,以保证在集合中的正确性。

Spring配置文件整理

常用配置

1
2
3
4
5
6
7
8
9
spring:
datasource:
url: jdbc:mysql://localhost:3306/db
username: root
password: 123456
jpa:
show-sql: true
hibernate:
ddl-auto: update

多环境配置

1
2
3
spring:
profiles:
active: dev

总结

配置文件是应用运行的基础。

0%