Javaee Spring JdbcTemplate基本使用查询数据库表的内容 基于xml配置方式

news2024/12/24 3:55:53

目录

哈哈哈哈,说好是要写一篇关于jdbcTemplate的基本使用,貌似说跑题了,但是主体还是用jdbctemplate实现的,有耐心看完的话相信能有点点收获的哦!

 项目结构:

 用到的数据库:

 小结:

遇到了个小问题,数据库为8.0版本需要更换spring.xml的配置方式

1.driver,需要改成

2.url需要拼接

解决方式: 用资源文件注入

举例:假设如下登录界面,点击登录,假设登录失败,会跳转一个失败界面,这是怎么回事呢?

 底层逻辑:页面发出请求,将数据给到表现层,再由表现层给到业务层,再由业务层给到数据访问层,再由数据访问层访问数据库是否存在该数据,两种结果,存在或者不存在,此时会在把这个数据按顺序传回页面

由于我们没学表现层,将数据拿至测试类中,该怎么实现呢?

​编辑 运行成功!


哈哈哈哈,说好是要写一篇关于jdbcTemplate的基本使用,貌似说跑题了,但是主体还是用jdbctemplate实现的,有耐心看完的话相信能有点点收获的哦!

 项目结构:

导入jar包:

 用到的数据库:

 

AccountDao.java

package wwx.dao;

import wwx.domain.Account;

import java.util.List;

public interface AccountDao {
    //查询所有
    public List<Account> findAll();
}

 AccountDaoImpl.java

package wwx.dao;

import wwx.domain.Account;

import java.util.List;

public class AccountDaoImpl implements AccountDao {
    //查询所有
    @Override
    public List<Account> findAll() {
        System.out.println("我是Dao...");

        return null;
    }
}

Account.java

package wwx.domain;

public class Account{
    private String username;
    private int password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getPassword() {
        return password;
    }

    public void setPassword(int password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password=" + password +
                '}';
    }
}

 AccountServie.java

package wwx.service;

import wwx.domain.Account;

import java.util.List;

public interface AccountService {
   //查询所有
    public List<Account> findAll();
}

 AccountServieImpl.java

package wwx.service;
import wwx.dao.AccountDao;
import wwx.dao.AccountDaoImpl;
import wwx.domain.Account;

import java.util.List;

public class AccountServiceImpl implements AccountService {

    @Override
    public List<Account> findAll() {



        System.out.println("我是service...");
        AccountDao accountDao=new AccountDaoImpl();
        accountDao.findAll();
        return null;
    }
}

JDBCTest.java

package wwx.test;
import org.junit.Test;
import wwx.dao.AccountDao;
import wwx.domain.Account;
import wwx.service.AccountService;
import wwx.service.AccountServiceImpl;

import java.util.List;

public class JDBCTest {
    @Test
    public void test01()
    {   //在test中创建了一个业务层对象,用业务层对象调用业务层中的调用方法,
        // 此时业务层方法中创建了Dao对象,调用了Dao方法
        //这样写的话,类与类直接耦合度太高了,
        // 举个例子,假设Dao包下的AccountDaoImpl突然没有了,AccountServiceImpl中代码就会报错
        //该如何解决呢,使用Spring:解耦,降低类内之间的联系,
        //也就是不用在AccountServiceImpl中去new Dao ,让Spring去new,如果要用到,通过注入方式注入进来


        AccountService accountService=new AccountServiceImpl();
        accountService.findAll();
    }


}

 小结:

 //在test中创建了一个业务层对象,用业务层对象调用业务层中的调用方法,
    // 此时业务层方法中创建了Dao对象,调用了Dao方法
    //但是这样写的话,类与类直接耦合度太高了,
    // 举个例子,假设Dao包下的AccountDaoImpl突然没有了,AccountServiceImpl中代码就会报错
    //该如何解决呢,使用Spring:解耦,降低类内之间的联系,
    //也就是不用在AccountServiceImpl中去new AccountDao ,让Spring去new,如果要用到,通过注入方式注入进来

jdbcTest.java

package wwx.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import wwx.dao.AccountDao;
import wwx.domain.Account;
import wwx.service.AccountService;
import wwx.service.AccountServiceImpl;

import java.util.List;

public class JDBCTest {
    @Test
    public void test01()
    {   //在test中创建了一个业务层对象,用业务层对象调用业务层中的调用方法,
        // 此时业务层方法中创建了Dao对象,调用了Dao方法
        //这样写的话,类与类直接耦合度太高了,
        // 举个例子,假设Dao包下的AccountDaoImpl突然没有了,AccountServiceImpl中代码就会报错
        //该如何解决呢,使用Spring:解耦,降低类内之间的联系,
        //也就是不用在AccountServiceImpl中去new Dao ,让Spring去new,如果要用到,通过注入方式注入进来
//        AccountService accountService=new AccountServiceImpl();
//        accountService.findAll();

        //加载配置文件
        ApplicationContext app=new ClassPathXmlApplicationContext("Spring.xml");
        //获得bean
        //spring容器中id唯一
        //需要强转
        AccountService accountService = (AccountService) app.getBean("accountService");
        //调用方法
        accountService.findAll();
        //此时删除AccountServiceImpl,编译不会报错,但是无法运行,耦合不能消除,但能降低



    }


}

