当前位置: 首页 > article >正文

问:说说SpringDAO及ORM的用法?

一、SpringDao组件概述

在Spring框架中,DAO(Data Access Object)组件用于实现与数据库交互的数据访问操作。Spring提供了多种方式来使用DAO,包括JdbcTemplate、HibernateTemplate以及Spring Data JPA等。这些工具简化了数据库操作,提高了开发效率,并减少了代码复杂性。

二、SpringDao组件的基本用法

1. 添加依赖

首先,需要在项目的构建文件中添加Spring JDBC的依赖。例如,对于Maven项目,可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2. 配置数据源

在Spring的配置文件中配置数据源(DataSource),用于连接数据库。例如:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
</bean>

3. 创建DAO接口

定义一个DAO接口,用于声明数据访问的方法。例如:

public interface UserDao {
    User getUserById(int id);
    void addUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

4. 实现DAO接口

创建一个DAO的实现类,实现DAO接口中定义的方法。例如:

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public User getUserById(int id) {
        String sql = "SELECT id, name, email FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    @Override
    public void addUser(User user) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }

    @Override
    public void updateUser(User user) {
        String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";
        jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getId());
    }

    @Override
    public void deleteUser(int id) {
        String sql = "DELETE FROM users WHERE id = ?";
        jdbcTemplate.update(sql, id);
    }
}

5. 配置组件扫描

在Spring的配置文件中配置组件扫描,以便能够自动发现和注册DAO组件。例如:

<context:component-scan base-package="com.example.dao"/>

6. 使用DAO

在需要使用DAO的地方,通过@Autowired注解将DAO引入到其他类中,即可使用DAO提供的数据访问方法。例如:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public User getUserById(int id) {
        return userDao.getUserById(id);
    }

    public void addUser(User user) {
        userDao.addUser(user);
    }

    // 其他方法...
}

三、不同ORM的SpringDao用法

1. Spring Data JPA

Spring Data JPA是Spring对JPA(Java Persistence API)的封装和扩展,通过简单的接口和注解,可以实现自动生成SQL语句、事务管理等功能。

1.1 添加依赖

在项目的pom.xml文件中添加Spring Data JPA的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
1.2 配置数据源和JPA属性

application.propertiesapplication.yml文件中配置数据源和JPA相关属性:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
1.3 创建实体类

定义实体类,并使用JPA注解来映射数据库表。例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user")
public class User {
    @Id
    private Long id;
    private String name;
    private Integer age;
    // 其他字段及getter和setter方法
}
1.4 创建仓库接口

创建一个继承自JpaRepositoryCrudRepository的接口,并指定实体类。例如:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 可以在这里定义自定义查询方法
}
1.5 使用仓库

在服务层注入仓库,并使用其提供的方法进行数据库操作。例如:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    // 其他服务方法...
}

2. Hibernate

Hibernate是一个流行的ORM框架,Spring提供了对Hibernate的良好支持。

2.1 添加依赖

在项目的pom.xml文件中添加Hibernate的依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.21.Final</version>
</dependency>
2.2 配置Hibernate

在Spring的配置文件中配置Hibernate的SessionFactory。例如:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.example.entity"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>
2.3 创建实体类

使用Hibernate注解来映射数据库表。例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user")
public class User {
    @Id
    private Long id;
    private String name;
    private Integer age;
    // 其他字段及getter和setter方法
}
2.4 创建DAO接口和实现类

定义一个DAO接口,并创建一个实现类来执行数据库操作。例如:

public interface UserDao {
    User getUserById(Long id);
    void addUser(User user);
    void updateUser(User user);
    void deleteUser(Long id);
}

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public User getUserById(Long id) {
        return sessionFactory.getCurrentSession().get(User.class, id);
    }

    @Override
    public void addUser(User user) {
        sessionFactory.getCurrentSession().save(user);
    }

    @Override
    public void updateUser(User user) {
        sessionFactory.getCurrentSession().update(user);
    }

    @Override
    public void deleteUser(Long id) {
        User user = sessionFactory.getCurrentSession().load(User.class, id);
        sessionFactory.getCurrentSession().delete(user);
    }
}

3. MyBatis

MyBatis是一个基于Java的持久层框架,通过XML或注解的方式将SQL语句与Java代码分离。

3.1 添加依赖

在项目的pom.xml文件中添加MyBatis的依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>
3.2 配置MyBatis

application.propertiesapplication.yml文件中配置MyBatis的相关属性。例如:

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
3.3 创建实体类

定义实体类,并使用MyBatis注解或XML映射文件来映射数据库表。例如:

public class User {
    private Long id;
    private String name;
    private Integer age;
    // getter和setter方法
}
3.4 创建Mapper接口和XML映射文件

定义一个Mapper接口,并创建一个对应的XML映射文件来定义SQL语句。例如:

public interface UserMapper {
    User selectUserById(@Param("id") Long id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(@Param("id") Long id);
}

对应的XML映射文件UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser" parameterType="com.example.entity.User">
        INSERT INTO user (name, age) VALUES (#{name}, #{age})
    </insert>
    <update id="updateUser" parameterType="com.example.entity.User">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUser" parameterType="long">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>
3.5 使用Mapper

在服务层注入Mapper,并使用其提供的方法进行数据库操作。例如:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.selectUserById(id);
    }

