Spring框架访问数据库的两种方式的小案例

技术Spring框架访问数据库的两种方式的小案例 Spring框架访问数据库的两种方式的小案例1.1 以Xml的方式访问数据库的案例
要以xml的方式访问数据库需要用到JdbcTemplate ,因为

春天框架访问数据库的两种方式的小案例

1.1 以Xml的方式访问数据库的案例

要以可扩展标记语言的方式访问数据库需要用到JdbcTemplate,因为JdbcTemplate(jdbc的模板对象)在春天中提供了一个可以操作数据库的对象组织。弹簧框架。JDBC。核心。JDBC模板。

以可扩展标记语言的方式访问数据库的案例主要是以下几个步骤:

(1) 创建user(对应的表)表并添加数据

创建表格用户(

id INT,

用户名VARCHAR(20),

密码可变字符(20)

)

插入用户(id,用户名,密码)值(1001,"插孔","123");

插入用户(id,用户名,密码)值(1002,"玫瑰","456");

插入用户(id,用户名,密码)值(1003,“汤姆”,“789”);

(2) 创建maven工程后,在pom.xml中导入依赖

属国

!春天的核心依赖-

属国

groupIdorg.springframework/groupId

artifactIdspring-上下文/artifactId

版本5 .3 .10/版本

/依赖性

!- jdbc模板对象依赖-

属国

groupIdorg.springframework/groupId

人工泉水-JDBC/人工

版本5 .3 .10/版本

/依赖性

!- mysql数据库的依赖-

属国

groupIdmysql/groupId

artifactIdmysql-连接器-java/artifactId

8.0.26版/版本

/依赖性

!-连接池的依赖-

属国

groupIdcom.alibaba/groupId

artifactIddruid/artifactId

版本1 .2 .8/版本

/依赖性

!-注解的依赖-

属国

groupIdorg.projectlombok/groupId

artifactIdlombok/artifactId

版本1 .18 .20/版本

/依赖性

!-用于测试的依赖-

属国

groupIdjunit/groupId

artifactIdjunit/artifactId

版本4 .13 .2/版本

示波器测试/示波器

/依赖性

/依赖项

(3)创建实体类

打包。qf。POJO

导入朗博克岛.数据;

@数据

公共类用户{

私有整数id;

私有字符串名称;

私有字符串密码;

}

(4)创建Mapper层的UserMapper接口及UserMapperImpl实现类

打包。qf。映射器;

导入com。qf。POJO。用户;

导入Java。乌提尔。列表;

公共接口用户映射程序{

//查询所有
public ListUser findAll();
}

