一、JDBC
JDBC:(Java DataBase Connectivity),就是使用Java語言操作關系型數據庫的一套API。
為了使用JDBC操作數據庫,首先,我們需要在pom.xml文件中引入依賴
<dependencies><!-- MySQL JDBC driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.3</version><scope>test</scope></dependency>
</dependencies>
JDBC案例
public void testUpdate() throws Exception {//1、注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");//2、獲取數據庫連接String url ="jdbc:mysql://localhost:3306/web01";String username ="root";String password ="1234";Connection connection = DriverManager.getConnection(url, username, password);//3、獲取sql執行對象Statement statement = connection.createStatement();//4、執行SQLint i = statement.executeUpdate("update user set age = 25 where id =1");//DMLSystem.out.println("SQL語句執行完畢影響的記錄數為:"+ i);//5、釋放資源statement.close();connection.close();}
預編譯SQL
這是一種編寫SQL語句時,不將其中的數據寫死,而是用占位符代替,在后續需要查詢時替換占位符的方法。
conn.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?");
pstmt.setString(1, "daqiao");
pstmt.setString(2, "123456");
ResultSet resultSet = pstmt.executeQuery();
這種呢,并未將參數值在SQL語句中寫死,而是使用 ? 進行占位,然后再指定每一個占位符對應的值是多少,而最終在執行SQL語句的時候,程序會將SQL語句(SELECT * FROM user WHERE username = ? AND password = ?),以及參數值("daqiao", "123456")都發送給數據庫,然后在執行的時候,會使用參數值,將?占位符替換掉。
那這種預編譯的SQL,也是在項目開發中推薦使用的SQL語句。主要的作用有兩個:?
防止SQL注入?(例如輸入密碼時輸入引號等符號然后傳入程序,惡意更改程序內容)
性能更高
當我們使用JDBC查詢數據庫中的數據時,需要創建一個類用于存儲查詢返回的值(其中成員變量的數據類型為封裝后的數據類型)。ResultSet(結果集對象):封裝了DQL查詢語句查詢的結果。
package org.example;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {private Integer id;private String username;private String password;private String name;private Integer age;
}
public void testSelect(){String url ="jdbc:mysql://localhost:3306/web01";String username ="root";String password ="1234";Connection conn=null;PreparedStatement stmt = null;ResultSet rs = null; //封裝返回的結果集try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url, username, password);//?為占位符String sql = "SELECT id,username,password,name,age FROM user WHERE username=? AND password=?";//預編譯SQLstmt = conn.prepareStatement(sql);stmt.setString(1, "daqiao"); //為占位符賦值stmt.setString(2, "123456");rs = stmt.executeQuery();while(rs.next()){User user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"),rs.getString("name"),rs.getInt("age"));System.out.println( user); //用Lombol的@Data注解生成的toString()方法}} catch (Exception e) {e.printStackTrace();} finally {try{if(rs != null) rs.close();if(stmt != null) stmt.close();if(conn != null) conn.close();}catch (Exception e){e.printStackTrace();}}}
Mybatis
MyBatis是一款優秀的持久層框架,用于簡化JDBC的開發。
在IDEA中使用Mybatis需要在創建項目時引入以下三個文件。mybatis的起步依賴、mysql的驅動包、lombok。
項目工程創建完成后,自動在pom.xml文件中,導入Mybatis依賴和MySQL驅動依賴。
配置Mybatis
在 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
在創建出來的springboot工程中,在引導類所在包下,在創建一個包 mapper
。在 mapper
包下創建一個接口 UserMapper
,這是一個持久層接口(Mybatis的持久層接口規范一般都叫 XxxMapper)。
程序案例
package com.codeblossom.springbootwebmyhabitsquickstract.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {private Integer id;private String username;private String password;private String name;private Integer age;
}
package com.codeblossom.springbootwebmyhabitsquickstract.mapper;import com.codeblossom.springbootwebmyhabitsquickstract.pojo.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper //應用程序創建時,會自動為該接口創建一個實現類對象(代理對象),并且會自動將該實現類放入IOC容器 -bean對象
public interface UserMapper {//@Select("select * from user") // 查詢所有用戶public List<User> findAll();/*** 根據id刪除*/@Delete("delete from user where id=#{id}")public Integer deleteById(int id); //Integer返回值,表示受影響的行數/*新增一個用戶*/@Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})")public Integer Insert(User user);/*根據id更新用戶信息*/@Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id=#{id}")public Integer updateById(User user);/*根據用戶名和密碼查詢用戶信息*/@Select("select * from user where username=#{username} and password=#{password}")public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password); //因為用戶名唯一,所以可以直接用一個對象封裝返回
}
package com.codeblossom.springbootwebmyhabitsquickstract;import com.codeblossom.springbootwebmyhabitsquickstract.mapper.UserMapper;
import com.codeblossom.springbootwebmyhabitsquickstract.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest //SpringBoot中的單元測試注解,當前測試類中的測試方法運行時,會啟動Springboot項目-IOC容器
class SpringBootWebMyhabitsquickstractApplicationTests{@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll(){List<User> userlist = userMapper.findAll();userlist.forEach(user -> System.out.println(user));}@Testpublic void testDeleteById(){int result = userMapper.deleteById(1);System.out.println(result);}@Testpublic void testInsert(){User user = new User();user.setUsername("admin");user.setPassword("123456");user.setName("管理員");user.setAge(18);int result = userMapper.Insert(user);System.out.println(result);}@Testpublic void testUpdate(){User user = new User();user.setId(6);user.setUsername("admin");user.setPassword("123456");user.setName("管理員");user.setAge(19);int result = userMapper.updateById(user);System.out.println(result);}@Testpublic void testfindByUsernameAndPassword(){User user = userMapper.findByUsernameAndPassword("admin","123456");System.out.println(user);}
}
XML映射配置
使用Mybatis的注解方式,主要是來完成一些簡單的增刪改查功能。如果需要實現復雜的SQL功能,建議使用XML來配置映射語句,也就是將SQL語句寫在XML配置文件中。
在Mybatis中使用XML映射文件方式開發,需要符合一定的規范:
XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名)
XML映射文件的namespace屬性為Mapper接口全限定名一致
XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致。
xml映射文件中的dtd約束,直接從mybatis官網復制即可; 或者直接AI生成。?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=""></mapper>
案例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.codeblossom.springbootwebmyhabitsquickstract.mapper.UserMapper"><select id="findAll" resultType="com.codeblossom.springbootwebmyhabitsquickstract.pojo.User">
<!-- id為方法名,resultType:查詢返回單條記錄所封裝的類型(用于查詢語句上面)-->select * from user</select></mapper>
XML映射文件的namespace屬性為Mapper接口全限定名
XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致
若是想要在別的路徑下使用xml文件,可以在application.properties
中配置
#指定XML映射配置文件的位置
#在mapper下創建xml文件
mybatis.mapper-locations=classpath:mapper/*.xml