JAVA连接JDBC操作数据库
什么是JDBC
Java DataBase Connectivity
,Java数据库连接,jdbc实际是java中的一套和数据库交互的API
(application program interface 应用程序编程接口)
为什么使用JDBC
因为Java程序员需要连接多种数据库,为了避免每一个数据库都学习一套新的API,sun公司提出了一个JDBC接口,各个数据库厂商根据此接口写实现类(驱动),这样java程序员只需要掌握JDBC接口中的一套方法,就可以访问任何数据库。
导包: import java.sql.*
如何使用JDBC
外网访问:https://mvnrepository.com/
1. 从maven网站上搜索mysql 找到5.1.6版本的坐标,把坐标复制到工程的pom.xml文件中 ,在pom.xml文件源码里面project标签内部 添加<dependecies>标签,把复制的内容粘贴到里面 ,保存在工程中出现奶瓶即可、
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
2. 创建Demo01.java 在main方法中写以下代码:
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/newdb3","root","root");
//System.out.println(conn);
//3.创建执行SQL语句的对象
Statement stat = conn.createStatement();
//4.执行SQL
String sql = "create table if not exists jdbct1(id int primary key auto_increment,name varchar(10))";
stat.execute(sql);
System.out.println("执行完成");
//5.关闭资源,先打开的资源后关闭
stat.close();
conn.close();
执行SQL的方法
execute(sql): 此方法可以执行任意SQL,但是推荐执行DDL(create drop alter truncate) ,方法的返回值为布尔值,返回值代表是否有结果集,'true':有结果集,'false':没有结果集
executeUpdate(sql): (DML)此方法执行增删改的SQL,方法返回值为int类型,代表生效(ok)行数
executeQuery(sql): 此方法执行select查询的SQL,返回值为ResultSet结果集
解析配置文件
配置文件位置:
src/main/resources
配置文件名:jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/newdb3
username=root
password=123456
initialSize=2
maxActive=10
解析文件:
/**
* 解析Properties后缀文件,获取对应的信息
* properties后缀文件是以键值对方式存储信息
*/
//创建属性对象
Properties prop= new Properties();
//得到文件输入流'Demo05表示类名'
InputStream ips=Demo05.class.getClassLoader().getResourceAsStream("jdbc.properties");
//把流交给属性对象
prop.load(ips);
//获取数据,只能获取到字符串类型的数据
String name = prop.getProperty("name");
String age = prop.getProperty("age");
System.out.println(name+": "+age);
//注册驱动以及设置连接池
ResultSet
获取数据的方式有两种:
1、通过查询到的字段名称获取数据 rs.getString("ename");
2、通过查询到的字段位置获取数据 rs.getString(2);
数据库类型和java类型对比:
MySQL java
int getInt()
varchar getString()
float/double getFloat()/getDouble()
datetime/timestamp getDate()
数据库连接池DBCP
DataBase Connection Pool:数据库连接池
为什么使用:如果没有数据库连接池,每次业务都需要和数据库建立一次连接,用完之后断开,如果有1万次业务请求则有1万次连接的开和关,频繁开关连接,浪费资源,使用数据库连接池可以将连接重用,避免资源的浪费
如何使用数据库连接池
1. 下载jar包: 从maven服务器中搜索 dbcp
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
2. 把坐标复制粘贴到pom.xml中
3. 代码如下:
//创建数据源对象
BasicDataSource dataSource = new BasicDataSource();
//设置数据库连接信息
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/newdb3");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//设置初始连接数量
dataSource.setInitialSize(3);
//设置最大连接数量
dataSource.setMaxActive(5);
//从连接池中得到连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
@Test
测试单元注解
只能对无参无返回值的方法进行单元测试
SQL的注入风险
select count(*) from t_user where username='libai' and password='admin1';
SQL注入的演示
执行语句
String sql = "insert into jdbcuser values(null,'"+name+"',"+age+")";
输入:' or '1'='1
输出SQL拼接语句:
select count(*) from t_user where username='asdfsdf' and password='' or '1'='1'
出现登陆成功状态
PreparedStatement
对象
预编译的SQL对象
1. 为什么PreparedStatement可以避免SQL注入?
因为预编译的SQL执行对象 在创建stat对象的时候已经将SQL进行编译并且把SQL语句的逻辑固定,不会因为后期替换进去的内容改变SQL语句
String sql = "select count(*) from t_user where username=? and password=?";
stat = conn.prepareStatement(sql);
//替换问号的值
stat.setString(1, username);
stat.setString(2, password);
//执行SQL
rs = stat.executeQuery(); '不需要传入参数'
2、好处
1). 代码更直观避免了拼接SQL语句
2). 可以避免SQL注入
3). 执行效率略高于statement
如果SQL语句中存在变量则使用PreparedStatement,如果没有变量则使用Statement
批量操作
将多次和数据库服务器的数据交互合并成一次,提高执行效率
'添加到批量操作中'
stat.addBatch(sql1);
stat.addBatch(sql2);
stat.addBatch(sql3);
'执行批量操作'
stat.executeBatch();
事务
1、设置自动提交的状态
conn.setAutoCommit(false