• Java EE学习笔记(四)


    Spring的数据库开发

    1、Spring JDBC

    1)、Spring JDBC模块的作用:Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中(只要由new实例就可以用IOC实现,只要有setter方法就可以用DI实现)

    2)、Spring JdbcTemplate的解析:

    a)、JdbcTemplate类是Spring JDBC的核心类

    b)、JdbcTemplate类的继承结构具体如下图所示: 

    c)、DataSource(连接池,也称数据源):其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池分布式事务的支持,它可以作为访问数据库资源的标准接口

    d)、SQLExceptionTranslator:该接口负责对SQLException进行转译工作。通过必要的设置获取SQLExceptionTranslator中的方法,可以使JdbcTemplate在需要处理SQLException时,委托SQLExceptionTranslator的实现类来完成相关的转译工作

    e)、JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作

    3)、Spring JDBC的配置

    a)、Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和support(支持包)

    b)、从上表可以看出,Spring对数据库的操作都封装在了这几个包中,而想要使用Spring JDBC,就需要对其进行配置,配置模板如下:

     1 <!--1、配置数据源-->
     2 <bean id="dataSourceID" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     3     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     4     <property name="url" value="jdbc:mysql://localhost:3306/spring"/>
     5     <property name="username" value="root"/>
     6     <property name="password" value="****"/>
     7 </bean>
     8 
     9 <!--配置JDBC模板-->
    10 <bean id="jdbcTemplateID" class="org.springframework.jdbc.core.JdbcTemplate">
    11     <property name="dataSource" ref="dataSourceID"/> <!--注入数据源-->
    12 </bean>
    13 
    14 <!--配置需要实例化的Bean-->
    15 <bean id="xxx" class="Xxx">
    16     <property name="jdbcTemplate" ref="jdbcTemplateID"/> <!--注入JDBC模板-->
    17 </bean>    

    c)、关于上述示例dataSource配置中的4个属性说明,如下表所示:

    上表中的属性值在实际配置时,需要根据数据库类型设置进行相应配置

    2、Spring JdbcTemplate的常用方法

    1)、在JdbcTemplate核心类中,提供了大量的更新和查询数据库的方法:

    a)、execute(String sql)方法可用于执行sql语句

    b)、update()用于执行插入、更新和删除操作

    c)、query()用于执行数据查询操作

    2)、execute()的使用:

    a)、src->applicationContext.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4 xsi:schemaLocation="http://www.springframework.org/schema/beans 
     5      http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
     6      
     7     <!-- 1、配置数据源 -->
     8     <bean id="dataSourceID" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     9     
    10         <!--1.1、数据库驱动 -->
    11         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    12         
    13         <!--1.2、连接数据库的url(即数据库所在地址) -->
    14         <property name="url" value="jdbc:mysql://localhost:3306/spring" />
    15         
    16         <!--1.3、连接数据库的用户名 -->
    17         <property name="username" value="root" />
    18         
    19         <!--1.4、连接数据库的密码 -->
    20         <property name="password" value="******" />
    21     </bean>
    22     
    23     <!-- 2、配置JDBC模板,并且注入数据源 -->
    24     <bean id="jdbcTemplateID" class="org.springframework.jdbc.core.JdbcTemplate">
    25     
    26         <!-- 2.1、默认必须使用数据源 -->
    27         <property name="dataSource" ref="dataSourceID" />
    28     </bean>
    29     
    30     <!--3、定义id为accountDaoID的Bean,即配置DAO层-->
    31     <bean id="accountDaoID" class="com.itheima.jdbc.AccountDaoImpl">
    32     
    33         <!-- 3.1、将jdbcTemplate注入到accountDao类实例中 -->
    34         <property name="jdbcTemplate" ref="jdbcTemplateID" />
    35     </bean>
    36     
    37 </beans>

    b)、src->com.itheima.jdbc

    ①JdbcTemplateTest.java

     1 package com.itheima.jdbc;
     2 import java.util.List;
     3 import org.junit.Test;
     4 import org.springframework.context.ApplicationContext;
     5 import org.springframework.context.support.ClassPathXmlApplicationContext;
     6 import org.springframework.jdbc.core.JdbcTemplate;
     7 
     8 public class JdbcTemplateTest {
     9     /**
    10      * 使用execute()方法建表
    11      */
    12     public static void main(String[] args) {
    13         
    14         // 1、加载配置文件
    15         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    16         
    17         // 2、获取JdbcTemplate实例
    18         JdbcTemplate jdTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplateID");
    19         
    20         // 3、使用该实例的execute()方法执行SQL语句,创建用户账户管理表account
    21         jdTemplate.execute("create table account(" + 
    22                              "id int primary key auto_increment," +
    23                              "username varchar(50)," + 
    24                              "balance double)");
    25         System.out.println("账户表account创建成功!");
    26     }
    27 }

    ②运行结果:

    3)、update()的使用

    a)、update()方法可以完成插入、更新和删除数据的操作。在JdbcTemplate类中,提供了一系列的update()方法,其常用方法下表所示:

    b)、src->com.itheima.jdbc

    ①普通账户类:Account.java

     1 package com.itheima.jdbc;
     2 
     3 public class Account { // 账户的信息
     4     
     5     private Integer id;       // 账户id
     6     private String username; // 用户名
     7     private Double balance;  // 账户余额
     8     
     9     public Integer getId() {
    10         return id;
    11     }
    12     
    13     public void setId(Integer id) {
    14         this.id = id;
    15     }
    16     
    17     public String getUsername() {
    18         return username;
    19     }
    20     
    21     public void setUsername(String username) {
    22         this.username = username;
    23     }
    24     
    25     public Double getBalance() {
    26         return balance;
    27     }
    28     
    29     public void setBalance(Double balance) {
    30         this.balance = balance;
    31     }
    32     
    33     public String toString() {
    34         return "Account [id=" + id + ", " + "username=" + username + ", balance=" + balance + "].";
    35     }
    36 }

    ②用户接口类:AccountDao.java

     1 package com.itheima.jdbc;
     2 
     3 import java.util.List;
     4 
     5 public interface AccountDao { // 创建接口
     6     
     7     // 添加
     8     public int addAccount(Account account);
     9     
    10     // 更新
    11     public int updateAccount(Account account);
    12     
    13     // 删除
    14     public int deleteAccount(int id);
    15     
    16     // 通过id查询
    17     public Account findAccountById(int id);
    18     
    19     // 查询所有账户
    20     public List<Account> findAllAccount();
    21 }

    ③用户接口实现类:AccountDaoImpl.java

     1 package com.itheima.jdbc;
     2 import java.util.List;
     3 import org.springframework.jdbc.core.BeanPropertyRowMapper;
     4 import org.springframework.jdbc.core.JdbcTemplate;
     5 import org.springframework.jdbc.core.RowMapper;
     6 
     7 public class AccountDaoImpl implements AccountDao { // 数据访问层DAO
     8     
     9     // 1、声明JdbcTemplate属性及其setter方法
    10     private JdbcTemplate jdbcTemplate;
    11     
    12     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { // 由Spring容器注入JBDC模板来操作mysql
    13         this.jdbcTemplate = jdbcTemplate;
    14     }
    15     
    16     // 2、添加账户
    17     public int addAccount(Account account) {
    18         
    19         // 2.1、定义SQL
    20         String sql = "insert into account(username,balance) value(?,?)";
    21         
    22         // 2.2、定义数组来存放SQL语句中的参数
    23         Object[] obj = new Object[] { account.getUsername(), account.getBalance() };
    24         
    25         // 2.3、执行添加操作,返回的是受SQL语句影响的记录条数
    26         int num = this.jdbcTemplate.update(sql, obj);
    27         return num;
    28     }
    29     
    30     // 3、更新账户
    31     public int updateAccount(Account account) { 
    32         
    33         // 3.1、定义SQL
    34         String sql = "update account set username=?,balance=? where id = ?";
    35         
    36         // 3.2、定义数组来存放SQL语句中的参数
    37         Object[] params = new Object[] { account.getUsername(), account.getBalance(),  account.getId() };
    38         
    39         /*
    40          *  3.3、执行添加操作,返回的是受SQL语句影响的记录条数
    41          *  第1个参数:sql操作语句
    42          *  第2个参数:
    43          */
    44         int num = this.jdbcTemplate.update(sql, params); 
    45         return num;
    46     }
    47     
    48     // 4、删除账户
    49     public int deleteAccount(int id) {
    50         
    51         // 4.1、定义SQL
    52         String sql = "delete  from account where id = ? ";
    53         
    54         // 4.2、执行添加操作,返回的是受SQL语句影响的记录条数
    55         int num = this.jdbcTemplate.update(sql, id); 
    56         return num;
    57     }
    58     
    59     // 5、通过id查询账户数据信息
    60     public Account findAccountById(int id) {
    61         
    62         //5.1、定义SQL语句
    63         String sql = "select * from account where id = ?";
    64         
    65         // 5.2、创建一个新的BeanPropertyRowMapper对象
    66         RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
    67         
    68         // 5.3、将id绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录
    69         return this.jdbcTemplate.queryForObject(sql, rowMapper, id);
    70     }
    71     
    72     // 6、查询所有账户信息
    73     public List<Account> findAllAccount() {
    74         
    75         // 6.1、定义SQL语句
    76         String sql = "select * from account";
    77         
    78         // 6.2、创建一个新的BeanPropertyRowMapper对象
    79         RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
    80         
    81         // 6.3、执行静态的SQL查询,并通过RowMapper返回结果
    82         return this.jdbcTemplate.query(sql, rowMapper);
    83     }
    84 }

    ④测试类:JdbcTemplate中添加一个测试方法addAccountTest(),用于添加用户信息:

     1     @Test
     2     public void addAccountTest() {
     3         
     4         // 1、加载配置文件
     5         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
     6         
     7         // 2、获取AccountDao的Bena实例AccountDaoID
     8         AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDaoID");
     9         
    10         // 3、创建Account对象,并向Account对象中添加数据
    11         Account account = new Account();
    12         account.setUsername("joy");
    13         account.setBalance(100.00);
    14         
    15         // 4、执行addAccount()方法,并获取返回结果
    16         int num = accountDao.addAccount(account);
    17         if (num > 0) {
    18             System.out.println("成功插入了" + num + "条数据!");
    19         } else {
    20             System.out.println("插入操作执行失败!");
    21         }
    22     }

    ⑤运行结果:

    ⑥测试类:JdbcTemplate中添加一个测试方法updateAccountTest(),用于更新用户信息:

     1     @Test
     2     public void updateAccountTest() {
     3         
     4         // 1、加载配置文件
     5         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
     6         
     7         // 2、获取AccountDao的Bean实例accountDaoID
     8         AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDaoID");
     9         
    10         // 3、创建Account对象,并向Account对象中添加数据
    11         Account account = new Account();
    12         account.setId(1);
    13         account.setUsername("tom");
    14         account.setBalance(2000.00);
    15         
    16         // 4、执行updateAccount()方法,并获取返回结果
    17         int num = accountDao.updateAccount(account);
    18         if (num > 0) {
    19             System.out.println("成功修改了" + num + "条数据!");
    20         } else {
    21             System.out.println("修改操作执行失败!");
    22         }
    23     }

    ⑦运行结果:

    ⑧测试类:JdbcTemplate中添加一个测试方法deleteAccountTest(),用于删除用户信息:

     1     @Test
     2     public void deleteAccountTest() {
     3         
     4         // 1、加载配置文件
     5         ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("applicationContext.xml");
     6         
     7         // 2、获取AccountDao的Bean实例accountDaoID
     8         AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDaoID");
     9         
    10         // 3、执行deleteAccount()方法,并获取返回结果
    11         int num = accountDao.deleteAccount(1);
    12         if (num > 0) {
    13             System.out.println("成功删除了" + num + "条数据!");
    14         } else {
    15             System.out.println("删除操作执行失败!");
    16         }
    17     }

    ⑨运行结果:

    4)、query()的使用

    a)、JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作。其中,常用的几个query()方法如下表所示:

    b)、向数据表account中插入几条数据:

    ①测试类JdbcTemplate中添加一个测试方法findAccountByIdTest(),用于查找用户id的信息:

     1     @Test
     2     public void findAccountByIdTest() {
     3        
     4         // 1、加载配置文件
     5         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
     6         
     7         // 2、获取AccountDao的Bean实例accountDaoID
     8         AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDaoID");
     9         
    10         // 3、执行findAccountById()方法
    11         Account account = accountDao.findAccountById(1);
    12         System.out.println(account);
    13     }

    ②运行结果:

    ③测试类JdbcTemplate中添加一个测试方法findAllAccountTest(),用于查找所有用户的信息:

     1     @Test
     2     public void findAllAccountTest() {
     3         
     4         // 1、加载配置文件
     5         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
     6         
     7         // 2、获取AccountDao实例
     8         AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDaoID");
     9         
    10         // 3、执行findAllAccount()方法,获取Account对象的集合
    11         List<Account> account = accountDao.findAllAccount();
    12         
    13         // 4、循环输出集合中的对象
    14         for (Account act : account) {
    15             System.out.println(act);
    16         }
    17     }

    ④运行结果:

    个人总结:

    如何管理用户的数据库?首先应单独写一个类来存储用户的所有信息;其次“管理员”创建实现操作用户的接口类(拥有的操作方法)以及对应的接口实现类,其中接口实现类要注入JdbcTemplate属性和它的setter方法,因为用JdbcTemplate管理数据库起来很方便,并且要实现对用户的增删查改的具体方法;然后测试操作时,首先都要加载配置文件,因为这些都由Spring容器来管理,然后获取容器中管理用户的Bean实例,若要对用户信息进行增加或更新,则要先new一个普通用户的实例,向这个实例中传入需要操作的数据,最后通过Bean实例去调用相应的操作用户的方法即可。

  • 相关阅读:
    HTML5和HTML4之间的区别
    HttpRequest信息内容介绍
    Spring Web MVC处理请求的流程
    游戏中的路径动画设计与实现
    Python基本数据类型
    Python基本数据类型
    perl .= 操作符
    出差二、三事——北漂18年(25)
    perl 卸载Oracle数据库
    perl 卸载mysql数据库
  • 原文地址:https://www.cnblogs.com/acgoto/p/10610803.html
Copyright © 2020-2023  润新知