一、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