spring Jdbc

embedded/2024/10/18 23:57:28/

 --------------------------------SpringJdbc--------------------------------     

  1. 创建数据库

DROP DATABASE IF EXISTS studb;

CREATE DATABASE studb;

USE studb;

CREATE TABLE student (

  id INT PRIMARY KEY,

  NAME VARCHAR(50) NOT NULL,

  gender VARCHAR(10) NOT NULL,

  age INT,

  classes VARCHAR(50)

);

INSERT INTO student (id, NAME, gender, age, classes)

VALUES

  (1, '张三', '男', 20, '高中一班'),

  (2, '李四', '男', 19, '高中二班'),

  (3, '王五', '女', 18, '高中一班'),

  (4, '赵六', '女', 20, '高中三班'),

  (5, '刘七', '男', 19, '高中二班'),

  (6, '陈八', '女', 18, '高中一班'),

  (7, '杨九', '男', 20, '高中三班'),

  (8, '吴十', '男', 19, '高中二班');

       

2. 创建项目使用SpringJdbc完成学生增删改查实现步骤
  1.  导入springjdbc相关坐标

<dependencies>
    <!--spring核心坐标-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.6</version>
    </dependency>
    <!--Resource注解-->
    <dependency>
        <groupId>jakarta.annotation</groupId>
        <artifactId>jakarta.annotation-api</artifactId>
        <version>2.1.1</version>
    </dependency>
    <!--lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.26</version>
    </dependency>
    <!--spring-jdbc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>6.0.6</version>
    </dependency>
    <!--jdbc-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    <!--druid阿里连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>
    <!--junit5测试-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
        <scope>test</scope>
    </dependency>

    <!--spring-test-->
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>6.0.6</version>
    </dependency>


    <!-- 日志 , 会自动传递slf4j门面-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

   

   2. 引入logback.xml 和jdbc.properties文件到resources目录下

jdbc.url=jdbc:mysql://localhost:3306/studb?serverTimezone=UTC
jdbc.userName=root
jdbc.userPwd=
jdbc.driverClass=com.mysql.cj.jdbc.Driver

   

   3. 注解+xml配置文件或注解+配置类的方式实现相关配置

      3.1 注解+xml配置文件方式

         创建spring配置文件applicationContext.xml,JdbcTemplate模板对象配置

<?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:component-scan base-package="com.bdqn.service.impl,com.bdqn.dao.impl"/>

    <!-- 导入外部属性文件 -->
    <context:property-placeholder location="jdbc.properties"></context:property-placeholder>

    <!-- 配置数据源 -->
    <bean id="dataSource"  class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${jdbc.url}"></property>
        <property name="driverClassName" value="${jdbc.driverClass}"></property>
        <property name="username" value="${jdbc.userName}"></property>
        <property name="password" value="${jdbc.userPwd}"></property>
    </bean>

    <!--jdbcTemplate:jdbc模版对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

2. 测试类中获取配置文件

       @SpringJUnitConfig(locations= {"classpath:applicationContext.xml"})

3.2 注解+配置类的实现方式

          1. 创建一个配置类,创建JdbcTemplate模板对象

package com.bdqn.config;
//配置类
@Configuration

//开启注解扫描
@ComponentScan(basePackages = {"com.bdqn.dao.impl","com.bdqn.service.impl"})

//加载读取配置文件
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
    //@Value 通常用于注入外部化属性
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.driverClass}")
    private String driver;
    @Value("${jdbc.userName}")
    private String username;
    @Value("${jdbc.userPwd}")
    private String password;

    /**
     * 创建数据源对象
     * @Bean 注释用于指示方法实例化、配置和初始化要由 Spring IoC 容器管理的新对象。
     * 对于那些熟悉 Spring <beans/> XML 配置的人来说, @Bean 注释与 <bean/> 元素起着相同的作用。
     */
    @Bean
    public DataSource  dataSource(){
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    /**
     * jdbcTemplate:jdbc模版对象
     */
    @Bean
    public JdbcTemplate  jdbcTemplate(DataSource dataSource){
        JdbcTemplate jdbcTemplate=new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }
}

2. 测试类中获取配置类

       @SpringJUnitConfig(classes = SpringConfig.class)

