文章目录
简介
本文是2021/05/14整理的笔记
赘述可能有点多,还请各位朋友耐心阅读
本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进
使用JDBC调用存储过程
cs = connection.prepareCall("call 存储过程名(?,?,?)");
cs.setString("参数名",值);
cs.setString("索引",值);
增删改
cs.execute();
cs.getUpdateCount();
查询
rs = sc.executeQuery();
while(rs.next()){
rs.getString("列名");
}
使用JDBC调用函数
ps = connection.prepareStatement(“select 函数名(?,?)”);
ps.setString(1,值);
rs = ps.executeQuery();
if(rs.next()){
}
MySQL使用字符集
MySQL8默认字符集是utf8mb4 > utf8
character_set_client(客户端)
character_set_connection(连接)
character_set_results(返回结果的字符集)
character_set_server 服务器字符集
预编译SQL
sql注入:原来SQL加:'or1=1 --# 使得不符合条件变成符合条件 原来查不到数据 现在能够查到 用户就能看到敏感数据Statement:暴力拼接字符串 容易造成SQL注入
PrepareStatement在sql中使用?占位符代替值,需要在程序中给?赋值 其他:暴力拼接字符串 自己SQL注入(在?后写or - 1=1)
sql语句每次执行的时候需要先编译再执行 效率低
预编译:提前第一次执行先编译好存储到数据库服务器上,下次执行的时候直接不编译,把客户端传来的参数给数据库服务器即可,执行已经编译好的SQL,不编译,效率高
PrepareStatement和Statement区别
- PrepareSatement:预编译sql,把sql语句提前编译好放到数据库服务器上,运行时客户端将?
所代表的参数传进来,给对应的?赋值.提高效率 - Stament:没有?占位符,直接拼接sql语句,不安全.不预先编译sql,每次执行都编译一次,效率
低下. 推荐用 PrepareStatement.
c3p0数据库连接池
- 可重用性高
- 效率高
- 可扩展性高
- c3p0,druid,hikari
- c3p0使用步骤
(1) c3p0-0.9.1.jar
(2) src下建立c3p0-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
< c3p0-config >
< default-config >
<!--配置JDBC 四个基本属性-->
< property name="driverClass" >com.mysql.jdbc.Driver< /property >
< property name="jdbcUrl">jdbc:mysql:///c?userSSL=false< /property >
< property name="user" >root< /property >
< property name="password">123456< /property >
< /default-config >
< /c3p0-config >
(3)静态的成员变量private static DataSource dataSource = new ComboPooledDataSource();
(4)得到连接 connection = dataSource.getConnection();
Dbutils
1. Apache出品的工具包
2. 使用步骤
1. 拷贝jar包
2. QueryRunner runner = new QueryRunner(DataSource);
1. 增删改:int rows = runner.update(sql,参数值,参数值...);
@Test
public void testAddDBUtils(){
try {
int i = runner.update("ins","燕青",20);
System.out.println("i = " + i);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testUpdateDBUtils(){
try {
int i = runner.update("update person set name=?,age=? where id=?","张瑜",21,6);
System.out.println("i = " + i);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testDelDBUtils(){
try {
int i = runner.update("delete from person where id = ?",6);
System.out.println("i = " + i);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void testCountDbutils(){
try {
Long count = runner.query("select count(*) from person where name like ?", new ScalarHandler<>(), "%武%");
System.out.println("count = " + count.intValue());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@Test
public void testListDbutils(){
try {
List<Person> list = runner.query("select * from person where name like ?", new BeanListHandler<>(Person.class), "%武%");
for (Person person : list) {
System.out.println("person = " + person);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@Test
public void testGetByIdQueryDbutils(){
try {
Person person = runner.query("select * from person where id = ?", new BeanHandler<>(Person.class), 2);
System.out.println(person);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
maven:jar仓库
- 中央仓库(Center Repository):互联网
- 本地仓库(Local Repository):你的电脑上
- 坐标:gav唯一确定一个jar在仓库的位置 D:\mymvnrepo\mysql\mysql-connector-java\8.0.23找到mysql.jar
g:groupId 组织id
a:artifactId 工程id
v:version 版本号 - 如何在仓库中找某一个jar
- groupId
- artifactId
- version
- artifactId-version.jar jar包的命名方式
- 如何查询maven坐标https://mvnrepository.com/
- 百度:mvnrepo
- 选择我是人类
- 在搜索栏输入要查询的关键字:mysql
- 选择版本号
- 拷贝到pom.xml
- 配置阿里的镜像仓库
在C:\Users\具体用户 \ .m2\settings.xml里mirrors节点里面添加子节点mirror节点:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>