Bootstrap

详细分析JdbcTemplate的基本知识 | 拓展OracleJdbcTemplate(附Demo)

前言

最近使用JdbcTemplate处理了oracle,对应的基本知识如下

如想补充完整的JAVA知识,推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

1. JdbcTemplate

  • spring配置文件的数据库配置信息
<!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
 destroy-method="close">
 <property name="url" value="jdbc:mysql:///user_db" />
 <property name="username" value="root" />
 <property name="password" value="root" />
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
  • 配置 JdbcTemplate 对象,注入 DataSource
    在这里插入图片描述
<!-- JdbcTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!--注入dataSource-->
    <property name="dataSource" ref="dataSource"></property>
</bean>
  • 创建 service 类,配置dao对象,创建 dao 类,在 dao 注入 jdbcTemplate 对象
    先开启组件扫描
<!-- 组件扫描 -->
<context:component-scan base-package="com.atguigu"></context:component-scan>

service中配置dao对象类,要配置一个注解类通过@Service
使用@Autowired进行注入对象

@Service

public class UserService {

	//注入dao
	@Autowired
	private UserDao userDao;
}

在dao中配置jdbcTemplate 对象
通过@Repository进行标识

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

1.1 数据库添加

对应数据的表,创建相应的对象名,以此创建相应的实体类

之后进行书写相应的dao层和service层
具体为何这么创建可查看我之前的文章
java为何使用Service、Dao、以及Controller层的设计

在业务逻辑层中调用数据接口

public class BookService {
    //注入 dao
    @Autowired
    private BookDao bookDao; 

	public void addBook(Book book){
		bookDao.add(book);
	}

}

dao层先写一个接口类,主要是定义一些方法
而接口实现类为

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;
    //添加的方法
    @Override
    public void add(Book book) {
        //1 创建 sql 语句
        String sql = "insert into t_book values(?,?,?)";
        //2 调用方法实现
        Object[] args = {book.getUserId(), book.getUsername(),
                book.getUstatus()};
        int update = jdbcTemplate.update(sql,args);
        System.out.println(update);
    } }

调用 JdbcTemplate 对象里面 update 方法实现添加操作
其增加的update源代码为
在这里插入图片描述
第一个参数:sql 语句
第二个参数:可变参数,设置 sql 语句值

可变参数为问号占位符
具体可参考我之前的文章
jdbc之问号占位符的详细分析

具体测试类如下

@Test
public void testJdbcTemplate() {
	   ApplicationContext context =new ClassPathXmlApplicationContext("bean1.xml");
	    BookService bookService =context.getBean("bookService",BookService.class);
	    Book book = new Book();
	    book.setUserId("1");
	    book.setUsername("java");
	    book.setUstatus("a");
	    bookService.addBook(book);
    }
}

1.2 数据库修改与删除

在业务逻辑层中调用数据接口实现层

public class BookService {
    //注入 dao
    @Autowired
    private BookDao bookDao; 

	public void updateBook(Book book){
		bookDao.updateBook(book);
	}
	
	public void deletBook(String id){
		bookDao.deletBook(id);
	}

}

在接口层写方法
在接口实现类中书写具体方法函数

@Override
public void updateBook(Book book) {
    String sql = "update t_book set username=?,ustatus=? where user_id=?";
    Object[] args = {book.getUsername(), book.getUstatus(),book.getUserId()};
    int update = jdbcTemplate.update(sql, args);
    System.out.println(update);
}


@Override
public void delete(String id) {
	String sql = "delete from t_book where user_id=?";
	int update = jdbcTemplate.update(sql, id);
	System.out.println(update);
}

1.3 数据库查询

查询返回某个值
查询语句的返回主要是用这个值
在这里插入图片描述
主要是运用这个函数

@Nullable
<T> T queryForObject(String var1, RowMapper<T> var2) throws DataAccessException;

第一个参数:sql 语句
第二个参数:返回类型 Class,如果是string类型,则返回string.class

数据实现接口的类为

//查询表记录数
@Override
public int selectCount() {
    String sql = "select count(*) from t_book";
    Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
    return count;
}

查询返回对象
主要是运用这个函数

@Nullable
<T> T queryForObject(String var1, RowMapper<T> var2, @Nullable Object... var3) throws DataAccessException;

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

