Spring-BASE-5

Spring 框架基础5

转载:https://blog.csdn.net/qq_35843514/article/details/114287046?spm=1001.2014.3001.5501

一、Spring JDBC概述

1、什么是JDBC Template?

之前我们采用的是手动封装JdbcTemplate,其好处是通过(sql语句+参数)模板化了编程。而真正的JdbcTemplate类,是Spring框架为我们写好的。它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。除了JdbcTemplate,Spring 框架还为我们提供了很多的操作模板类。

操作关系型数据的:JdbcTemplate和HibernateTemplate。
操作 nosql 数据库的:RedisTemplate。
操作消息队列的:JmsTemplate。

2、Spring JDBC 能做什么?

操作项目 Spring帮你做的 你需要做的
定义连接参数
打开连接
指定SQL语句
声明参数并提供参数值
准备并运行该语句
设置循环以遍历结果(如果有)
进行每次迭代的工作
处理任何异常
处理交易
关闭连接,语句和结果集

3、JDBC访问数据的方法

JdbcTemplate:是经典且最受欢迎的Spring
JDBC方法。这种“最低级别”的方法以及其他所有方法都在幕后使用JdbcTemplate。

NamedParameterJdbcTemplate:封装JdbcTemplate以提供命名参数,而不是传统的JDBC ‘?’ 占位符。当您有多个SQL语句参数时,此方法可提供更好的文档编制和易用性。

SimpleJdbcInsert和SimpleJdbcCall:优化数据库元数据以限制必要的配置量。这种方法简化了编码,因此您只需要提供表或过程的名称,并提供与列名称匹配的参数映射即可。仅当数据库提供足够的元数据时,此方法才有效。如果数据库不提供此元数据,则必须提供参数的显式配置。

RDBMS对象:(包括MappingSqlQuery,SqlUpdate和StoredProcedure)要求您在数据访问层初始化期间创建可重用且线程安全的对象。此方法以JDO Query为模型,其中您定义查询字符串,声明参数并编译查询。一旦你这样做,execute(…​),update(…​),和findObject(…​)方法可以用不同的参数值多次调用。

4、Spring框架的JDBC抽象框架由四个不同的软件包组成

**core:**org.springframework.jdbc.core程序包包含JdbcTemplate该类及其各种回调接口,以及各种相关类。org.springframework.jdbc.core.simple包含SimpleJdbcInsert和SimpleJdbcCall类。另一个名为org.springframework.jdbc.core.namedparam的子程序包包含NamedParameterJdbcTemplate 该类和相关的支持类。

datasource:该org.springframework.jdbc.datasource软件包包含一个易于DataSource访问的实用程序类和各种简单的DataSource实现,可用于在JavaEE容器之外测试和运行未修改的JDBC代码。org.springfamework.jdbc.datasource.embedded支持使用Java数据库引擎(例如HSQL,H2和Derby)创建嵌入式数据库。

object:org.springframework.jdbc.object程序包包含将RDBMS查询,更新和存储过程表示为线程安全的可重用对象的类。尽管查询返回的对象自然会与数据库断开连接,但此方法由JDO建模。较高级别的JDBC抽象取决于org.springframework.jdbc.core程序包中的较低级别的抽象。

support:org.springframework.jdbc.support提供了SQLException翻译功能和一些实用程序类。JDBC处理期间引发的异常将转换为org.springframework.dao包中定义的异常。这意味着使用Spring JDBC抽象层的代码不需要实现JDBC或RDBMS特定的错误处理。所有翻译的异常均未选中,这使您可以选择捕获可从中恢复的异常,同时将其他异常传播到调用方。

二、使用JBDC Template

1、新建 Module jdbc_template,并引入相关jar包

2、配置数据库链接池

新建bean.xml, 配置数据库连接池,并配置JDBC Template对象,注入datasource;最后开启组件扫描

(1)代码配置(在本项目中作为参考)

DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://192.168.10.30:3306/user_db");
dataSource.setUsername("sevattal");
dataSource.setPassword("123456");

(2)xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启组件扫描-->
    <context:component-scan base-package="com.sevattal"/>
    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close">
        <property name="url" value="jdbc:mysql://192.168.10.30:3306/user_db" />
        <property name="username" value="sevattal" />
        <property name="password" value="123456" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    </bean>
    <!--创建jdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

3、创建Service和Dao,并在Dao中注入JDBC Template对象

User表创建