Spring.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!--service层-->
    <bean id="accountService" class="wwx.service.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!--Dao层-->
    <bean id="accountDao" class="wwx.dao.AccountDaoImpl"></bean>
</beans>

//此时删除AccountServiceImpl,编译不会报错,但是无法运行,耦合不能消除,但能降低

 借助Dao层访问数据库,两种技术,jdbctemplate,mybabties,此时用jdbctemplate

但是这样又回到之前的,在类中new,改用注入由于数据库为8.0版本运行失败

遇到了个小问题,数据库为8.0版本需要更换spring.xml的配置方式

1.driver,需要改成

<property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>

2.url需要拼接

useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&characterEncoding=utf-8
<property name="jdbcUrl" value="mysql://localhost:3306/wwx?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&characterEncoding=utf-8"></property>

但是xml文件中无法识别&所以改用资源文件注入

解决方式: 用资源文件注入

Spring.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">

<!--加载属性配置文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
<!--上面这行是在末尾加了个/成了单标签,原本是一对的-->
    
<!--数据源-->
    <!--遇到了个小问题,及数据库为8.0版本需要更换spring.xml的配置方式-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     <property name="driverClass" value="${jdbc.driver}"></property>
     <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

     <!--service层-->
    <bean id="accountService" class="wwx.service.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!--Dao层-->
    <bean id="accountDao" class="wwx.dao.AccountDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
        <!--name中jdbcTemplate,是AccountDaoImpl类中的成员属性,ref中jdbcTemplate是jdbcTemplate层的id-->
    </bean>
    <!--JdbcTempalte层-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property><!--注入-->
    </bean>

</beans>

jdbc.propertities

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/wwx?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

此时到JDBCTest.java中运行test01发现成功访问数据库

举例:假设如下登录界面,点击登录,假设登录失败,会跳转一个失败界面,这是怎么回事呢?

 底层逻辑:页面发出请求,将数据给到表现层,再由表现层给到业务层,再由业务层给到数据访问层,再由数据访问层访问数据库是否存在该数据,两种结果,存在或者不存在,此时会在把这个数据按顺序传回页面

由于我们没学表现层,将数据拿至测试类中,该怎么实现呢?

原理:传递参数时是通过方法的参数值传递,返回数据时,是通过方法的返回值往回返

 

 

 运行成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/446826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python_Opencv图像处理框架】图像基本操作

写在前面 很幸运能选择Python语言进行学习&#xff0c;这是有关Opencv的图像处理的第一篇文章&#xff0c;讲解了有关图像处理的一些基础操作&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正❤️ 写在中间 1…

Docker容器---介绍、安装

Docker基本管理 一、Docker概述1、IT架构2、什么是docker3、Docker特点4、Docker与KVM区别 二、Docker核心概念1、镜像 容器 仓库2、虚拟架构有哪些 三、Docker使用场景1、Docker在内核中支持的2种重要技术2、应用场景 四、Docker安装1、YUM安装docker2、设置阿里云镜像源3、查…

Java多线程初阶(一)(图片+源码+超详细)

线程的概念参照以往的这篇文章&#x1f43b; 目录 1.创建线程 1.1 继承Thread类 1.2 实现Runnable接口 eg&#xff1a;常用的简写方式 2.Thread类中的常用API 3. start方法和run方法 4. 继承Thread类启动新线程的逻辑 5. 实现Runnable接口启动新线程的逻辑 6. 线程相关…

Linux基础—日志分析

Linux基础—日志分析 一、日志的功能1.日志消息的级别2.设备字段说明 二、日志文件的分类1.内核及系统日志2.用户日志3.程序日志 三、日志文件1.日志文件查看2.主要日志文件介绍3.日志管理策略 一、日志的功能 用于记录系统、程序运行中发生的各种事件 通过阅读日志&#xff0c…

图像描述算法排位赛:SceneXplain与MiniGPT-4谁将夺得桂冠?

如果你对 AI 前沿感兴趣&#xff0c;本场「图像描述算法排位赛」绝对是你不能错过的&#xff01;在这场较量中&#xff0c;SceneXplain 和 MiniGPT-4 将会比试&#xff0c;谁将摘得这场比赛的桂冠&#xff1f; &#x1f4ce; 直接上手体验&#xff1a;scenex.jina.ai 背景介绍 …

手机存储数据恢复软件哪个好用?试了10款,我只认准这一款!

