1.JDBC简介
例如mysql的,导入项目即可。
2.JDBC快速入门。
执行SQL,就是把语句发给数据库。
MYSQL5的jar包里有1.驱动注册,所以注册驱动那一行可以不写。
3.JDBC API详解
3.1DriverManager
底层用DriverManger.registerDriver,来注册驱动。
消除提示 useSSL=false。
3.2 Connection
3.2.1开事务
想一次做多条SQL命令,让它们一次都完成,必须得开事务。
如果出现异常会回滚,但我们可以用java的try catch捕获异常并提交给控制台。
抓个大个异常。
3.3 Statement
3.3.1 excuteQuery
右边的查询结果装在ReslutSet里。
3.4 Result案例(经典)
然后把集合里元素扔给页面,页面就可以展示。
3.5 SQL注入与PrepareStatement
3.5.1防止注入
出现SQL注入,就是通过小心思来拼字符串。PrepareStatement的出现,就是解决SQL注入。
登录密码写成这样。
这里要拼字符串,为了接收外面的变量。
如此拼,“+属性+”。
在数据库里,where这里的判断条件为true,所以能查到用户,一般就直接能登录。
这就是小型的SQL注入。
解决:里面先放问号,根据PrepareStatement对象往里面设置参数。
执行的时候不用传sql了
这样做,会在sql里对参数进行转义。
这样就不会拼字符串啦。
3.5.2 预编译
步骤1:加上useServerPrepStmts=true
MySQL执行日志。
如果没有这个文件,自己建立一个,进来空格会乱码,删了手动更改空格。
然后让配置生效,需要重启MYSQL。
预编译在把sql语句传给PrepareStatement对象的时候,就预编译了。
没有预编译的SQL日志文件。
经过预编译的SQL日志文件
预编译这里,这句话,是可以让线程休息10000ms,然后再往下执行。
4.数据库连接池
提前创建好很多个数据库的连接,放在容器里,这些连接用来复用
这里出现异常,是因为,路径不对。
找到路径,具体的路径。
5.练习:完成商品品牌数据的增删改查
建数据库代码。
CREATE TABLE `tb_brand` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bran_name` varchar(20) DEFAULT NULL,
`company_name` varchar(20) DEFAULT NULL,
`odered` int(11) DEFAULT NULL,
`description` varchar(100) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
INSERT into tb_brand(bran_name,company_name,odered,description,status)
VALUES('三只松鼠','三只松鼠有限公司',5,'好吃不上火',0),
('华为','华为有限公司',100,'好吃',1),
('小米','小米有限公司',50,'好吃不火',1);
然后建立Brand类。
private Integer id; private String Bran_Name; private String Description; private Integer Odered; private Integer Status;
5.1查询
@Test
public void test1() throws Exception {
//1.获取Connection
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("D:\\workSpace\\jdbc\\jdbc-demo\\src\\druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库链接
Connection conn =dataSource.getConnection();
//2.定义SQL
String sql="select * from tb_brand;";
//3.获取预编译对象
PreparedStatement pstmt= conn.prepareStatement(sql);
//4.设置参数
//5.执行sql
ResultSet rs=pstmt.executeQuery();
//6.处理结果放进list
List<Brand> l1=new ArrayList<>();
while(rs.next())
{
String branname=rs.getString("bran_name");
String companyname=rs.getString("company_name");
Integer odered=rs.getInt("odered");
String description=rs.getString("description");
Integer status=rs.getInt("status");
Brand B=new Brand(branname,companyname,odered,description,status);
l1.add(B);
}
System.out.println(l1);
//释放资源
rs.close();
pstmt.close();
conn.close();
}
5.2增加
public void test2() throws Exception {
//1.定义成员变量接收,前台传过来要插入的新值。
String Bran_Name="大米";
String Company_Name="大米科技有限公司";
int Odered=20;
String Description="大米真好吃";
int Status=0;
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("D:\\workSpace\\jdbc\\jdbc-demo\\src\\druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库链接
Connection conn =dataSource.getConnection();
//2.定义SQL
String sql="insert into
tb_brand(bran_name,company_name,odered,description,status)values(?,?,?,?,?);";
//3.获取预编译对象
PreparedStatement pstmt= conn.prepareStatement(sql);
//4.设置参数(插入的时候,前台定义变量,这个时候往里面set值。
pstmt.setString(1,Bran_Name);
pstmt.setString(2,Company_Name);
pstmt.setInt(3,Odered);
pstmt.setString(4,Description);
pstmt.setInt(5,Status);
//5.执行sql
int count=pstmt.executeUpdate();//更新影响的行数
//6.处理结果放进list
if (count>0)
{
System.out.println("添加成功");
}
//释放资源
pstmt.close();
conn.close();
}
与之前的不同之处。预编译的方式插入,然后设置参数。
5.3修改
根据id修改。
预编译要写的SQL,复制粘贴。
//修改
/*update tb_brand
set bran_name=?,
company_name=?,
odered=?,
description=?,
status=?
where id=?*/
@Test
public void test3() throws Exception {
//1.定义成员变量接收,前台传过来要插入的新值。
String Bran_Name="大米";
String Company_Name="大米科技有限公司";
int Odered=20;
String Description="大米真难吃";
int Status=0;
int id=5;
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("D:\\workSpace\\jdbc\\jdbc-demo\\src\\druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库链接
Connection conn =dataSource.getConnection();
//2.定义SQL
String sql="update tb_brand\n" +
" set bran_name=?,\n" +
" company_name=?,\n" +
" odered=?,\n" +
" description=?,\n" +
" status=?\n" +
" where id=?";
//3.获取预编译对象
PreparedStatement pstmt= conn.prepareStatement(sql);
//4.设置参数(插入的时候,前台定义变量,这个时候往里面set值。
pstmt.setString(1,Bran_Name);
pstmt.setString(2,Company_Name);
pstmt.setInt(3,Odered);
pstmt.setString(4,Description);
pstmt.setInt(5,Status);
pstmt.setInt(6,id);
//5.执行sql
int count=pstmt.executeUpdate();//更新影响的行数
//6.处理结果放进list
if (count>0)
{
System.out.println("修改成功");
}
//释放资源
pstmt.close();
conn.close();
}
5.4根据id删除
//删除根据id
/*delete from tb_brand where id=?*/
@Test
public void test4() throws Exception {
//1.定义成员变量接收,前台传过来要插入的新值。
int id=5;
//加载配置文件
Properties prop=new Properties();
prop.load(new FileInputStream("D:\\workSpace\\jdbc\\jdbc-demo\\src\\druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库链接
Connection conn =dataSource.getConnection();
//2.定义SQL
String sql="delete from tb_brand where id=?";
//3.获取预编译对象
PreparedStatement pstmt= conn.prepareStatement(sql);
//4.设置参数(插入的时候,前台定义变量,这个时候往里面set值。
pstmt.setInt(1,id);
//5.执行sql
int count=pstmt.executeUpdate();//更新影响的行数
//6.处理结果放进list
if (count>0)
{
System.out.println("修改成功");
}
//释放资源
pstmt.close();
conn.close();
}