原打算把Mysql操作數據庫的一些知識寫進去,但是感覺沒必要,要是現在會的都是簡單的增刪改查,所以,這一篇,我直接從java操作數據庫開始寫,所以這一篇大致就是記一下JDBC、MyBatis、以及SpringBoot的配置文件
JDBC
JDBC是java最底層最基礎的操作數據庫的技術,這一部分因為之后用的少,我直接從代碼開始看了。
@Testpublic void testUpdata() throws ClassNotFoundException, SQLException {//注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");//獲取數據庫鏈接String url = "jdbc:mysql://localhost:3306/web01";String username = "root";String password = "123456";Connection connection = DriverManager.getConnection(url, username, password);//獲取SQL語句執行對象Statement statement = connection.createStatement();//執行SQLint flag = statement.executeUpdate("update user set age = 25 where id = 1");//DML語句System.out.println("sql語句執行完畢 影響記錄數" + flag);//釋放資源statement.close();connection.close();}
這是基本操作的幾個步驟, 注冊驅動 數據庫連接 獲取SQL語句執行對象 然后執行SQL 關流
在SQL語句,為了防止SQL注入,我們一般使用參數動態傳遞,也就是預編譯SQL,不光可以防止SQL注入,而且性能更高,緩存會存儲已編譯的SQL語句。舉個栗子
@Testpublic void testSelect() {String url = "jdbc:mysql://localhost:3306/web01";String username = "root";String password = "123456";String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?";// 用于存儲查詢結果的 User 列表List<User> userList = new ArrayList<>();// JDBC 連接和查詢try (Connection connection = DriverManager.getConnection(url, username, password);PreparedStatement preparedStatement = connection.prepareStatement(sql)) {// 設置 SQL 參數preparedStatement.setString(1, "daqiao");preparedStatement.setString(2, "123456");// 執行查詢try (ResultSet resultSet = preparedStatement.executeQuery()) {// 遍歷結果集while (resultSet.next()) {// 將每一行數據封裝到 User 對象中User user = new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));user.setName(resultSet.getString("name"));user.setAge(resultSet.getInt("age"));// 將 User 對象添加到列表userList.add(user);}}} catch (SQLException e) {e.printStackTrace();}// 輸出查詢結果for (User user : userList) {System.out.println(user);}}
-
JDBC程序執行DML語句:int rowsUpdated = pstmt.executeUpdate(); //返回值是影響的記錄數
-
JDBC程序執行DQL語句:ResultSet resultSet = pstmt.executeQuery(); //返回值是查詢結果集
MyBatis?
MyBatis是一款優秀的持久層框架,用于簡化JDBC的開發,也就是之前提到的DAO層。通過Mybatis就可以大大簡化原生的JDBC程序的代碼編寫。在pom文件中導入Mybatis依賴即可使用。
在java中對于數據庫的數據,一般都使用對象進行封裝。
配置
然后在java文件夾的resouse中有一個數據庫的配置文件application.properties,用于
配置數據庫的連接信息
#數據庫訪問的url地址
spring.datasource.url=jdbc:mysql://localhost:3306/web
#數據庫驅動類類名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#訪問數據庫-用戶名
spring.datasource.username=root
#訪問數據庫-密碼
spring.datasource.password=root@1234
#mybatis的配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
但是遇到特別復雜的工程配置,一般使用application.yml進行配置 方便 直觀 清晰
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl這條配置是查看SQL語句執行的日志信息
spring:application:name: springboot-mybatis-quickstart#配置數據庫連接信息datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/web01driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:com.ght666.mapper/*.xml
編寫
一般編寫Mybatis程序 是在mapper包中編寫Mybatis的持久層接口,定義SQL語句(注解)
package com.ght666.mapper;import com.ght666.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper//應用程序在運行時會自動的為該接口創建一個實現類對象,并且會自動將該實現類對象存入IOC容器 -bean對象
public interface UserMapper {@Select("select * from user")public List<User> findAll();
}
-
@Mapper注解:表示是mybatis中的Mapper接口
? ? ? 程序運行時,框架會自動生成接口的實現類對象(代理對象),并給交Spring的IOC容器管理
-
@Select注解:代表的就是select查詢,用于書寫select查詢語句
在創建出來的SpringBoot工程中,在src下的test目錄下,已經自動幫我們創建好了測試類 ,并且在測試類上已經添加了注解 @SpringBootTest
,代表該測試類已經與SpringBoot整合。
該測試類在運行時,會自動通過引導類加載Spring的環境(IOC容器)。我們要測試那個bean對象,就可以直接通過@Autowired
注解直接將其注入進行,然后就可以測試了。
@SpringBootTest //springboot單元測試注解 當前測試類的測試方法運行時 會自動啟動Springboot 產生IOC容器
class SpringbootMybatisQuickstartApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll() {List<User> userList = userMapper.findAll();userList.forEach(System.out::println);//方法引用 }
}
?數據庫連接池
數據庫連接池是個容器,負責分配、管理數據庫連接(Connection),程序在啟動時,會在數據庫連接池(容器)中,創建一定數量的Connection對象
允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個
客戶端在執行SQL時,先從連接池中獲取一個Connection對象,然后在執行SQL語句,SQL語句執行完之后,釋放Connection時就會把Connection對象歸還給連接池(Connection對象可以復用)
釋放空閑時間超過最大空閑時間的連接,來避免因為沒有釋放連接而引起的數據庫連接遺漏,客戶端獲取到Connection對象了,但是Connection對象并沒有去訪問數據庫(處于空閑),數據庫連接池發現Connection對象的空閑時間 > 連接池中預設的最大空閑時間,此時數據庫連接池就會自動釋放掉這個連接對象
Spring默認連接池是Hikari(追光者),還有一個常用的是阿里巴巴開源的數據庫連接池項目Druid
如果使用Druid連接池,先添加依賴,再在application配置文件中
引入數據庫連接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
Mybatis占位符?
在Mybatis中,占位符是#{...}
生成的是預編譯的SQL語句。例如:
/*** 根據id刪除*/
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);
-
Mybatis的提供的符號,有兩個,一個是
#{...}
,另一個是${...}
,區別如下
符號 | 說明 | 場景 |
#{…} | 占位符。執行時,會將#{…}替換為?,生成預編譯SQL | 參數值傳遞 |
${…} | 拼接符。直接將參數拼接在SQL語句中,存在SQL注入問題 | 表名、字段名動態設置時使用 |
補充一個點:有一個注解,@param,這個注解的作用是為接口的方法形參起名字的。(由于用戶名唯一的,所以查詢返回的結果最多只有一個,可以直接封裝到一個對象中)舉個栗子
/*** 根據用戶名和密碼查詢用戶信息*/
@Select("select * from user where username = #{username} and password = #{password}")
public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
XML映射配置
Mybatis的開發有兩種方式:注解? XML。使用Mybatis的注解方式,主要是來完成一些簡單的增刪改查功能。如果需要實現復雜的SQL功能,建議使用XML來配置映射語句,也就是將SQL語句寫在XML配置文件中。
XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名) 如果不同包同名,可以在配置文件中添加配置
mybatis:mapper-locations: classpath:com.ght666.mapper/*.xml
XML映射文件的namespace屬性為Mapper接口全限定名,XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ght666.mapper.UserMapper"><!--查詢操作--><select id="findAll" resultType="com.ght666.pojo.User">select * from user</select>
</mapper>
SpringBoot配置文件
主要就是yml配置文件的語法:
-
大小寫敏感
-
數值前邊必須有空格,作為分隔符
-
使用縮進表示層級關系,縮進時,不允許使用Tab鍵,只能用空格(idea中會自動將Tab轉換為空格)
-
縮進的空格數目不重要,只要相同層級的元素左側對齊即可
-
#
表示注釋,從這個字符一直到行尾,都會被解析器忽略
yml文件中常見的數據格式。在這里我們主要介紹最為常見的兩類:
-
定義對象或Map集合
-
定義數組、list或set集合
user:name: zhangsanage: 18password: 123456hobby: - java- game- sport