    public void addUser(User user) {
        userMapper.insertUser(user);
    }

    // 其他服务方法...
}

四、SpringDao组件的常见异常类型及处理方式

在Spring Framework中,DAO层通常会抛出各种数据访问相关的异常。以下是一些常见的异常类型及其简要描述和处理方式:

1. DataAccessException

  • 描述:Spring框架中所有数据访问异常的通用父异常。它捕获了底层数据访问技术(如JDBC、Hibernate、JPA等)可能抛出的异常,并提供了一个一般性的异常类型,以便在DAO层捕获和处理这些异常。
  • 处理方式:在DAO层捕获DataAccessException,并根据具体异常类型进行相应处理。例如,可以记录日志、回滚事务或向用户返回错误信息等。

2. DuplicateKeyException

  • 描述:当尝试在数据库中插入具有唯一约束的数据,并且已经存在具有相同唯一键值的记录时,将引发此异常。通常对应于SQL中的唯一键冲突。
  • 处理方式:在插入数据前检查是否已存在相同键值的记录,或者捕获DuplicateKeyException并提示用户该键值已存在。

3. DataIntegrityViolationException

  • 描述:表示数据库约束完整性的违反,如外键约束、非空约束等。当数据库操作违反了这些约束时,将抛出此异常。
  • 处理方式:检查数据库操作是否违反了约束条件,并在必要时修改数据或业务逻辑以避免此类异常。

4. UncategorizedSQLException

  • 描述:一个通用的SQL异常,用于表示在执行SQL操作时发生的未分类的问题。通常,这种异常包含有关底层数据库错误的详细信息。
  • 处理方式:根据异常信息诊断问题原因,并采取相应的修复措施。例如,可能是SQL语句语法错误或数据库连接问题。

5. InvalidDataAccessApiUsageException

  • 描述:表示在使用Spring的数据访问API时发生的非法操作。例如,使用不支持的特性或方法可能会引发此异常。
  • 处理方式:检查API使用方法是否正确,并确保遵循Spring数据访问API的规范。

6. TransientDataAccessResourceException

  • 描述:当底层数据资源(例如数据库服务器)出现临时问题时,可能会抛出此异常。通常,这是一个短暂的错误,可以尝试重新执行操作。
  • 处理方式:捕获此异常并重试操作,或者向用户提示稍后再试。

7. ObjectOptimisticLockingFailureException

  • 描述:用于表示在乐观锁定机制下的并发冲突。当两个或多个客户端尝试同时修改相同的数据时,可能会发生此异常。
  • 处理方式:实现冲突解决策略,如提示用户重新加载数据并再次尝试提交更改。

8. IncorrectResultSizeDataAccessException

  • 描述:当查询的结果集大小与预期不符时,将抛出此异常。例如,期望只有一个结果但查询返回多个结果时,或者期望多个结果但查询只返回一个结果时。
  • 处理方式:检查查询条件和逻辑,确保查询结果符合预期。

9. EmptyResultDataAccessException

  • 描述:当查询未返回任何结果但期望至少有一个结果时,将抛出此异常。
  • 处理方式:处理空结果集的情况,例如返回默认值或向用户提示未找到数据。

10. CannotAcquireLockException

  • 描述:在尝试获取锁时失败时抛出此异常,例如在数据库事务中无法获得锁定资源时。
  • 处理方式:实现重试逻辑或调整事务隔离级别以减少锁竞争。

五、结尾

SpringDao组件是Spring框架中用于实现数据访问操作的重要部分。通过集成不同的ORM框架(如JPA、Hibernate、MyBatis等),SpringDao组件提供了灵活且强大的数据访问能力。在实际开发中,了解并掌握SpringDao组件的基本用法和常见异常处理方式是至关重要的。


http://www.kler.cn/a/397229.html

相关文章:

  • [Admin] Dashboard Filter for Mix Report Types
  • JDBC-Mysql 时区问题详解
  • 栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)
  • 【服务器】本地安装X11 服务器-Windows
  • 【快捷入门笔记】mysql基本操作大全-SQL表
  • 云服务器端口开放
  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中
  • Spring Boot基础教学:创建第一个Spring Boot项目
  • 背景替换大模型图像处理gradio部署服务
  • Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件
  • 革新人脸图片智能修复
  • 【算法】【优选算法】前缀和(上)
  • ‌REST风格(Representational State Transfer)
  • 神经网络的正则化(一)
  • 设计模式:工厂方法模式和策略模式
  • “南海明珠”-黄岩岛(民主礁)领海基线WebGIS绘制实战
  • C# x Unity 从玩家控制类去分析命令模式该如何使用
  • 精通rust宏系列教程-调试过程宏
  • stm32 内部温度传感器使用
  • 封装一个省市区的筛选组件
  • 【提高篇】3.3 GPIO(三,工作模式详解 上)
  • MuMu模拟器安卓12安装Xposed 框架
  • python爬虫快速获取商品历史价格信息
  • Ubuntu 系统端口查询与管理详细分析
  • linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
  • mongoDB的安装及使用