美文网首页
数据访问

数据访问

作者: PC_Repair | 来源:发表于2018-07-23 19:15 被阅读13次

    一、使用JdbcTemplate访问数据库

    pom.xml文件配置

    • 引入jdbc支持
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    
    • 引入MySQL连接依赖包
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>
    

    注意:版本不对可能连不上MySQL

    • src/main/resources/application.properties配置数据源信息
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    

    其中test为数据库名称,3306为默认的端口号。

    使用SpringBoot测试类进行测试
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class SpringbootTestApplicationTests {
        @Autowired
        private UserService userService;  //使用UserServiceImpl也行
    
        @Before
        public void setUp() {
            userService.deleteAllUsers();
            System.out.println("清空user表");
        }
    
        @Test
        public void test() throws Exception {
            System.out.println("插入5个用户");
            userService.create("a", 1);
            userService.create("b", 2);
            userService.create("c", 3);
            userService.create("d", 4);
            userService.create("e", 5);
            // 查数据库,应该有5个用户
            Assert.assertEquals(5, userService.getAllUsers().intValue());
            // 删除两个用户
            userService.deleteByName("a");
            userService.deleteByName("e");
            // 查数据库,应该有5个用户
            Assert.assertEquals(3, userService.getAllUsers().intValue());
        }
    }
    
    UserService类实现
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public void create(String name, Integer age) {
            jdbcTemplate.update("insert into USER(NAME, AGE ) values(?, ?)", name, age);
        }
    
        @Override
        public void deleteByName(String name) {
            jdbcTemplate.update("delete from USER where NAME = ?", name);
        }
    
        @Override
        public Integer getAllUsers() {
            return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);
        }
    
        @Override
        public void deleteAllUsers() {
            jdbcTemplate.update("delete from USER");
        }
    
    UserService 接口
    public interface UserService {
        void create(String name, Integer age);
        void deleteByName(String name);
        Integer getAllUsers();
        void deleteAllUsers();
    }
    
    在命令行查询的结果
    asd.png

    二、使用Spring-data-jpa访问数据库

    pom.xml文件配置

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    • src/main/resources/application.properties配置数据源信息

    在上述一中增加如下配置:

    spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop
    

    Spring-data-jpa依赖于Hibernate,spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

    • create:每次加载hibernate时都会删除上一次生成的表,然后根据你的model类再重新生成新表,两次没有任何改变也会这样执行。
    • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
    • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
    • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
    示例:

    创建实体:

    @Entity
    public class User {
        @Id
        @GeneratedValue
        private Long id;
        @Column(nullable = true)
        private String name;
        @Column(nullable = true)
        private Integer age;
    
        public User(){}  //需要默认构造函数,否则可能会报错
    
        public User(String name, Integer age){
            this.name = name;
            this.age = age;
        }
    
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
    
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    
        public Integer getAge() { return age; }
        public void setAge(Integer age) { this.age = age; }
    }
    

    创建数据访问接口:

    public interface UserRepository extends JpaRepository<User, Long> {
        //jpa特性:通过解析方法名创建查询
        User findByName(String name);
        User findByNameAndAge(String name, Integer age);
        //@Query注解来创建查询,需编写JPQL语句
        @Query("from User u where u.name=:name")
        User findUser(@Param("name") String name);
    }
    

    单元测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(Application.class)
    public class ApplicationTests {
    
        @Autowired//用来给指定的字段或方法注入所需的外部资源
        private UserRepository userRepository;
    
        @Test
        public void test() throws Exception {
    
            // 创建10条记录
            userRepository.save(new User("AAA", 10));
            userRepository.save(new User("BBB", 20));
            userRepository.save(new User("CCC", 30));
            userRepository.save(new User("DDD", 40));
            userRepository.save(new User("EEE", 50));
            userRepository.save(new User("FFF", 60));
            userRepository.save(new User("GGG", 70));
            userRepository.save(new User("HHH", 80));
            userRepository.save(new User("III", 90));
            userRepository.save(new User("JJJ", 100));
    
            // 测试findAll, 查询所有记录
            Assert.assertEquals(10, userRepository.findAll().size());
    
            // 测试findByName, 查询姓名为FFF的User
            Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());
    
            // 测试findUser, 查询姓名为FFF的User
            Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());
    
            // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User
            Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());
    
            // 测试删除姓名为AAA的User
            userRepository.delete(userRepository.findByName("AAA"));
    
            // 测试findAll, 查询所有记录, 验证上面的删除是否成功
            Assert.assertEquals(9, userRepository.findAll().size());
        }
    }
    

    相关文章

      网友评论

          本文标题:数据访问

          本文链接:https://www.haomeiwen.com/subject/jeajmftx.html