问:说说SpringDAO及ORM的用法?

打印 上一主题 下一主题

主题 1860|帖子 1860|积分 5580

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、SpringDao组件概述

在Spring框架中,DAO(Data Access Object)组件用于实现与数据库交互的数据访问操作。Spring提供了多种方式来利用DAO,包括JdbcTemplate、HibernateTemplate以及Spring Data JPA等。这些工具简化了数据库操作,进步了开辟服从,并减少了代码复杂性。
二、SpringDao组件的基本用法

1. 添加依赖

首先,需要在项目标构建文件中添加Spring JDBC的依赖。例如,对于Maven项目,可以在pom.xml文件中添加以下依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>
复制代码
2. 配置数据源

在Spring的配置文件中配置数据源(DataSource),用于毗连数据库。例如:
  1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  2.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  3.     <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
  4.     <property name="username" value="username"/>
  5.     <property name="password" value="password"/>
  6. </bean>
复制代码
3. 创建DAO接口

界说一个DAO接口,用于声明数据访问的方法。例如:
  1. public interface UserDao {
  2.     User getUserById(int id);
  3.     void addUser(User user);
  4.     void updateUser(User user);
  5.     void deleteUser(int id);
  6. }
复制代码
4. 实现DAO接口

创建一个DAO的实现类,实现DAO接口中界说的方法。例如:
  1. @Repository
  2. public class UserDaoImpl implements UserDao {
  3.     @Autowired
  4.     private JdbcTemplate jdbcTemplate;
  5.     @Override
  6.     public User getUserById(int id) {
  7.         String sql = "SELECT id, name, email FROM users WHERE id = ?";
  8.         return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
  9.     }
  10.     @Override
  11.     public void addUser(User user) {
  12.         String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
  13.         jdbcTemplate.update(sql, user.getName(), user.getEmail());
  14.     }
  15.     @Override
  16.     public void updateUser(User user) {
  17.         String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";
  18.         jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getId());
  19.     }
  20.     @Override
  21.     public void deleteUser(int id) {
  22.         String sql = "DELETE FROM users WHERE id = ?";
  23.         jdbcTemplate.update(sql, id);
  24.     }
  25. }
复制代码
5. 配置组件扫描

在Spring的配置文件中配置组件扫描,以便可以或许主动发现和注册DAO组件。例如:
  1. <context:component-scan base-package="com.example.dao"/>
复制代码
6. 利用DAO

在需要利用DAO的地方,通过@Autowired注解将DAO引入到其他类中,即可利用DAO提供的数据访问方法。例如:
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private UserDao userDao;
  5.     public User getUserById(int id) {
  6.         return userDao.getUserById(id);
  7.     }
  8.     public void addUser(User user) {
  9.         userDao.addUser(user);
  10.     }
  11.     // 其他方法...
  12. }
复制代码
三、不同ORM的SpringDao用法

1. Spring Data JPA

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

在项目标pom.xml文件中添加Spring Data JPA的依赖:
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
复制代码
1.2 配置数据源和JPA属性

在application.properties或application.yml文件中配置数据源和JPA相干属性:
  1. spring.datasource.url=jdbc:mysql://localhost:3306/your_database
  2. spring.datasource.username=your_username
  3. spring.datasource.password=your_password
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.jpa.hibernate.ddl-auto=update
  6. spring.jpa.show-sql=true
  7. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
复制代码
1.3 创建实体类

界说实体类,并利用JPA注解来映射数据库表。例如:
  1. import javax.persistence.Entity;
  2. import javax.persistence.Id;
  3. import javax.persistence.Table;
  4. @Entity
  5. @Table(name = "user")
  6. public class User {
  7.     @Id
  8.     private Long id;
  9.     private String name;
  10.     private Integer age;
  11.     // 其他字段及getter和setter方法
  12. }
复制代码
1.4 创建堆栈接口

创建一个继续自JpaRepository或CrudRepository的接口,并指定实体类。例如:
  1. import org.springframework.data.jpa.repository.JpaRepository;
  2. public interface UserRepository extends JpaRepository<User, Long> {
  3.     // 可以在这里定义自定义查询方法
  4. }
复制代码
1.5 利用堆栈

在服务层注入堆栈,并利用其提供的方法举行数据库操作。例如:
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private UserRepository userRepository;
  5.     public User findById(Long id) {
  6.         return userRepository.findById(id).orElse(null);
  7.     }
  8.     // 其他服务方法...
  9. }
复制代码
2. Hibernate

Hibernate是一个盛行的ORM框架,Spring提供了对Hibernate的良好支持。
2.1 添加依赖