package com.qf.mapper.impl;
import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserMapperImpl implements UserMapper {
    //声明jdbc模板对象(jdbcTemplate),调用方法
    private JdbcTemplate jdbcTemplate;
    //set方法注入
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    @Override
    public ListUser findAll() {
        //准备sql语句
        String sql ="select id,name,password from t_user";
        //调用方法,query:查询
        // update: 修改
        // BeanPropertyRowMapper:是jdbcTemplate内封装好的对象,保存着由查询所有方法及实体类属性得到的查询数据
        ListUser users = jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class));
        return users;
    }
}
(5) 创建Service层的UserService接口以及UserServiceImpl实现类
package com.qf.service;
import com.qf.pojo.User;
import java.util.List;
public interface UserService {
    public ListUser findAll();
}
package com.qf.service.impl;
import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import com.qf.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
    // 声明userMapper
    private UserMapper userMapper;
    // set注入
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
    @Override
    public ListUser findAll() {
        return userMapper.findAll();
    }
}
(6)创建controller层的UserController
package com.qf.controller;
import com.qf.pojo.User;
import com.qf.service.UserService;
import java.util.List;
public class UserController {
    //声明userService
    private UserService userService;
    //提供set方法,在配置文件通过set方法注入
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    //创建findAll方法
    public ListUser findAll(){
        return userService.findAll();
    }
}
(7) 创建jdbc.properties配置文件
db.username = root
db.password = root
db.driverClassName = com.mysql.cj.jdbc.Driver
db.url = jdbc:mysql://localhost:3306/java2109serverTimezone=Asia/ShanghaicharacterEncoding=UTF8
(8) 创建applicationContext.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 http://www.springframework.org/schema/context/spring-context.xsd" !-- bean definitions here --
    !--引入配置文件 将db.properties加载到配置文件用来连接数据库 --
    !-- property-placeholder:引入外部配置文件
    location:位置
    classpath:当前src下的目录
    --
    context:property-placeholder location="classpath:db.properties"/context:property-placeholder
     !-- 引入数据源(当前使用的数据连接池)
     property:将对象的对应属性注入值
     --
    bean  class="com.alibaba.druid.pool.DruidDataSource"
        property name="username" value="root"/property
        property name="password" value="root"/property
        property name="url" value="${db.url}"/property
        property name="driverClassName" value="${db.driverClassName}"/property
    /bean
    !-- 创建JdbcTemplate对象--
    bean  class="org.springframework.jdbc.core.JdbcTemplate"
        property name="dataSource" ref="dataSoure"/property
     /bean
    !-- Dao层--
    bean  class="com.qf.mapper.impl.UserMapperImpl"
        property name="jdbcTemplate" ref="JdbcTemplate"/property
    /bean
    !-- Service层--
    bean  class="com.qf.service.impl.UserServiceImpl"
        property name="userMapper" ref="userMapper"/property
    /bean
    !-- Controller层--
    bean  class="com.qf.controller.UserController"
        property name="userService" ref="userService"/property
    /bean
/beans
(9)创建测试类SpringTest
package com.qf.test;
import com.qf.controller.UserController;
import com.qf.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class SpringTest {
    @Test
    public void testFindAll() {
        //加载配置文件,创建applicationContext对象
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取Bean对象(即userController)
        UserController userController =(UserController) applicationContext.getBean("userController");
        //调用findAll方法
        ListUser userList = userController.findAll();
        System.out.println(userList);
    }
}
(10) 测试结果
[User(id=1, name=jack, password=123), User(id=2, name=tom, password=456), User(id=3, name=rose, password=789)]
Process finished with exit code 0

2 以注解的方式访问数据库

(1)Spring中的注解
@Configuration
?    作用:指定当前类是一个配置类
?    细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
@ComponentScan
作用:用于通过注解指定spring在创建容器时要扫描的包
属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
等同于xml中:  context:component-scan base-package="com.qf"/
@PropertySource
作用:用于指定properties文件的位置
属性:value:指定文件的名称和路径。
关键字:classpath,表示类路径下
等同于xml中:  context:property-placeholder location="classpath:jdbc.properties"/
@Bean
?    作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
?    属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称
?    细节:当我们使用注解配置方法时,如果方法有参数,在参数前加:
@Qualifier("@Bean注解中name的值"),spring框架会去容器中查找有没有可用的bean对象查找的方式和Autowired注解的作用是一样的。
@Import
?    作用:用于导入其他的配置类
?    属性:value:用于指定其他配置类的字节码。
?    当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
?    等同于xml中:  import resource="xxx.xml"/import
(2) 创建user(对应的表)表并添加数据
CREATE TABLE USER(
    id INT,
    username VARCHAR(20),
    PASSWORD VARCHAR(20)
)
    
INSERT INTO USER(id,username,PASSWORD) VALUES(1001,'jack','123');
INSERT INTO USER(id,username,PASSWORD) VALUES(1002,'rose','456');
INSERT INTO USER(id,username,PASSWORD) VALUES(1003,'tom','789');
(3) 创建maven工程后,在pom.xml中导入依赖
 dependencies
        !-- Spring的核心依赖--
        dependency
            groupIdorg.springframework/groupId
            artifactIdspring-context/artifactId
            version5.3.10/version
        /dependency
