1.1 以Xml的方式訪問資料庫的案例
要以xml的方式訪問資料庫需要用到JdbcTemplate ,因為 JdbcTemplate(jdbc的模板物件)在Spring 中提供了一個可以操作資料庫的物件org.springframework.jdbc.core.JdbcTemplate,
以xml的方式訪問資料庫的案例主要是以下幾個步驟:
(1) 創建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');
(2) 創建maven工程后,在pom.xml中匯入依賴
<dependencies>
<!-- Spring的核心依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<!-- jdbc模板物件依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.10</version>
</dependency>
<!-- mysql資料庫的依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- 連接池的依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- 注解的依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- 用于測驗的依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
(3)創建物體類
package com.qf.pojo; import lombok.Data; @Data public class User { private Integer id; private String name; private String password; }
(4)創建Mapper層的UserMapper介面及UserMapperImpl實作類
package com.qf.mapper; import com.qf.pojo.User; import java.util.List; public interface UserMapper { //查詢所有 public List<User> 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 List<User> findAll() { //準備sql陳述句 String sql ="select id,name,password from t_user"; //呼叫方法,query:查詢 // update: 修改 // BeanPropertyRowMapper:是jdbcTemplate內封裝好的物件,保存著由查詢所有方法及物體類屬性得到的查詢資料 List<User> 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 List<User> 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 List<User> 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 List<User> 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/java2109?serverTimezone=Asia/Shanghai&characterEncoding=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 id="dataSoure" class="com.alibaba.druid.pool.DruidDataSource"> <property name="username" value="https://www.cnblogs.com/z-z-s/archive/2021/10/18/root"></property> <property name="password" value="https://www.cnblogs.com/z-z-s/archive/2021/10/18/root"></property> <property name="url" value="https://www.cnblogs.com/z-z-s/archive/2021/10/18/${db.url}"></property> <property name="driverClassName" value="https://www.cnblogs.com/z-z-s/archive/2021/10/18/${db.driverClassName}"></property> </bean> <!-- 創建JdbcTemplate物件--> <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSoure"></property> </bean> <!-- Dao層--> <bean id="userMapper" class="com.qf.mapper.impl.UserMapperImpl"> <property name="jdbcTemplate" ref="JdbcTemplate"></property> </bean> <!-- Service層--> <bean id="userService" class="com.qf.service.impl.UserServiceImpl"> <property name="userMapper" ref="userMapper"></property> </bean> <!-- Controller層--> <bean id="userController" 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方法 List<User> 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>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
?
<!-- jdbc模板物件依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.10</version>
</dependency>
?
<!-- mysql資料庫的依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
?
<!-- 連接池的依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
?
<!-- 注解的依賴-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
?
<!-- 用于測驗的依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- 集成junit包
為了解決純注解時找不到組態檔不好測驗問題
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.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/java2109?serverTimezone=Asia/Shanghai&characterEncoding=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 = "https://www.cnblogs.com/z-z-s/archive/2021/10/18/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.uj5u.com/houduan/322985.html
標籤:其他
上一篇:聽說,99% 的 Go 程式員都被 defer 坑過
下一篇:常見的JVM引數