4. 学生实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {
    private String id;
    private String name;
    private String gender;
    private int age;
    private String classes;
}

  5. dao层 使用jdbcTemplate实现增加、删除、修改、查询的操作

1. 增加、删除、修改调用int jdbcTemplate.update(sql,Object...args),返回受影响的行数

2. 查询返回基本/String类型结果,

   调用jdbcTemplate.queryForObject(sql,Object...args,Class returnType)

3. 查询操作,返回一行记录的结果,封装成一个对象

   调用jdbcTemplate.queryForObject(sql,new RowMapper(),Object...args)

    注意:BeanPropertyRowMapper要求对象属性名必须和表的字段名完全一致

4. 查询操作,返回多行记录的结果集,封装成一个对象的集合

   调用jdbcTemplate.query(sql,new RowMapper(),Object...args)

dao接口

public interface StudentDao {
    public int  addStudent(Student student);
    public int updateStudent(Student student);
    public int deleteStudent(int id);
    public int selectCount();
    public Student selectById(int id);
    public List<Student> selectAll();
}

dao实现类

@Repository("studentDao")
public class StudentDaoImpl implements StudentDao {
    @Autowired
    JdbcTemplate jdbcTemplate;

    /**
     * 添加学生信息
     */
    @Override
    public int addStudent(Student student) {
        String sql="INSERT INTO student (id, NAME, gender, age, classes) VALUES (?, ?, ?, ?, ?)";
        int row=jdbcTemplate.update(sql,student.getId(),student.getName(),student.getGender(),student.getAge(),student.getClasses());
        return row;
    }

    /**
     * 修改学生信息
     */
    @Override
    public int updateStudent(Student student) {
        String sql="update student set NAME=?,gender=?,age=?,classes=? where id=?";
        int row=jdbcTemplate.update(sql,student.getName(),student.getGender(),student.getAge(),student.getClasses(),student.getId());
        return row;
    }

    /**
     * 删除学生信息
     */
    @Override
    public int deleteStudent(int id) {
        String sql="delete from student where id=?";
        int row=jdbcTemplate.update(sql,id);
        return row;
    }

    /**
     * 查询学生的人数
     */
    @Override
    public int selectCount() {
        String sql="select count(*) from student";
        int count=jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }

    /**
     * 根据编号查询一个学生信息
     */
    @Override
    public Student selectById(int id) {
        String sql="select * from student where id=?";
        /*
            //根据id查询
            Student student = jdbcTemplate.queryForObject(sql,  (rs, rowNum) -> {
                //自己处理结果映射
                Student stu = new Student();
                stu.setId(rs.getInt("id"));
                stu.setName(rs.getString("name"));
                stu.setAge(rs.getInt("age"));
                stu.setGender(rs.getString("gender"));
                stu.setClasses(rs.getString("classes"));
            return stu;
            }, 2);
         *  BeanPropertyRowMapper:指定java对象和row记录的映射关系
         *  根据:表字段名-->对象属性名进行映射
         *  dname--->dname  或者max_age--->maxAge
         */
        Student stu=jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Student.class),id);
        return stu;
    }
    

    /**
    * 查询所有学生信息
    */
    @Override
    public List<Student> selectAll() {
        String sql="select * from student";
        List<Student> list=jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Student.class));
        return list;
    }
}

   6.  Service层

接口

public interface StudentService {
    public int  addStudent(Student student);
    public int updateStudent(Student student);
    public int deleteStudent(int id);
    public int selectCount();
    public Student selectById(int id);
    public List<Student> getStudents();
}

实现类

@Service
public class StudentServiceImpl implements StudentService {
    //@Autowired
    @Resource
    StudentDao studentDao;

    @Override
    public int addStudent(Student student) {
        return studentDao.addStudent(student);
    }

    @Override
    public int updateStudent(Student student) {
        return studentDao.updateStudent(student);
    }

    @Override
    public int deleteStudent(int id) {
        return studentDao.deleteStudent(id);
    }

    @Override
    public int selectCount() {
        return studentDao.selectCount();
    }

    @Override
    public Student selectById(int id) {
        return studentDao.selectById(id);
    }

    @Override
    public List<Student> getStudents() {
        return studentDao.selectAll();
    }
}

    7.  测试类

