SpringData入门(一)-使用传统方式访问数据库

    xiaoxiao2023-10-21  163

    一.导学

    什么是SpringData?

    主旨:提供一个熟悉的、一致的,基于Spring框架的数据访问框架。简化数据库的访问官网 https://spring.io/projects/spring-data

    Spring Data包含多个子项目 Spring Data JPA:减少我们数据访问层的开发量Spring Data Mongo DBSpring Data RedisSpring Data Solr

    二.使用传统方式访问数据库

    使用JDBC访问数据库使用Spring提供的JdbcTemplate访问数据库
    1.使用JDBC访问数据库
    创建一个maven项目,导入依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 数据库驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- 单元测试依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> 开发JDBCUtil工具类 获取Connection关闭Connection、Statement、ResultSet public class JDBCUtils { public static Connection getConnection() throws Exception { //不建议这种硬编码 /* String url = "jdbc:mysql:///springdata"; String user = "root"; String password = "123456"; String driverClass = "com.mysql.jdbc.Driver";*/ InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(in); String url = properties.getProperty("jdbc.url"); String user = properties.getProperty("jdbc.user"); String password = properties.getProperty("jdbc.password"); String driverClass = properties.getProperty("jdbc.driverClass"); Class.forName(driverClass); return DriverManager.getConnection(url,user,password); } public static void release(Connection connection, Statement statement, ResultSet resultSet){ if(connection!=null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } } db.properties jdbc.url=jdbc:mysql:///springdata jdbc.user=root jdbc.password=123456 jdbc.driverClass=com.mysql.jdbc.Driver 对象模型(实体类) 创建一个student表(id,name,age)id为主键 自增 public class Student { private int id; private String name; private int age; @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } DAO接口 public interface StudentDao { //查询所有的学生信息 List<Student> findAll(); //添加一个学生 void save(Student student); } DAO实现类 public class StudentDaoImpl implements StudentDao { public List<Student> findAll() { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List<Student> students = new ArrayList<Student>(); String sql = "select *from student"; try { connection = JDBCUtils.getConnection(); statement = connection.createStatement(); resultSet = statement.executeQuery(sql); while(resultSet.next()){ int id = resultSet.getInt("id"); String name = resultSet.getString("name"); int age = resultSet.getInt("age"); Student student = new Student(); student.setId(id); student.setName(name); student.setAge(age); students.add(student); } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(connection,statement,resultSet); } return students; } public void save(Student student) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; String sql = "insert into student(name,age) values (?,?)"; try { connection = JDBCUtils.getConnection(); preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1,student.getName()); preparedStatement.setInt(2,student.getAge()); preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.release(connection,preparedStatement,resultSet); } } } DAO接口测试类 public class StudentDaoImplTest { @Test public void findAllTest(){ StudentDao studentDao = new StudentDaoImpl(); List<Student> students = studentDao.findAll(); for(Student student:students){ System.out.println(student); } } @Test public void save(){ StudentDao studentDao = new StudentDaoImpl(); Student student = new Student(); student.setName("test1"); student.setAge(19); studentDao.save(student); } }

    2.使用Spring提供的JdbcTemplate访问数据库
    添加依赖 <!-- spring jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.5.RELEASE</version> </dependency> <!-- spring context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency> 创建配置文件类(视频中用的是xml配置 这里我改用注解)配置DataSource、JdbcTemplate和Spring注解扫描 @Configuration //申明为配置类 @ComponentScan("com.playmaker") //扫描这个包下的 public class SpringConfig { @Autowired private SpringJdbcProperties springJdbcProperties; @Bean public DriverManagerDataSource getDriverManagerDataSource(){ DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource(); driverManagerDataSource.setDriverClassName(springJdbcProperties.getDriverClass()); driverManagerDataSource.setUrl(springJdbcProperties.getUrl()); driverManagerDataSource.setUsername(springJdbcProperties.getUser()); driverManagerDataSource.setPassword(springJdbcProperties.getPassword()); return driverManagerDataSource; } @Bean public JdbcTemplate getJdbcTemplate(){ JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(getDriverManagerDataSource()); return jdbcTemplate; } } 上面这段相当于xml中这样配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="url" value="jdbc:mysql:///spring_data"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> @PropertySource(value = "classpath:db.properties") //位置 @Component public class SpringJdbcProperties { @Value("${jdbc.url}") private String url; @Value("${jdbc.user}") private String user; @Value("${jdbc.password}") private String password; @Value("${jdbc.driverClass}") private String driverClass; @Override public String toString() { return "SpringJdbcProperties{" + "url='" + url + '\'' + ", user='" + user + '\'' + ", password='" + password + '\'' + ", driverClass='" + driverClass + '\'' + '}'; } public String getUrl() { return url; } public String getUser() { return user; } public String getPassword() { return password; } public String getDriverClass() { return driverClass; } } DAO接口实现 @Repository//让Spring创建UserDaoImpl实例,相当于在配置文件去配置bean一样,这里也可以设置名字 public class StudentDaoSpringJdbcImpl implements StudentDao { @Autowired private JdbcTemplate jdbcTemplate; public List<Student> findAll() { List<Student> students = new ArrayList<Student>(); String sql = "select id,name,age from student"; List<Map<String,Object>> list_map = jdbcTemplate.queryForList(sql); for(Map<String,Object> map:list_map){ int id = Integer.valueOf(map.get("id").toString()); String name = String.valueOf(map.get("name")); int age = Integer.valueOf(map.get("age").toString()); Student student = new Student(); student.setId(id); student.setName(name); student.setAge(age); students.add(student); } return students; } public void save(Student student) { String sql = "insert into student(name,age) values(?,?)"; jdbcTemplate.update(sql,new Object[]{student.getName(),student.getAge()}); } } DAO接口测试类 public class StudentDaoSpringJdbcImplTest { private ApplicationContext applicationContext = null; private StudentDao studentDao ; @Before public void init(){ applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); studentDao = applicationContext.getBean(StudentDao.class); System.out.println("init..."); } @After public void destroy(){ applicationContext=null; System.out.println("destroy..."); } @Test public void findAllTest(){ List<Student> students = studentDao.findAll(); for(Student student:students){ System.out.println(student); } } @Test public void save(){ Student student = new Student(); student.setName("test1"); student.setAge(19); studentDao.save(student); } }

    弊端分析 无论是原始JDBC连接数据库还是Spring提供的JdbcTemplate来处理,DAO里面代码量太多,DAO的实现有很多重复代码,如果你想实现更复杂的分页功能之类的,还需要写更大量的代码,学习了Spring data你就会知道它的强大了
    最新回复(0)