案例&#xff1a;手机存储数据恢复软件哪个好用&#xff1f; 【有没有好介绍的苹果数据恢复软件&#xff1f;可以恢复好几年数据的那种软件&#xff1f;求推荐&#xff01;】 手机中的数据是用户平时使用手机时不可避免的内容&#xff0c;这些数据包括照片、视频、音乐、文件等…

Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机同步采集(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK的软触发实现两相机的同步采集&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的高速同步采集的技术背景Baumer工业相机通过BGAPI SDK在回调函数里同步保存图像工业相机在回调函数BufferEvent保存工业相机使用软触发进行同…

【观察】华为:新一代楼宇网络,使能绿建智慧化

“碳达峰”、“碳中和”目标是我国生态文明建设和高质量可持续发展的重要战略安排&#xff0c;将推动全社会加速向绿色低碳转型。作为全球既有建筑和每年新建建筑量最大的国家&#xff0c;大力发展绿色建筑对中国全方位迈向低碳社会、实现高质量发展具有重要意义。 《“十四五”…

使用FirmAE 对zyxel路由器固件仿真实践 | 信息安全

一、FirmAE简介 FirmAE 是一个执行仿真和漏洞分析的全自动框架。FirmAE 使用五种仲裁技术显著提高仿真成功率&#xff08;从Firmadyne的 16.28% 提高到 79.36%&#xff09;。 FirmAE的整体架构为如上图所示。与Firmadyne类似&#xff0c;FirmAE在预先构建的自定义Linux内核和库…

Codeforces Round 816 (Div. 2)(C. Monoblock)

传送门 题意&#xff1a; 定义一个数组&#xff0c;定义它 相等连续段的个数 如1,2,2,1&#xff0c;相等连续段有[1],[2,2],[1]&#xff0c;共3个 如2,2,2,1&#xff0c;相等连续段有[2,2,2],[1]&#xff0c;共2个 给定一个数组a&#xff0c;定义g(l,r)为&#xff0c;子数组中…

fisco bcos 2.0+ 版本浏览器搭建

Fisco Bcos当前已经发布了3版本&#xff0c;在3版本中&#xff0c;Fisco摒弃了原有的区块链浏览器&#xff0c;而是提供了具有更为丰富功能的图形化区块链管理工具WeBase&#xff0c;后续也会提供对于WeBase的搭建部署教程。 文章目录 一、准备条件二、下载浏览器安装脚本1. 下…

ChatGPT4 的体验 一站式 AI工具箱 -—Poe(使用教程)

最近由于人工智能聊天机器人的爆火(ChatGPT)&#xff0c;因此各种各样的AI助手流行与网络&#xff0c;各种各样的都有&#xff0c;不论是什么样的其实都是为了我们更方便的解决问题&#xff0c;今天介绍一款AI工具箱——Poe将多种AI集成与一个界面&#xff0c;大家可以一次感受…

Mac系统brew报错“The GitHub credentials in the macOS keychain may be invalid”解决

报错信息如下&#xff1a; $ brew search nginx Warning: Error searching on GitHub: GitHub API Error: Requires authentication The GitHub credentials in the macOS keychain may be invalid. Clear them with: printf "protocolhttps\nhostgithub.com\n" | …

Python双向链表的操作

目录 一、双向链表 双向链表示例图 二、双向链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&#xff0…

百度ai智能写作工具-百度ai自动写文章

百度AI智能写作工具&#xff1a;让创作更快捷、高效&#xff01; 在当今竞争激烈的文化创意市场中&#xff0c;创作一篇高质量的文章需要投入大量时间和精力。然而&#xff0c;有了百度AI智能写作工具&#xff0c;创作变得更快捷、高效了。 百度AI智能写作工具采用最先进的人…

JVM之垃圾回收器概述

目录 垃圾收集器分类 按线程数分 按照工作模式分 ​编辑 按碎片处理方式分 按工作的内存区间分 评估GC的性能指标 吞吐量 暂停时间 吞吐量 vs 暂停时间 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由…

一起学 WebGL:感受三维世界之视图矩阵

大家好&#xff0c;我是前端西瓜哥。之前绘制的图形都是在 XY 轴所在的平面上&#xff0c;这次我们来加入一点深度信息 z&#xff0c;带你走入三维的世界。 视图矩阵 对于一个立方体来说&#xff0c;我们从它的正前方看&#xff0c;不管距离它多远&#xff0c;也只能看到一个…

微服务下网关聚合Swagger文档、starter统一配置Swagger

一、starter实现统一配置微服务文档 把Swagger配置中的公共部分抽取出来Swagger与SpringBoot整合中&#xff0c;可能会由于版本问题出现各种问题 1、制作starter 参考&#xff1a; 【SpringBoot】自定义启动器 Starter【保姆级教程】用starter实现Oauth2中资源服务的统一配置用…

中级软件设计师备考---数据库系统1

目录 数据库模式数据库的设计过程E-R模型关系代数与元组演算 数据库模式 三级模式、两级映射 定义&#xff1a; 三级模式&#xff1a;外模式、概念模式和内模式&#xff1b;两级映射&#xff1a;外模式-概念模式映射、概念模式-内模式映射 外模式是用户看到的数据库的部分 概…

Linux的常见指令 -掌握

前言 为什么要学命令行&#xff1f; windows/苹果图形界面&#xff0c;是商业化的产物&#xff0c;也就是使用必须简单小白&#xff0c;才能有人用&#xff0c;so what&#xff1f;严格意义上讲&#xff0c;我们必须要学一下Linux命令行。因为企业后端有大量的服务器&#xff…