//@SpringJUnitConfig(locations = "classpath:applicationContext.xml")

@SpringJUnitConfig(classes = SpringConfig.class)
public class TestDemo1 {
    @Autowired
    StudentService studentService;
    /*添加学生信息*/
    @Test
    public void test01(){
        Student stu=new Student(9,"吴王", "", 29, "高中二班");
        int row=studentService.addStudent(stu);
        System.out.println(row>0?"添加成功":"添加失败");
    }
    /*修改学生信息*/
    @Test
    public void test02(){
        Student stu=new Student(9,"吴小王", "", 19, "高中一班");
        int row=studentService.updateStudent(stu);
        System.out.println(row>0?"修改成功":"修改失败");
    }
    /*删除学生信息*/
    @Test
    public void test03(){
        int row=studentService.deleteStudent(9);
        System.out.println(row>0?"删除成功":"删除失败");
    }

    /*查询学生人数*/
    @Test
    public void test04(){
        int count=studentService.selectCount();
        System.out.println("学生人数:"+count);
    }
    /*查询单个学生信息*/
    @Test
    public void test05(){
        Student stu=studentService.selectById(8);
        System.out.println(stu);
    }

    /**
     * 查询所有学生信息
     */
    @Test
    public void test06(){
        List<Student> list=studentService.getStudents();
        for (Student stu:list) {
            System.out.println(stu);
        }

    }
}


http://www.ppmy.cn/embedded/128589.html

相关文章

Vue3新特性合集

Vue3 简介 ‌‌Vue 3‌ 是‌Vue.js的最新版本&#xff0c;它带来了许多改进和新的特性&#xff0c;旨在提供更好的性能、更强的类型支持以及更灵活的组件开发方式。Vue 3的推出是为了解决Vue 2中存在的一些限制&#xff0c;如响应式系统的限制和虚拟DOM的效率问题。Vue 3在多…

Dinky 字段模式演变 PIPELINE 同步MySQL到Doris

背景 用Dinky数据平台 FlinkCDC收集Mysql BinLog 至 Doris 搭建实时数仓 问题 用Dinky CDCSOURCE 字段模式演变 整库同步Mysql到Doris 字段新增删除不生效 组件信息 Flink 1.17 FlinkCDC 3.1 dinky 1.1 Doris 2.1.6 Mysql 8.0Dinky MySQLCDC 整库到 Doris需要的依赖 Flink/…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

【C++标准模版库】unordered_map和unordered_set的介绍及使用

unordered_map和unordered_set 一.unordered_set1.unordered_set类的介绍2.unordered_set和set的使用差异 二.unordered_map1.unordered_map和map的使用差异 三.unordered_multimap/unordered_multiset四.unordered_map/unordered_set的哈希相关接口 一.unordered_set 1.unord…

Git 可视化的实现:提升版本控制体验的利器

Git 是目前最流行的分布式版本控制系统&#xff0c;广泛应用于软件开发和项目管理中。然而&#xff0c;对于许多人来说&#xff0c;Git 命令行操作可能有些复杂且难以直观理解&#xff0c;特别是当涉及到复杂的分支和合并操作时。为了更好地帮助开发者掌握 Git 的操作过程&…

electron-vite_5打包后跳转失效?请用hash

关于打包后跳转失效, 请检查你的vue和react路由模式是不是hash模式&#xff1b; 注意必须使用hash模式&#xff0c;否则打包后路由跳转失效 React 版本 // "react-router-dom": "^6.11.2", import { HashRouter } from react-router-dom ReactDOM.createR…

树型名称前面插入图片

需求&#xff1a; 搜索树、树型要显示连线&#xff0c;还有名称前带图片 ui组件&#xff1a;https://devui.design/components/zh-cn/overview 直接上代码 [checkable] false 表示取消复选框 <div class"p-sm"><div class"row"><d-sea…

【vue】前置知识学习

代码获取 知识小结 1. 常量和变量 let 定义变量const 定义常量 2. 模板字符串 普通字符串是使用 “” 和 ‘’ 定义的 模板字符串是使用 定义的 模板字符串的好处 可以换行可以插入变量可以插入表达式 3. 对象 取值 .点取值 []方括号取值 // 对象定义 const obj {…