JDBC

简单了解,非重点

本质

就是一套规范、接口,实际运行需要引入驱动(jar包)

操作步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1.注册驱动
Class.forName(className:"com.mysql.cj.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://localhost:3306/localpackage";
String username = "root";
String password = "1234"
Connection connection = DriverManager.getConnection(url, username, password)
// 3.获取SQL语句执行对象
Statement statement = connection.createStatement();
// 4.执行SQL
// 语句书写
// 5.释放资源
statement.close();
connection.close();

执行DQL语句

执行调用

DQL:ResultSet rs = statement.executeQuery();
DML:int rowsAffected = statement.executeUpdate();

结果集ResultSet解析

  • resultSet.next():光标往下移动一行
  • resultSet.getXxx():获取字段数据

预编译SQL - 参数动态传递

优势

  • 可以防止SQL注入,更安全
  • 性能更高

执行预编译SQL(eg)

1
2
3
4
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?");
ps.setString(1,"Username");
ps.setString(2,"Password");
ResultSet resultSet = pstmt.executeQuery();

MyBatis - 持久层框架

官方文档

准备与编写

准备工作

  1. 创建SpringBoot工程、引入Mybatis相关依赖-MySQL Driver + MyBatis Framework

    勾选不了查看更换下springboot的版本,太新或者太旧都不行

  2. 准备数据库表user、实体类User
  3. 配置Mybatis(在application.properties中数据库连接信息)

编写Mybatis程序

  • 编写Mybatis的持久层接口,定义SQL(注解/XML)

    Mybatis的持久层接口命名规范为 XxxMapper,也称为 Mapper接口。

辅助配置

  • 右键选择 show Context Actions->Inject language or reference->MySQL就可以配置SQL提示
  • 配置Mybatis日志输出
1
2
# mybatis的配置
mybatis.configuration.log-impl = org.apache.ibatis.logging.stdout.StdOutImpl

数据库连接池

  • 允许应用程序重复使用一个现有的数据库连接,而不是重新再建
  • 释放空闲时间超过最大空闲时间的连接,避免没有释放连接而引起的数据库连接遗漏

优势

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

使用数据库连接池

  • 标准接口:DataSource

    已经不需要自己去添加数据库连接池了

  • 常见产品:Hikari->Springboot默认、Druid

切换数据库连接池

  1. 第一步
1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.19</version>
</dependency>
  1. 第二步
1
2
3
4
5
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
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=1234

增删改查

删除操作

删除用户-delete

  • 需求:根据ID删除用户信息
  • SQL: delete from user where id = 5;
  • Mapper接口:
1
2
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);

DML语句执行完毕的返回值,表示该DMl语句执行完毕影响的行数
意思也就是说,如果void改成Integer,打印输出1意味着影响了一行

  • Mybatis中#号$号
    • #{…}-占位符。执行会替换为?,生成预编译SQL-用于参数值传递-安全、性能高
    • ${…}-拼接符。直接将参数拼接到SQL语句中,存在SQL注入问题-用于表名、字段名动态设置-不安全、性能低

新增操作

新增用户-insert

  • 需求:添加一个用户
  • SQL:insert into user(username,password,name,age) values(‘zhouyu’,’123456’,’周瑜’,20);
  • Mapper接口:
1
2
@Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})");
public void insert(User user);

更新操作

修改用户-update

  • 需求:根据ID更新用户信息
  • SQL: uodate user username= ‘zhouyu’, password=’123456’ , name = ‘周瑜’, age = 20 where id = 1;
1
2
@Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id = #{id}")
public void update(User user);

查询操作

查询用户-select

  • 需求:根据用户名和密码查询用户信息
  • SQL: select * from user where username = ‘zhouyu’ and password = ‘666888’;
1
2
@Select("select * from user where username=#{username} and password=#{password}")
public User findByUsernameAndpassword(@Param("username") String username,@Param("password") String password);

@Param注解的作用是为接口的方法形参起名字的。
基于官方骨架创建的springboot项目中,接口编译时会保留方法形参名,@Param注解可以省略
参考如下

1
2
@Select("select * from user where username=#{uname} and password=#{pwd}")
public User findByUsernameAndpassword(String uname,String pwd);

XML映射配置

功能与默认规则

  • 通过XmL配置文件配置SQL语句
  • 默认规则
    • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放在相同包下(同包同名)
    • XML映射文件的namespace属性为Mapper接口全限定名一致
    • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

辅助配置

  • 在application.properties中配置XML映射文件位置
1
2
mybatis.mapper-locations=classpath:mapper/*.xml
# 路径是在类(class)路径下的路径
  • 推荐下载idea插件提升效率-MybatisX