实现接口类

@Override
public Book findBookInfo(String id) {
    String sql = "select * from t_book where user_id=?";
    //调用方法
    Book book = jdbcTemplate.queryForObject(sql, new
            BeanPropertyRowMapper<Book>(Book.class), id);
    return book;
}

查询返回集合

主要使用这个函数
在这里插入图片描述
第一个参数:sql 语句
第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装,泛型参数主要是返回类型的对象
第三个参数:sql 语句值,主要是返回的值。没有参数可省略

//查询返回集合
@Override
public List<Book> findAllBook() {
    String sql = "select * from t_book";
    //调用方法
    List<Book> bookList = jdbcTemplate.query(sql, new
            BeanPropertyRowMapper<Book>(Book.class));
    return bookList;
}

1.4 数据库批量操作

主要通过这个函数
在这里插入图片描述
第一个参数:sql 语句
第二个参数:List 集合,添加多条记录数据

批量添加

//批量添加
@Override
public void batchAddBook(List<Object[]> batchArgs) {
    String sql = "insert into t_book values(?,?,?)";
    int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
    System.out.println(Arrays.toString(ints));
}

批量添加的测试代码

//批量添加测试
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3","java","a"};
Object[] o2 = {"4","c++","b"};
Object[] o3 = {"5","MySQL","c"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
//调用批量添加
bookService.batchAdd(batchArgs);

批量修改

//批量修改
@Override
public void batchUpdateBook(List<Object[]> batchArgs) {
    String sql = "update t_book set username=?,ustatus=? where user_id=?";
    int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
    System.out.println(Arrays.toString(ints));
}

批量修改测试文件

//批量修改
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"java0909","a3","3"};
Object[] o2 = {"c++1010","b4","4"};
Object[] o3 = {"MySQL1111","c5","5"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
//调用方法实现批量修改
bookService.batchUpdate(batchArgs);

批量删除

//批量删除
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
    String sql = "delete from t_book where user_id=?";
    int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
    System.out.println(Arrays.toString(ints));
}

批量删除测试文件

//批量删除
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3"};
Object[] o2 = {"4"};
batchArgs.add(o1);
batchArgs.add(o2);
//调用方法实现批量删除
bookService.batchDelete(batchArgs);

2. 拓展

2.1 JdbcTemplate

  • 简化JDBC操作

  • 通过模板方法模式,将常见的JDBC操作封装起来,减少了样板代码

JdbcTemplate和OracleJdbcTemplate都是Spring框架中的类,用于简化与数据库的交互

JdbcTemplate是一个通用的模板类,适用于各种类型的关系型数据库,而OracleJdbcTemplate则是针对Oracle数据库的特定实现

上述的JdbcTemplate多数采用xml,目前更多在Java中实现

配置数据源:

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
    dataSource.setUsername("username");
    dataSource.setPassword("password");
    return dataSource;
}

配置JdbcTemplate:

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

使用JdbcTemplate:

@Autowired
private JdbcTemplate jdbcTemplate;

public List<Map<String, Object>> queryData() {
    String sql = "SELECT * FROM my_table";
    return jdbcTemplate.queryForList(sql);
}

2.2 OracleJdbcTemplate

继承自JdbcTemplate,但专门为Oracle数据库进行了优化

配置Oracle数据源:

@Bean
public DataSource oracleDataSource() {
    OracleDataSource dataSource = new OracleDataSource();
    dataSource.setDriverType("oracle.jdbc.OracleDriver");
    dataSource.setURL("jdbc:oracle:thin:@localhost:1521:orcl");
    dataSource.setUser("username");
    dataSource.setPassword("password");
    return dataSource;
}

配置OracleJdbcTemplate:

@Bean
public OracleJdbcTemplate oracleJdbcTemplate(DataSource oracleDataSource) {
    return new OracleJdbcTemplate(oracleDataSource);
}

使用OracleJdbcTemplate:

@Autowired
private OracleJdbcTemplate oracleJdbcTemplate;

public List<Map<String, Object>> queryOracleData() {
    String sql = "SELECT * FROM oracle_table";
    return oracleJdbcTemplate.queryForList(sql);
}
;