春天框架访问数据库的两种方式的小案例
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