问:说说SpringDAO及ORM的用法?

一、SpringDao组件概述

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

二、SpringDao组件的基本用法

1. 添加依赖

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

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2. 配置数据源

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

XML 复制代码
<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接口,用于声明数据访问的方法。例如:

Java 复制代码
public interface UserDao {
    User getUserById(int id);
    void addUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

4. 实现DAO接口

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

Java 复制代码
@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组件。例如:

XML 复制代码
<context:component-scan base-package="com.example.dao"/>

6. 使用DAO

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

Java 复制代码
@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的依赖:

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

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

.properties 复制代码
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注解来映射数据库表。例如:

Java 复制代码
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的接口,并指定实体类。例如:

Java 复制代码
import org.springframework.data.jpa.repository.JpaRepository;

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

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

Java 复制代码
@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的依赖:

XML 复制代码
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.21.Final</version>
</dependency>
2.2 配置Hibernate

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

XML 复制代码
<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注解来映射数据库表。例如:

Java 复制代码
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接口,并创建一个实现类来执行数据库操作。例如:

Java 复制代码
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的依赖:

XML 复制代码
<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的相关属性。例如:

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

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

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

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

Java 复制代码
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 复制代码
<?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,并使用其提供的方法进行数据库操作。例如:

Java 复制代码
@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组件的基本用法和常见异常处理方式是至关重要的。

相关推荐
是桃萌萌鸭~1 小时前
mysqldbcompare 使用及参数详解
数据库·mysql
gma9991 小时前
brpc 与 Etcd 二次封装
数据库·c++·rpc·etcd
Yz98761 小时前
hive复杂数据类型Array & Map & Struct & 炸裂函数explode
大数据·数据库·数据仓库·hive·hadoop·数据库开发·big data
小鹿撞出了脑震荡1 小时前
SQLite3语句以及用实现FMDB数据存储的学习
数据库·学习·sqlite
小草儿7991 小时前
gbase8s之mysql的show命令实现
数据库·mysql
斯普信专业组1 小时前
MongoDB调优利器:掌握性能分析工具mongostat
数据库·mongodb·mongostat
.2 小时前
接口 测试
数据库·oracle
请叫我青哥2 小时前
第五十二条:谨慎使用重载
java·spring
码到成功>_<2 小时前
Spring Boot实现License生成和校验
数据库·spring boot·后端
boy快快长大3 小时前
将大模型生成数据存入Excel,并用增量的方式存入Excel
java·数据库·excel