在项目标pom.xml文件中添加Hibernate的依赖:
  1. <dependency>
  2.     <groupId>org.hibernate</groupId>
  3.     <artifactId>hibernate-core</artifactId>
  4.     <version>5.4.21.Final</version>
  5. </dependency>
复制代码
2.2 配置Hibernate

在Spring的配置文件中配置Hibernate的SessionFactory。例如:
  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  2.     <property name="dataSource" ref="dataSource"/>
  3.     <property name="packagesToScan" value="com.example.entity"/>
  4.     <property name="hibernateProperties">
  5.         <props>
  6.             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
  7.             <prop key="hibernate.show_sql">true</prop>
  8.         </props>
  9.     </property>
  10. </bean>
复制代码
2.3 创建实体类

利用Hibernate注解来映射数据库表。例如:
  1. import javax.persistence.Entity;
  2. import javax.persistence.Id;
  3. import javax.persistence.Table;
  4. @Entity
  5. @Table(name = "user")
  6. public class User {
  7.     @Id
  8.     private Long id;
  9.     private String name;
  10.     private Integer age;
  11.     // 其他字段及getter和setter方法
  12. }
复制代码
2.4 创建DAO接口和实现类

界说一个DAO接口,并创建一个实现类来实验数据库操作。例如:
  1. public interface UserDao {
  2.     User getUserById(Long id);
  3.     void addUser(User user);
  4.     void updateUser(User user);
  5.     void deleteUser(Long id);
  6. }
  7. @Repository
  8. public class UserDaoImpl implements UserDao {
  9.     @Autowired
  10.     private SessionFactory sessionFactory;
  11.     @Override
  12.     public User getUserById(Long id) {
  13.         return sessionFactory.getCurrentSession().get(User.class, id);
  14.     }
  15.     @Override
  16.     public void addUser(User user) {
  17.         sessionFactory.getCurrentSession().save(user);
  18.     }
  19.     @Override
  20.     public void updateUser(User user) {
  21.         sessionFactory.getCurrentSession().update(user);
  22.     }
  23.     @Override
  24.     public void deleteUser(Long id) {
  25.         User user = sessionFactory.getCurrentSession().load(User.class, id);
  26.         sessionFactory.getCurrentSession().delete(user);
  27.     }
  28. }
复制代码
3. MyBatis

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

在项目标pom.xml文件中添加MyBatis的依赖:
  1. <dependency>
  2.     <groupId>org.mybatis.spring.boot</groupId>
  3.     <artifactId>mybatis-spring-boot-starter</artifactId>
  4.     <version>2.1.4</version>
  5. </dependency>
复制代码
3.2 配置MyBatis

在application.properties或application.yml文件中配置MyBatis的相干属性。例如:
  1. mybatis.mapper-locations=classpath:mapper/*.xml
  2. mybatis.type-aliases-package=com.example.entity
复制代码
3.3 创建实体类

界说实体类,并利用MyBatis注解或XML映射文件来映射数据库表。例如:
  1. public class User {
  2.     private Long id;
  3.     private String name;
  4.     private Integer age;
  5.     // getter和setter方法
  6. }
复制代码
3.4 创建Mapper接口和XML映射文件

界说一个Mapper接口,并创建一个对应的XML映射文件来界说SQL语句。例如:
  1. public interface UserMapper {
  2.     User selectUserById(@Param("id") Long id);
  3.     void insertUser(User user);
  4.     void updateUser(User user);
  5.     void deleteUser(@Param("id") Long id);
  6. }
复制代码
对应的XML映射文件UserMapper.xml:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.mapper.UserMapper">
  4.     <select id="selectUserById" resultType="com.example.entity.User">
  5.         SELECT * FROM user WHERE id = #{id}
  6.     </select>
  7.     <insert id="insertUser" parameterType="com.example.entity.User">
  8.         INSERT INTO user (name, age) VALUES (#{name}, #{age})
  9.     </insert>
  10.     <update id="updateUser" parameterType="com.example.entity.User">
  11.         UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
  12.     </update>
  13.     <delete id="deleteUser" parameterType="long">
  14.         DELETE FROM user WHERE id = #{id}
  15.     </delete>
  16. </mapper>
复制代码
3.5 利用Mapper

在服务层注入Mapper,并利用其提供的方法举行数据库操作。例如:
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private UserMapper userMapper;
  5.     public User getUserById(Long id) {
  6.         return userMapper.selectUserById(id);
  7.     }
  8.     public void addUser(User user) {
  9.         userMapper.insertUser(user);
  10.     }
  11.     // 其他服务方法...
  12. }
复制代码
四、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组件的基本用法和常见异常处理方式是至关重要的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表