目录
步骤:
1.注册驱动:
Class.forname("com.mysql.jdbc.Driver")
2.获取连接
DriverManager.getConnection(url,user,pasasword)
// 连接池
利用DataSource.getConnection()来获取Connection对象。
3.创建sql语句:
String sql="sql语句"
4.创建sql执行对象:
Connection.createStatement() //返回执行对象类型 Statement。
5.执行sql语句
//DDL DML命令用executeupdate
Statement.executeupdate(sql); //返回受影响的行数
//DQL 命令用executequery
Statement.executequery(sql); //返回DataSet类型的数据,数据中的值为sql命令查询的内容。
6.处理返回值
7.释放资源
ResultSet.colse(); // 释放ResultSet
Statement.colse(); // 释放Statement
Connection.colse(); // 后释放 Connection
JDBC api:
1.DriverManager(驱动管理类):
功能:
1.注册驱动
用DriverManager.registerDriver("驱动名")
2.获取数据库连接
DriverManager.getConnection(url,user,password)
url: jdbc:mysql://主机号:端口号/数据库名?参数键值对1&参数键值对2...
若省略主机号:端口号 则默认 本地主机和3306端口号
例如:jdbc:mysql///school
键值对参数:
useSSL=false:建立非SSL连接
user:数据库的账号
password:数据库密码
String name="root";
String pass="root";
String url="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useServerPrepareStatement=true";
Connection connection;
try {
//获取连接
connection = DriverManager.getConnection(url, name, pass);
} catch (SQLException e) {
System.out.println("获取链接错误");
throw new RuntimeException(e);
}
System.out.println("获取连接成功");
2.Connection(连接类)
1.获取执行SQL的对象:
获取普通Sql对象
Connection.CreateStatement();
获取预编译SQL的执行对象:防止SQL注入
PreparedStatement PrepareStatement(sql)
获取执行存储过程的对象:
CallableStatement PrepareCall(sql) 不常用
String sql="select * from users where uid=?";
try
{
//获取非防注入sql对象
statment = connection.createStatement();
//获取防注入sql对象
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException e)
{
System.out.println("获取状态错误");
throw new RuntimeException(e);
}
2.管理事务:
Mysql的事务管理:
开启事务(Begin/Start Transaction)
提交事务:commit()
回滚事务:rollback()
JDBC的事务管理:
利用Connection对象来管理事务
事务:
事务指的是对数据库进行一系列的操作,而且这写操作必须并行运行(例如付款,数据库从一个账户上减少,另一个账户上增加,这两个操作必须同时进行,若不是同时进行则就算出错),事务则解决这一问题,若在某条语句中出现错误,可以利用rollback()回滚到开启事务之前。
开启事务:
Connection.setAutoCommit(boolean AutoCommit) true为自动提交事务,false:为手动提交事务,两者都代表着开启事务。
提交事务:Connection.commit()
若一系列代码没有出现错误时,则提交事务到数据库中
回滚事务:Connection.rollBack()
若当中有sql命令出错后,则数据库将数据回滚到开启事务之前。
try
{
connection.setAutoCommit(false);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
try
{
//执行语句
//resultSet = statment.executeQuery(sql);
//防注入sql执行方式
preparedStatement.setInt(1,1);
resultSet = preparedStatement.executeQuery();
} catch (SQLException e)
{
//失败回滚
connection.rollback();
throw new RuntimeException(e);
}
3.Connection.PrepareStatement(sql):详细在PrepareStatement中 P86.
3.Statement(执行sql命令对象):
sql命令分为:
1.DDL:创建表,数据库。
2.DML;增删改操作。
3.DQL:查(select)操作
Statement.executeUpdate(sql):
执行DDL与DML命令
DDL:返回0. DDL一般不报异常就算成功了。
DML:执行成功后返回影响行数
Statement.executeQuery(sql):
执行DQL命令:
参数:为sql命令(select)
返回值:ResultSet类型
resultSet = preparedStatement.executeQuery();
4.ResultSet(结果集)
为Statement.excuteQuery(sql)的返回值类型。
ResultSet默认指向数据行的上一行,相当于Cursor。
方法:
ResultSet.next():
作用:游标指向下一行数据。
返回值:若该行有数据返回值为true,否则false。用来判断当前行是否有效。
ResultSet.getXXX():
若获取int类型则用getInt("参数")
String类似等等。
参数:
String: 可以为数据表的行头(属性),
Int: 也可以为数据表行头的编号(从1开始)。
返回值:XXX类型
//resultSet.next()放回的指针指向-1,加上next()指向0行(即第一行)
while(resultSet.next())
{
System.out.println(resultSet.getInt("uid"));
System.out.println(resultSet.getString("uname"));
System.out.println(resultSet.getInt("uage"));
}
5.PreparedStatement:
继承自Statement。预编译Sql语句的对象
防止Sql注入:
解决方法:将单引号和关键字等影响系统逻辑判断的因素都转换为对应的转义字符,这样系统就不会认为他是有语义的符号而指示普通的字符串变量。
预编译:
开启预编译:
useServerPrepareStatement=true,加入到url后。
在java执行mysql命令时,要经过 检查语法、编译命令、执行命令三步。
在创建preparedStatement对象时,就将sql命令发送给mysql进行预编译(检查语法,编译sql),剩下的只是将sql中的占位符用变量代替。也提升了效率。
在执行相同sql语句但不同参数时,此时mysql对sql命令只需要编译一次,这样就提高了效率。
作用: 防止sql注入。
1.获取PreparedStatement对象
Connection.PrepareStatement(sql)
参数:sql语句
在sql语句中的参数,利用?占位符代替。
返回值:返回一个PreparedStatement对象
2.设置占位符的值:
PreparedStatement.setXXX(参数1,参数2)
XXX为数据类型。
参数:
参数1:为占位符的位置编号,从1开始。
参数2:为占位符所占用的变量。
3.执行Sql语句:
preparedStatement.executeUpdate() or preparedStatement.executeQuery()
此时这两个执行语句将不在写入Sql语句,在前方已经写过了。
数据库连接池:
问题:
当不同的用户访问数据库时,每个用户都需要建立连接、访问数据库、关闭连接,频繁的建立连接关闭连接影响数据库的运行效率。
解决:
创建一个数据库连接池,每当有用户访问数据库时,就在连接池中找到还没有被分配的连接,将这个连接给到这个用户,当用户访问完数据库后,不关闭连接,而只关闭用户的连接,这样连接还是存在,并且等待下一个用户(资源重用)。这样做提升了用户访问数据库的时间,也尽量少了浪费数据库的资源(时间,建立数据库,关闭数据库)。
管理数据库连接的容器,负责分配和管理数据库连接。
数据库连接池接口:
DataSource
利用DataSource来获取的Connection的连接就是连接池连接
常见的连接池:
Druid(德鲁伊):最好的连接池之一。
DBCP
C3PO
Druid:
1.加载Druid的jar包
2.编写配置文件(数据连接池)
properities文件
//注册驱动
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useServerPrepareStatement=true
//设置默认连接数
initialSize=5
//设置最大连接数
maxActive=20
#最大等待时间
maxWait=3000
3.创建properities对象并利用load方法加载配置
Properties prop=new Properties();
prop.load(new FileInputStream("Path/druid.properties"));
4.创建DataSource对象
由DruidDataSourceFactory.createDataSource(Properities对象)方法:
返回值:DataSource对象
//获取连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
5.获取Connection对象:
利用DataSource.getConnection()方法:
返回值:Connection对象
//从连接池内获取连接
Connection connection = dataSource.getConnection();