CREATE TABLE `t_user` (
  `userId` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `userStatus` int(11) DEFAULT NULL,
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB;

User

public class User {
    private int userId;
    private String username;
    private String userStatus;
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUserStatus() {
        return userStatus;
    }
    public void setUserStatus(String userStatus) {
        this.userStatus = userStatus;
    }
}

UserService

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    public void addUser(User user){
        userDao.add(user);
    }
    public void updateUser(User user){
        userDao.update(user);
    }
    public void deleteUser(String id){
        userDao.deleteUser(id);
    }
    public void selectCount(){
        int count = userDao.selectCount();
        System.out.println(count);
    }
    public void batchAddUser(List<Object[]> users){
        userDao.batchAddUser(users);
    }
    public void batchUpdateUser(List<Object[]> users) {
        userDao.batchUpdateUser(users);
    }
    public void batchDelUser(List<Object[]> ids) {
        userDao.batchDelUser(ids);
    }
}

UserDao

public interface UserDao {
    /**
     * 添加add
     */
    void add(User user);
    /**
     * update
     */
    void update(User user);
    /**
     * delete
     */
    void deleteUser(String id);
    /**
     * count(*)
     */
    int selectCount();
    /**
     * batchAddUsers
     * @param users
     */
    void batchAddUser(List<Object[]> users);
    void batchUpdateUser(List<Object[]> users);
    void batchDelUser(List<Object[]> ids);
}

(1) 添加数据

第一个参数:sql语句
第二个参数:@Nullable允许为空,设置SQL语句中的参数值

(2) 修改数据和删除数据

方法同上

(3) 返回某个具体的值

第一个参数是SQL语句,没什么可多说的,第二个参数是返回值的Class类型,如果是String类型,就是String.class

(4) 返回一个对象

第一个参数:sql语句
第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
第三个参数:sql语句值

(5) 查询返回集合

第一个参数:sql语句
第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
第三个参数:sql语句值

(6) 实现批量操作

第一个参数是SQL语句,第二个参数是要添加的集合数据

@Repository
public class UserDaoImpl implements UserDao {
    /**
     * 注入JdbcTemplate
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;
    /**
     * 批量添加数据
     * @param users
     */
    @Override
    public void batchAddUser(List<Object[]> users) {
        String sql = "Insert into t_user values(?,?,?)";
        int[] res = jdbcTemplate.batchUpdate(sql, users);
        System.out.println(Arrays.toString(res));
    }
    /**
     * 批量删除
     */
    @Override
    public void batchDelUser(List<Object[]> ids) {
        String sql = "DELETE FROM t_user WHERE user_id = ?";
        int[] res = jdbcTemplate.batchUpdate(sql, ids);
        System.out.println(Arrays.toString(res));
    }
    /**
     * 批量更新数据
     * @param users
     */
    @Override
    public void batchUpdateUser(List<Object[]> users) {
        String sql = "Update t_user set username = ?,ustates = ? where user_id = ?";
        int[] res = jdbcTemplate.batchUpdate(sql, users);
        System.out.println(Arrays.toString(res));
    }
    /**
     * 添加方法
     * @param user 书
     */
    @Override
    public void add(User user) {
        Object[] args = {user.getUserId(),user.getUsername(),user.getUserStatus()};
        int update = jdbcTemplate.update("insert into t_user values (?,?,?)", args);
        System.out.println("update successful!" + update);
    }
    @Override
    public void update(User user) {
        Object[] args = {user.getUsername(),user.getUserStatus(),user.getUserId()};
        int update = jdbcTemplate.update("update t_user set username = ?,ustates = ? where user_id = ?", args);
        System.out.println("update successful!" + update);
    }
    @Override
    public void deleteUser(String id) {
        int update = jdbcTemplate.update("delete from t_user  where user_id = ?", id);
        System.out.println("delete successful!" + update);
    }
    @Override
    public int selectCount() {
        String sql = "select count(*) from t_user";
        int count = jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }
}

(7) 测试方法

@Test
public void test1() {
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    UserService userService = context.getBean("userService", UserService.class);
    User user = new User();
    user.setUserId(1);
    user.setUsername("zhangsan");
    user.setUserStatus("1");
    userService.addUser(user);
}
Contents
  1. 1. Spring 框架基础5
    1. 1.1. 一、Spring JDBC概述
      1. 1.1.1. 1、什么是JDBC Template?
      2. 1.1.2. 2、Spring JDBC 能做什么?
      3. 1.1.3. 3、JDBC访问数据的方法
      4. 1.1.4. 4、Spring框架的JDBC抽象框架由四个不同的软件包组成
    2. 1.2. 二、使用JBDC Template
      1. 1.2.1. 1、新建 Module jdbc_template,并引入相关jar包
      2. 1.2.2. 2、配置数据库链接池
      3. 1.2.3. 3、创建Service和Dao,并在Dao中注入JDBC Template对象
        1. 1.2.3.1. (1) 添加数据
        2. 1.2.3.2. (2) 修改数据和删除数据
        3. 1.2.3.3. (3) 返回某个具体的值
        4. 1.2.3.4. (4) 返回一个对象
        5. 1.2.3.5. (5) 查询返回集合
        6. 1.2.3.6. (6) 实现批量操作
        7. 1.2.3.7. (7) 测试方法
|