?
        !-- jdbc模板对象依赖--
        dependency
            groupIdorg.springframework/groupId
            artifactIdspring-jdbc/artifactId
            version5.3.10/version
        /dependency
?
        !-- mysql数据库的依赖--
        dependency
            groupIdmysql/groupId
            artifactIdmysql-connector-java/artifactId
            version8.0.26/version
        /dependency
?
        !-- 连接池的依赖--
        dependency
            groupIdcom.alibaba/groupId
            artifactIddruid/artifactId
            version1.2.8/version
        /dependency
?
        !-- 注解的依赖--
        dependency
            groupIdorg.projectlombok/groupId
            artifactIdlombok/artifactId
            version1.18.20/version
        /dependency
?
        !-- 用于测试的依赖--
        dependency
            groupIdjunit/groupId
            artifactIdjunit/artifactId
            version4.13.2/version
            scopetest/scope
        /dependency
     
        !-- 集成junit包
        为了解决纯注解时找不到配置文件不好测试问题
        --
        dependency
            groupIdorg.springframework/groupId
            artifactIdspring-test/artifactId
            version5.3.10/version
        /dependency
    /dependencies
(4) 创建jdbc.properties配置文件
db.username = root
db.password = root
db.driverClassName = com.mysql.cj.jdbc.Driver
db.url = jdbc:mysql://localhost:3306/java2109serverTimezone=Asia/ShanghaicharacterEncoding=UTF8
(5)创建SpringConfiguration.java作为注解配置类(==bean.xml)
package com.qf.config;
?
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
?
import javax.sql.DataSource;
import java.util.Properties;
//指定当前类为配置类,优于其他类先执行,替换applicationContext.xml文件
@Configuration
?
//@PropertySource用于指定properties文件的位置
//引入配置文件,连接数据库
@PropertySource(value = "classpath:db.properties")
?
@ComponentScan("com.qf")//扫描对应包下的注解
public class SpringConfiguration {
?
    //引入配置文件db.properties的属性、值
    @Value("${db.username}")
    private String username;
    @Value("${db.password}")
    private String password;
    @Value("${db.url}")
    private String url;
    @Value("${db.driverClassName}")
    private String driverClassName;
?
    @Bean//把当前方法的返回值放在Spring容器中,相当于bean id = "" class = ""
    //为了不再单独写一个数据源,将数据源(连接池)封装到JdbcTemplate,返回JdbcTemplate获得数据源
    public JdbcTemplate getJdbcTemplate(){
        //创建properties对象,为了获取数据源
        Properties properties = new Properties();
        //设置对应参数,获得对应数据源的值
        properties.setProperty("username",username);
        properties.setProperty("password",password);
        properties.setProperty("url",url);
        properties.setProperty("driverClassName",driverClassName);
?
        try {
            //获取数据源
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            //返回Jdbc模版对象
            return new JdbcTemplate(dataSource);
?
        } catch (Exception e) {
            e.printStackTrace();
        }
?
        throw new RuntimeException("连接数据库异常");
    }
?
}

(6)创建实体类
package com.qf.pojo;
?
import lombok.Data;
?
@Data
public class User {
?
    private Integer id;
    private String name;
    private String password;
?
}
(7)创建controller层的UserController
package com.qf.controller;
?
import com.qf.pojo.User;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
?
@Controller//把当前类对象存入spring容器中
public class UserController {
?
    @Autowired//按照类型自动注入
    private UserService userService;
?
    public User findById(Integer id){
        return userService.findById(id);
    }
}

(8)创建Mapper层的UserMapper接口及UserMapperImpl实现类
package com.qf.mapper;
?
import com.qf.pojo.User;
?
public interface UserMapper {
    
