JDBC
Java DataBase Connectivity,java语言操作关系型数据库的一套API
入门程序
依赖项
xml
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
JDBC程序
java
public class JdbcTest {
/**
* JDBC入门程序
*/
@Test
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.执行sql(仅限DML语句)
int i = statement.executeUpdate("update user set age=25 where id=1");//DML
System.out.println("SQL语句执行完毕的影响的记录数:"+i);
//5.释放资源
statement.close();
connection.close();
}
}
查询数据
基于JDBC执行select语句,将查询结果封装到User对象中
ResultSet(结果集对象):ResultSet rs = statement.executeQuery()
- next():将光标从当前位置向前移动一行,并判断当前行是否为有效行,返回值boolean
true:有效行,当前行有数据
false:无效行,当前行没有数据 - getxxx(...):获取数据,可根据列的编号获取,也可根据列名获取(推荐)
java
@Test
public void testSelect(){
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
Connection connection = null;
PreparedStatement stmt = null;
ResultSet rs = null;//封装查询结果
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
connection = DriverManager.getConnection(url, username, password);
//3.执行sql
String sql = "select * from user where username=? && password=?";//预编译SQL
stmt = connection.prepareStatement(sql);
stmt.setString(1, "fangyuan");
stmt.setString(2, "123456");
rs = stmt.executeQuery();
//4.处理结果
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);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//5.释放资源
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
预编译SQL
java
String sql = "select * from user where username=? && password=?";//预编译SQL
优势一:防止SQL注入,更安全
优势二:性能更高
MyBatis
MyBatis是一款持久层框架,用于简化JDBC的开发
查询所有用户数据

-
准备工作:
1、创建SpringBoot工程,引入Mybatis相关依赖
2、准备数据库表user,实体类User
3、配置Mybatis(在application.properties中) -
编写Mybatis程序:编写Mybatis持久层接口,定义SQL(注解)
配置数据库的连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/web01
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
java
@Mapper//应用程序在运行时会自动为该接口创建一个实现类对象(代理对象),该对象会作为Spring Bean对象加入到Spring容器中
public interface UserMapper {
/**
* 查询所有用户
*/
@Select("select * from user")
public List<User> findAll();
}
java
@SpringBootTest //SpringBoot单元测试的注解 - 当前测试类中的测试方法运行时,会启动SpringBoot项目 - IOC容器
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testFindAll() {
List<User> users = userMapper.findAll();
users.forEach(System.out::println);
}
}
数据库连接池
- 一个容器,负责分配、管理数据库连接(资源重用)
- 允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个(提升系统响应速度)
- 释放空闲时间超过最大空闲时间的连接,避免因为没有释放连接而引起的数据库连接遗漏(避免数据库连接遗漏)
切换数据库连接池:

增删改查
删除用户-delete
Mapper接口
java
@Mapper//应用程序在运行时会自动为该接口创建一个实现类对象(代理对象),该对象会作为Spring Bean对象加入到Spring容器中
public interface UserMapper {
/**
* 根据id删除用户
*/
@Delete("delete from user where id = #{id}")
//public void deleteById(Integer id);
public Integer deleteById(Integer id);
}
java
@SpringBootTest //SpringBoot单元测试的注解 - 当前测试类中的测试方法运行时,会启动SpringBoot项目 - IOC容器
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 测试删除
*/
@Test
public void testdeleteById() {
Integer i = userMapper.deleteById(5);
System.out.println("执行完毕后,影响的记录数:"+i);
}
}

新增用户-insert
java
@Mapper//应用程序在运行时会自动为该接口创建一个实现类对象(代理对象),该对象会作为Spring Bean对象加入到Spring容器中
public interface UserMapper {
/**
* 添加用户
*/
@Insert("insert into user(username, password, name, age) values (#{username},#{password},#{name},#{age})")//大括号中写User对象的属性名
public void insert(User user);
}
java
@SpringBootTest //SpringBoot单元测试的注解 - 当前测试类中的测试方法运行时,会启动SpringBoot项目 - IOC容器
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 测试新增用户
*/
@Test
public void testInsert() {
User user = new User(null,"yuanlian","666888","元莲",24);
userMapper.insert(user);
}
}
修改用户-update
java
@Mapper//应用程序在运行时会自动为该接口创建一个实现类对象(代理对象),该对象会作为Spring Bean对象加入到Spring容器中
public interface UserMapper {
/**
* 更新用户
*/
@Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id=#{id}")
public void update(User user);
}
java
@SpringBootTest //SpringBoot单元测试的注解 - 当前测试类中的测试方法运行时,会启动SpringBoot项目 - IOC容器
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 测试修改用户
*/
@Test
public void testUpdateById() {
User user = new User(6,"kuangman","666888","狂蛮",34);
userMapper.update(user);
}
}
查询用户-select
java
@Mapper//应用程序在运行时会自动为该接口创建一个实现类对象(代理对象),该对象会作为Spring Bean对象加入到Spring容器中
public interface UserMapper {
/**
* 查询用户
*/
@Select("select * from user where username=#{username} and password=#{password}")
//public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
public User findByUsernameAndPassword(String username, String password);
@Param注解的作用是为接口的方法形参起名字
java
@SpringBootTest //SpringBoot单元测试的注解 - 当前测试类中的测试方法运行时,会启动SpringBoot项目 - IOC容器
class SpringbootMybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
/**
* 测试查询用户
*/
@Test
public void testFindByUsernameAndPassword() {
User user = userMapper.findByUsernameAndPassword("kuangman","666888");
System.out.println(user);
}
}
基于官方骨架创建的springboot项目中,接口编译时会保留方法形参名,@Param注解可以省略(#{形参名})
XML映射配置

基本框架
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.it.mapper.UserMapper">
<!-- resultType:查询返回的单条记录所封装的类型-->
<select id="findAll" resultType="com.it.pojo.User">
select id, username, password, name, age from user
</select>
</mapper>
原接口中的注解要注释掉
java
@Mapper//应用程序在运行时会自动为该接口创建一个实现类对象(代理对象),该对象会作为Spring Bean对象加入到Spring容器中
public interface UserMapper {
/**
* 查询所有用户
*/
//@Select("select id, username, password, name, age from user")
public List<User> findAll();
}
官方建议:使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
- 配置XML映射文件的位置

- MybatisX插件
SpringBoot配置文件格式
SpringBoot提供了多种属性配置方式(properties、yaml、yml)


yml配置文件
格式:
- 数值前面必须有空格,作为分隔符
- 使用缩进表示层级关系,缩进时不能使用Tab键,只能用空格(idea自动将Tab转为空格)
- 缩进空格数无要求,只要相同层级元素左侧对齐即可
- "#" 表示注释
定义对象/Map集合

定义数组/List/Set集合

注意
在yml格式的配置文件中,若配置项的值是以0开头,值要用''引起来。因为0开头的值在yml中表示八进制数值
yaml
spring:
application:
name: springboot-mybatis-quickstart
#数据库的连接信息
datasource:
url: jdbc:mysql://localhost:3306/web01
username: root
password: 1234
#mybatis的配置信息
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapper/*.xml