    User findById(Integer id);
}
?
package com.qf.mapper.impl;
?
import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
?
@Repository//把当前类对象存入spring容器中
public class UserMapperImpl implements UserMapper {
?
    @Autowired//按照类型自动注入
    //引入jdbcTemplate,调用方法
    private JdbcTemplate jdbcTemplate;
?
    @Override
    public User findById(Integer id) {
        //准备sql语句
        String sql = "select id,name,password from t_user where id = ";
?
        //调用方法,并返回查询数据
        // query:查询
        // update: 修改
        // BeanPropertyRowMapper:是jdbcTemplate内封装好的对象,保存着由查询所有方法及实体类属性得到的查询数据
        // 返回值是一个集合,加get(0)表示获取集合的第一个对象返回
        return jdbcTemplate.query(sql,new BeanPropertyRowMapper(User.class),id).get(0);
    }
}
?
(9) 创建Service层的UserService接口以及UserServiceImpl实现类
package com.qf.service;
?
import com.qf.pojo.User;
?
public interface UserService {
    
    User findById(Integer id);
}
?
package com.qf.service.impl;
?
import com.qf.mapper.UserMapper;
import com.qf.pojo.User;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
?
@Service////把当前类对象存入spring容器中
public class UserServiceImpl implements UserService {
?
    @Autowired//按照类型自动注入
    //引入userMapper,调用方法
    private UserMapper userMapper;
?
    @Override
    public User findById(Integer id) {
        return userMapper.findById(id);
    }
}
(10) 创建测试类SpringTast
package com.qf.test;
?
import com.qf.config.SpringConfig;
import com.qf.config.SpringConfiguration;
import com.qf.controller.UserController;
import com.qf.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
?
@RunWith(SpringJUnit4ClassRunner.class)//集成Juint,测试纯注解访问数据库
//@ContextConfiguration(classes= SpringConfiguration.class)//引入配置类
@ContextConfiguration(classes= SpringConfig.class)//引入配置类
public class SpringTest {
?
    //按照类型自动注入
    @Autowired
    //引入userController,调用方法
    private UserController userController;
?
    @Test
    public void testFindById(){
?
        User user = userController.findById(3);
        System.out.println(user);
    }
}
?
(11) 测试结果
[User(id=1, name=jack, password=123), User(id=2, name=tom, password=456), User(id=3, name=rose, password=789)]
?
Process finished with exit code 0

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/36345.html

(0)

相关推荐

  • php如何强行转数组

    技术php如何强行转数组这篇文章主要介绍php如何强行转数组,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! php强行转数组的方法:1、新建一个php文件,并将一个字符

    攻略 2021年11月30日
  • 怎么用Vue实现大屏页面的屏幕自适应

    技术怎么用Vue实现大屏页面的屏幕自适应本篇内容介绍了“怎么用Vue实现大屏页面的屏幕自适应”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅

    攻略 2021年10月22日
  • go语言中字符串的拼接方式有哪些

    技术go语言中字符串的拼接方式有哪些本篇内容主要讲解“go语言中字符串的拼接方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中字符串的拼接方式有哪些”吧!+拼

    攻略 2021年12月9日
  • 夜路,晚上走夜路150字作文

    技术夜路,晚上走夜路150字作文第一次走夜路_150字在记忆的大海中,一朵朵浪花拍打着海岸,又消失了夜路。可是,只有一朵浪花拍打着海岸,退去再打上海岸,再打上海岸,不断的从我的脑海重现那个第一次走夜路。记得在一个黑夜,我

    生活 2021年10月29日
  • 将全站进行HTTPS化优势是什么

    技术将全站进行HTTPS化优势是什么本篇文章为大家展示了将全站进行HTTPS化优势是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在HTTPS项目的开展过程中明显感觉到目前国

    攻略 2021年11月12日
  • java-异常-异常注意事项

    技术java-异常-异常注意事项 java-异常-异常注意事项1 package p1.exception;2 3 /*4 * 异常的注意事项:5 * 6 * 1,子类在覆盖父类方法时,父类的方法

    礼包 2021年11月5日