2023年6月21日发(作者:)

MySQL数据库学习笔记(⼀)数据库回顾数据库概述什么是数据库:数据库就是存储数据的仓库;其本质是⼀个⽂件系统,将数据按照特定的格式进⾏存储。可以通过SQL语句对数据库中的数据进⾏增删改查。数据库和表:不解释。MySQL的使⽤MySQL安装(Windows上安装,Linux上的安装略)下⼀步。。。启动/关闭MySQL服务命令启动:net start mysql关闭:net stop mysql登录mysql命令:先切换到MySQL安装⽬录的bin⽬录下,然后输⼊mysql -u root -p密码SQL语句什么是SQL语句?结构化查询语⾔。关系数据库的国际标准。各个数据库⼚商都⽀持ISO的数据库标准:普通话。各个数据库⼚商在标准的基础上做了⾃⼰的扩展:⽅⾔。SQL分类DDL数据定义语⾔(Database Definition Language)⽤于定义数据库对象数据库表字段关键字createdropalterDML数据操作语⾔(Database Manipulation Language)⽤于对数据库中表记录进⾏更新、删除、插⼊关键字insertdeleteupdateDQL数据查询语⾔(Datebase Query Language)⽤于对数据库中表的记录进⾏查询关键字selectfromwhereDCL数据控制语⾔(Database Control Language)⽤于定义数据库的访问权限和安全级别关键字grant数据库操作创建数据库create database 数据库名;create database 数据库名 character set 编码;查看数据库查看数据库服务器中的所有数据库:show databases;查看某个数据库定义的信息:show create database 数据库名;删除数据库drop database 数据库名;切换数据库use 数据库名;查看正在使⽤的数据库查看正在使⽤的数据库:select database();表操作创建表单表约束主键约束primary key要求被约束的字段⾮空且唯⼀唯⼀约束unique要求被约束的字段唯⼀⾮空约束not null要求被约束的字段⾮空添加外键约束constraint constraint_name foreign key(外键字段名) references 主表(外键字段名) on delete action(restrict | cascade | set null | no action) onupdate action(restrict | cascade | set null | no action)例⼦在创建索引时, 可以指定在删除、更新⽗表时,对⼦表进⾏的相应操作,包括 RESTRICT、CASCADE、SET NULL 和 NOACTION。RESTRICT和NO ACTION相同, 是指限制在⼦表有关联记录的情况下, ⽗表不能更新;CASCADE表⽰⽗表在更新或者删除时,更新或者删除⼦表对应的记录;SET NULL 则表⽰⽗表在更新或者删除的时候,⼦表的对应字段被SET NULL 。针对上⾯创建的两个表, ⼦表的外键指定是ON DELETE RESTRICT ON UPDATE CASCADE ⽅式的, 那么在主表删除记录的时候, 如果⼦表有对应记录, 则不允许删除, 主表在更新记录的时候, 如果⼦表有对应记录, 则⼦表对应更新 。create table city_innodb( city_id int NOT NULL AUTO_INCREMENT, city_name varchar(50) NOT NULL, country_id int NOT NULL, primary key(city_id), key idx_fk_country_id(country_id), CONSTRAINT 'fk_city_country' FOREIGN KEY(country_id)

REFERENCES country_innodb(country_id) ON DELETE RESTRICT ON UPDATE CASCADE

)ENGINE=InnoDB DEFAULT CHARSET=utf8;查看表查看当前数据库中所有的表:show tables;查看表结构:desc 表名;删除表drop table 表名;修改表添加字段:alter table 表名 add 字段名 类型(长度) 约束;删除字段:alter table 表名 drop 字段名;修改字段名:alter table 表名 change 字段名 新字段名 类型(长度) 约束;修改字段名,肯定要有⼀个旧字段名和⼀个新字段名。修改字段的类型(长度)和约束:alter table 表名 modify 字段名 类型(长度) 约束;修改表的字符集:alter table 表名 character set 编码;修改表的名字:rename table 表名 to 新表名;注意:这个没有alter table,直接就rename就可以了。插⼊表记录插⼊语句insert into 表名(字段1,字段2,......,字段n) values(值1,值2,......,值n);insert into 表名 values(值1,值2,......,值n);这种写法values⾥⾯的值要与创建这张表时的字段顺序⼀⼀对应,并且所有的字段都要插⼊值。解决中⽂乱码问题⽅式⼀:修改MySQL中的⽂件,然后重启服务器(不推荐使⽤该⽅法);⽅式⼆:在dos窗⼝中写⼊set names gbk; 仅对当前窗⼝有效;注意点字段名与后⾯的值要⼀⼀对应;值如果是字符串或者⽇期需要加引号(⼀般是单引号);更新表记录语句update 表名 set 字段名=值;这是⽆条件更新,就是该表中所有的记录都会更新。update 表名 set 字段名=值 where 条件;注意点值如果是字符串或者⽇期需要加单引号。删除表记录语句delete from 表名;这是⽆条件删除,就是会把该表中的所有记录删除delete from 表名 where 条件;delete from 表名和truncate table 表名 删除记录的区别?删除⽅式1. delete是⼀条⼀条记录进⾏删除,不清空auto_increment的记录数。2. truncate删除时,把整张表摧毁,然后新建⼀张⼀模⼀样的表,并将auto_increment的记录是归零,从新开始计数。事务⽅⾯1. 如果开启了⼀个事务,那么使⽤delete删除的记录是可以通过回滚恢复的。2. ⽽使⽤truncate删除的记录是不能通过回滚恢复的。注意truncate table 表名;这种删除⽅式是不能加where条件的,只能全部删除。查询表记录简单查询语句:select distinct(字段名) | * | 字段名1,字段名2,......,字段名n from 表名 [where 条件]语句:select distinct(字段名) | * | 字段名1,字段名2,......,字段名n from 表名 [where 条件]查询所有商品select * from 表名;查询商品名和商品价格select pname,price from product;别名查询表别名select * from product [as] p;列别名select pname [as] p1,price [as] p2 from product;注意点:别名中的as是可以省略的,⼀般都省略。去掉重复值查询select distinct(字段名) from 表名;运算查询(查询结果是表达式)例⼦:将所有商品价格加10元显⽰select price+10 from product;条件查询运算符⽐较运算符⼤于:>⼤于:>⼤于等于:>=⼩于:<⼩于等于:<=等于:=不等于:<>在某⼀区间的值(含头含尾):between a and b在in列表中的值:in (23,34,45)模糊查询:like占位符_:表⽰⼀个字符%:表⽰任意个字符(可以是0个字符)判断是否为空:is null逻辑运算符and:多个条件同时成⽴or:多个条件任意⼀个成⽴not:条件不成⽴。select * from product where not (price>10):表⽰查询price>10这⼀条件不成⽴的商品信息。例⼦排序select * from 表名 [where 条件] order by 字段名 asc | descasc是递增排序;desc是降序排列。注意点order必须写在where条件语句后⾯如果不写asc或desc,那么默认是按照升序排列聚合函数常⽤的聚合函数sum(字段名):求和avg(字段名):求平均数count(字段名):求个数。count()⾥⾯是可以写字段名,也可以写*注意点:聚合函数不统计null值。分组select * from 表名 where 查询条件 group by 字段名 having 分组条件;分组条件⼀定要写在having后⾯,⽽不能通过where来写,因为where后⾯的是查询条件。例⼦根据cid字段分组,分组后统计商品的个数:select cid,count(*) from product group by cid;根据cid分组,分组统计每组商品的平均价格,并且平均价格⼤于20000元:select cid,avg(price) from product group by cid havingavg(price) > 20000;注意:这⾥的“并且平均价格⼤于20000元”是分组条件,不是查询条件。查询语句总结select * from 表名 where 查询条件 group by 字段名 having 分组条件 order by 字段名 asc | desc;排序order by⼀定要写在最后。分组和排序都是写在where后⾯(分组,排序

排序在最后)JDBCJDBC介绍全称:Java DataBase Connectivity(Java数据库连接)JDBC是⼀种⽤于执⾏SQL语句的Java API。JDBC可以为多种关系型数据库提供统⼀的访问⼊⼝。JDBC由⼀组Java⼯具类和接⼝组成。JDBC原理SUN公司提供访问数据库规范成为JDBC,⽽⽣产⼚商提供规范的实现类成为驱动。JDBC开发步骤1. 注册驱动e("");:这种是推荐写法erDriver(new ()):这种写法不推荐,因为这种写法有缺点01.硬编码,如果换了别的数据库(不再是MySQL),那么要创建别的Driver,所以要重写括号⾥⾯的Driver了,⽽使⽤e()⽅法括号⾥⾯的参数⼀般都只从配置⽂件⾥⾯读取的,只需要修改配置⽂件即可。02.这种⽅法会注册两次,因为类中有静态代码块,该静态代码块会再次注册驱动。2. 获得连接Connection conn=nection(url,username,password);3. 编写SQL语句并获得语句执⾏者编写SQL语句:通过Statement对象来执⾏SQL语句:Statement stmt=Statement();4. 执⾏SQL语句int executeUpdate(String sql);:执⾏insert、update、delete操作,返回影响的⾏数ResultSet executeQuery(String sql);:执⾏查询操作,返回查询到的结果集boolean execute(String sql);:执⾏查询操作返回true:如果返回true,需要⽤ResultSet getResultSet()来获取查询结果执⾏insert、update、delete操作返回false:如果返回false,需要⽤int getUpdateCount()来获取影响⾏数⼀般这种⽅法使⽤的⽐较少,使⽤前两种⽐较多。5. 处理结果ResultSet解释:ResultSet其实就是⼀张⼆维的表格,它⾥⾯有⼀个“光标”,初始时,“光标”在第⼀⾏的上⾯,可以使⽤next()⽅法来将“光标”移到下⼀⾏;第⼀次调⽤next()⽅法时,“光标”会移动到第⼀⾏。可以通过getXXX()⽅法来获取当前⾏的数据。boolean next():该⽅法返回⼀个boolean类型的数据,如果遍历到了⾏末尾,那么就会返回false,否则就会返回true。获取当前⾏的数据getXXX(参数)⽅法⾥⾯的“参数”有两种写法字段名(columnName):("cid");(获取字段名为cid的数据)字段所处的列(columnIndex):(1);(获取当前⾏第⼀列的数据,columnIndex从1开始)常⽤的getXXX()⽅法Object getObject(String columnName | int columnIndex):如果不知道获取的数据是什么类型,就是⽤getObject()⽅法,返回⼀个Object类型的对象。int getInt(String columnName | int columnIndex):如果知道要获取的数据是int类型,那么就可以使⽤该⽅法。⼀定要能确保获取到的数据是int类型,下同。String getString(String columnName | int columnIndex):如果知道获取的数据时String类型,那么就可以使⽤该⽅法。double getDouble(String columnName | int columnIndex):如果知道获取的数据时double类型,那么就可以使⽤该⽅法。6. 释放资源与IO流⼀样,使⽤后的资源都需要关闭释放资源的原则:先得到的后关闭,后得到的先关闭。7. jdbc数据库查询数据完整写法@Test

public void test1(){

Connection conn=null;

Statement stmt=null;

ResultSet resultSet=null;

try { //注册驱动

e("");

//获得连接

conn= nection("jdbc:mysql://localhost:3306/w eb08","root","pgmx0835");

//编写 SQL 语句并执⾏

String sql="select * from category";

stmt=Statement();

resultSet = eQuery(sql);

//处理执⾏结果

while(()){

//获取查询到的数据

Integer cid=(1);

String cname=ing(2);

n("cid="+cid+",cname="+cname);

}

}

catch (ClassNotFoundException | SQLException e) {

tackTrace();

}finally{

try { //释放资源

//注意:释放资源要按照创建顺序的逆序来释放

if (resultSet != null) {

();

} if(stmt!=null){

();

} if(conn!=null){

();

}

}catch(SQLException e){

tackTrace();

}

}

}9.

SQL注⼊问题登录功能实现实现原理:根据传⼊的name和password去数据库中查询,查询条件为同时满⾜名字为name和密码为password,如果查询到了,那么登录成功,否则登录失败。实现⽅式:⽅式⼀使⽤字符串拼接,把name和password拼接进SQL语句中。实现代码:这种⽅式带来的问题(缺点):当传⼊的name中有or时,可能也会登录成功;即根本没有⽤户的名字叫传⼊的name参数.解决办法:使⽤预处理PreparedStatement(见⽅式⼆)⽅式⼆实现原理:使⽤预处理PreparedStatement,在编写SQL语句时,使⽤占位符,然后通过给参数设置值,从⽽解决上述问题。实现代码PreparedStatement总结01.创建PreparedStatement:PreparedStatement prepareStatement(String sql),创建时,要把SQL语句传⼊,因为要预处理。02.编写SQL语句:使⽤预处理后,编写SQL语句可以使⽤占位符。03.设置参数:因为使⽤了占位符,所以要设置参数,setXXX(int parameterIndex,Object value)04.执⾏SQL语句:执⾏SQL语句的⽅法与Statement的⼀样,只不过此处执⾏时,不需要把SQL语句传⼊。limit[m],n参数解释m:m表⽰从第⼏条记录开始查询,注意:该索引是从0开始的。⽐如:m为0,那么就表⽰从第1条记录开始查询。m参数是可选择的,也就是可写可不写。如果m不写,那么就默认从第⼀条记录开始查询。n:n表⽰查询⼏条记录。例如,n为3,就表⽰此次查询3条记录。例⼦:select * from 表名 limit 2,5;:表⽰从第3条记录开始查询,⼀共查询5条记录。也就是查询第3,4,5,6,7条记录。

2023年6月21日发(作者:)

MySQL数据库学习笔记(⼀)数据库回顾数据库概述什么是数据库:数据库就是存储数据的仓库;其本质是⼀个⽂件系统,将数据按照特定的格式进⾏存储。可以通过SQL语句对数据库中的数据进⾏增删改查。数据库和表:不解释。MySQL的使⽤MySQL安装(Windows上安装,Linux上的安装略)下⼀步。。。启动/关闭MySQL服务命令启动:net start mysql关闭:net stop mysql登录mysql命令:先切换到MySQL安装⽬录的bin⽬录下,然后输⼊mysql -u root -p密码SQL语句什么是SQL语句?结构化查询语⾔。关系数据库的国际标准。各个数据库⼚商都⽀持ISO的数据库标准:普通话。各个数据库⼚商在标准的基础上做了⾃⼰的扩展:⽅⾔。SQL分类DDL数据定义语⾔(Database Definition Language)⽤于定义数据库对象数据库表字段关键字createdropalterDML数据操作语⾔(Database Manipulation Language)⽤于对数据库中表记录进⾏更新、删除、插⼊关键字insertdeleteupdateDQL数据查询语⾔(Datebase Query Language)⽤于对数据库中表的记录进⾏查询关键字selectfromwhereDCL数据控制语⾔(Database Control Language)⽤于定义数据库的访问权限和安全级别关键字grant数据库操作创建数据库create database 数据库名;create database 数据库名 character set 编码;查看数据库查看数据库服务器中的所有数据库:show databases;查看某个数据库定义的信息:show create database 数据库名;删除数据库drop database 数据库名;切换数据库use 数据库名;查看正在使⽤的数据库查看正在使⽤的数据库:select database();表操作创建表单表约束主键约束primary key要求被约束的字段⾮空且唯⼀唯⼀约束unique要求被约束的字段唯⼀⾮空约束not null要求被约束的字段⾮空添加外键约束constraint constraint_name foreign key(外键字段名) references 主表(外键字段名) on delete action(restrict | cascade | set null | no action) onupdate action(restrict | cascade | set null | no action)例⼦在创建索引时, 可以指定在删除、更新⽗表时,对⼦表进⾏的相应操作,包括 RESTRICT、CASCADE、SET NULL 和 NOACTION。RESTRICT和NO ACTION相同, 是指限制在⼦表有关联记录的情况下, ⽗表不能更新;CASCADE表⽰⽗表在更新或者删除时,更新或者删除⼦表对应的记录;SET NULL 则表⽰⽗表在更新或者删除的时候,⼦表的对应字段被SET NULL 。针对上⾯创建的两个表, ⼦表的外键指定是ON DELETE RESTRICT ON UPDATE CASCADE ⽅式的, 那么在主表删除记录的时候, 如果⼦表有对应记录, 则不允许删除, 主表在更新记录的时候, 如果⼦表有对应记录, 则⼦表对应更新 。create table city_innodb( city_id int NOT NULL AUTO_INCREMENT, city_name varchar(50) NOT NULL, country_id int NOT NULL, primary key(city_id), key idx_fk_country_id(country_id), CONSTRAINT 'fk_city_country' FOREIGN KEY(country_id)

REFERENCES country_innodb(country_id) ON DELETE RESTRICT ON UPDATE CASCADE

)ENGINE=InnoDB DEFAULT CHARSET=utf8;查看表查看当前数据库中所有的表:show tables;查看表结构:desc 表名;删除表drop table 表名;修改表添加字段:alter table 表名 add 字段名 类型(长度) 约束;删除字段:alter table 表名 drop 字段名;修改字段名:alter table 表名 change 字段名 新字段名 类型(长度) 约束;修改字段名,肯定要有⼀个旧字段名和⼀个新字段名。修改字段的类型(长度)和约束:alter table 表名 modify 字段名 类型(长度) 约束;修改表的字符集:alter table 表名 character set 编码;修改表的名字:rename table 表名 to 新表名;注意:这个没有alter table,直接就rename就可以了。插⼊表记录插⼊语句insert into 表名(字段1,字段2,......,字段n) values(值1,值2,......,值n);insert into 表名 values(值1,值2,......,值n);这种写法values⾥⾯的值要与创建这张表时的字段顺序⼀⼀对应,并且所有的字段都要插⼊值。解决中⽂乱码问题⽅式⼀:修改MySQL中的⽂件,然后重启服务器(不推荐使⽤该⽅法);⽅式⼆:在dos窗⼝中写⼊set names gbk; 仅对当前窗⼝有效;注意点字段名与后⾯的值要⼀⼀对应;值如果是字符串或者⽇期需要加引号(⼀般是单引号);更新表记录语句update 表名 set 字段名=值;这是⽆条件更新,就是该表中所有的记录都会更新。update 表名 set 字段名=值 where 条件;注意点值如果是字符串或者⽇期需要加单引号。删除表记录语句delete from 表名;这是⽆条件删除,就是会把该表中的所有记录删除delete from 表名 where 条件;delete from 表名和truncate table 表名 删除记录的区别?删除⽅式1. delete是⼀条⼀条记录进⾏删除,不清空auto_increment的记录数。2. truncate删除时,把整张表摧毁,然后新建⼀张⼀模⼀样的表,并将auto_increment的记录是归零,从新开始计数。事务⽅⾯1. 如果开启了⼀个事务,那么使⽤delete删除的记录是可以通过回滚恢复的。2. ⽽使⽤truncate删除的记录是不能通过回滚恢复的。注意truncate table 表名;这种删除⽅式是不能加where条件的,只能全部删除。查询表记录简单查询语句:select distinct(字段名) | * | 字段名1,字段名2,......,字段名n from 表名 [where 条件]语句:select distinct(字段名) | * | 字段名1,字段名2,......,字段名n from 表名 [where 条件]查询所有商品select * from 表名;查询商品名和商品价格select pname,price from product;别名查询表别名select * from product [as] p;列别名select pname [as] p1,price [as] p2 from product;注意点:别名中的as是可以省略的,⼀般都省略。去掉重复值查询select distinct(字段名) from 表名;运算查询(查询结果是表达式)例⼦:将所有商品价格加10元显⽰select price+10 from product;条件查询运算符⽐较运算符⼤于:>⼤于:>⼤于等于:>=⼩于:<⼩于等于:<=等于:=不等于:<>在某⼀区间的值(含头含尾):between a and b在in列表中的值:in (23,34,45)模糊查询:like占位符_:表⽰⼀个字符%:表⽰任意个字符(可以是0个字符)判断是否为空:is null逻辑运算符and:多个条件同时成⽴or:多个条件任意⼀个成⽴not:条件不成⽴。select * from product where not (price>10):表⽰查询price>10这⼀条件不成⽴的商品信息。例⼦排序select * from 表名 [where 条件] order by 字段名 asc | descasc是递增排序;desc是降序排列。注意点order必须写在where条件语句后⾯如果不写asc或desc,那么默认是按照升序排列聚合函数常⽤的聚合函数sum(字段名):求和avg(字段名):求平均数count(字段名):求个数。count()⾥⾯是可以写字段名,也可以写*注意点:聚合函数不统计null值。分组select * from 表名 where 查询条件 group by 字段名 having 分组条件;分组条件⼀定要写在having后⾯,⽽不能通过where来写,因为where后⾯的是查询条件。例⼦根据cid字段分组,分组后统计商品的个数:select cid,count(*) from product group by cid;根据cid分组,分组统计每组商品的平均价格,并且平均价格⼤于20000元:select cid,avg(price) from product group by cid havingavg(price) > 20000;注意:这⾥的“并且平均价格⼤于20000元”是分组条件,不是查询条件。查询语句总结select * from 表名 where 查询条件 group by 字段名 having 分组条件 order by 字段名 asc | desc;排序order by⼀定要写在最后。分组和排序都是写在where后⾯(分组,排序

排序在最后)JDBCJDBC介绍全称:Java DataBase Connectivity(Java数据库连接)JDBC是⼀种⽤于执⾏SQL语句的Java API。JDBC可以为多种关系型数据库提供统⼀的访问⼊⼝。JDBC由⼀组Java⼯具类和接⼝组成。JDBC原理SUN公司提供访问数据库规范成为JDBC,⽽⽣产⼚商提供规范的实现类成为驱动。JDBC开发步骤1. 注册驱动e("");:这种是推荐写法erDriver(new ()):这种写法不推荐,因为这种写法有缺点01.硬编码,如果换了别的数据库(不再是MySQL),那么要创建别的Driver,所以要重写括号⾥⾯的Driver了,⽽使⽤e()⽅法括号⾥⾯的参数⼀般都只从配置⽂件⾥⾯读取的,只需要修改配置⽂件即可。02.这种⽅法会注册两次,因为类中有静态代码块,该静态代码块会再次注册驱动。2. 获得连接Connection conn=nection(url,username,password);3. 编写SQL语句并获得语句执⾏者编写SQL语句:通过Statement对象来执⾏SQL语句:Statement stmt=Statement();4. 执⾏SQL语句int executeUpdate(String sql);:执⾏insert、update、delete操作,返回影响的⾏数ResultSet executeQuery(String sql);:执⾏查询操作,返回查询到的结果集boolean execute(String sql);:执⾏查询操作返回true:如果返回true,需要⽤ResultSet getResultSet()来获取查询结果执⾏insert、update、delete操作返回false:如果返回false,需要⽤int getUpdateCount()来获取影响⾏数⼀般这种⽅法使⽤的⽐较少,使⽤前两种⽐较多。5. 处理结果ResultSet解释:ResultSet其实就是⼀张⼆维的表格,它⾥⾯有⼀个“光标”,初始时,“光标”在第⼀⾏的上⾯,可以使⽤next()⽅法来将“光标”移到下⼀⾏;第⼀次调⽤next()⽅法时,“光标”会移动到第⼀⾏。可以通过getXXX()⽅法来获取当前⾏的数据。boolean next():该⽅法返回⼀个boolean类型的数据,如果遍历到了⾏末尾,那么就会返回false,否则就会返回true。获取当前⾏的数据getXXX(参数)⽅法⾥⾯的“参数”有两种写法字段名(columnName):("cid");(获取字段名为cid的数据)字段所处的列(columnIndex):(1);(获取当前⾏第⼀列的数据,columnIndex从1开始)常⽤的getXXX()⽅法Object getObject(String columnName | int columnIndex):如果不知道获取的数据是什么类型,就是⽤getObject()⽅法,返回⼀个Object类型的对象。int getInt(String columnName | int columnIndex):如果知道要获取的数据是int类型,那么就可以使⽤该⽅法。⼀定要能确保获取到的数据是int类型,下同。String getString(String columnName | int columnIndex):如果知道获取的数据时String类型,那么就可以使⽤该⽅法。double getDouble(String columnName | int columnIndex):如果知道获取的数据时double类型,那么就可以使⽤该⽅法。6. 释放资源与IO流⼀样,使⽤后的资源都需要关闭释放资源的原则:先得到的后关闭,后得到的先关闭。7. jdbc数据库查询数据完整写法@Test

public void test1(){

Connection conn=null;

Statement stmt=null;

ResultSet resultSet=null;

try { //注册驱动

e("");

//获得连接

conn= nection("jdbc:mysql://localhost:3306/w eb08","root","pgmx0835");

//编写 SQL 语句并执⾏

String sql="select * from category";

stmt=Statement();

resultSet = eQuery(sql);

//处理执⾏结果

while(()){

//获取查询到的数据

Integer cid=(1);

String cname=ing(2);

n("cid="+cid+",cname="+cname);

}

}

catch (ClassNotFoundException | SQLException e) {

tackTrace();

}finally{

try { //释放资源

//注意:释放资源要按照创建顺序的逆序来释放

if (resultSet != null) {

();

} if(stmt!=null){

();

} if(conn!=null){

();

}

}catch(SQLException e){

tackTrace();

}

}

}9.

SQL注⼊问题登录功能实现实现原理:根据传⼊的name和password去数据库中查询,查询条件为同时满⾜名字为name和密码为password,如果查询到了,那么登录成功,否则登录失败。实现⽅式:⽅式⼀使⽤字符串拼接,把name和password拼接进SQL语句中。实现代码:这种⽅式带来的问题(缺点):当传⼊的name中有or时,可能也会登录成功;即根本没有⽤户的名字叫传⼊的name参数.解决办法:使⽤预处理PreparedStatement(见⽅式⼆)⽅式⼆实现原理:使⽤预处理PreparedStatement,在编写SQL语句时,使⽤占位符,然后通过给参数设置值,从⽽解决上述问题。实现代码PreparedStatement总结01.创建PreparedStatement:PreparedStatement prepareStatement(String sql),创建时,要把SQL语句传⼊,因为要预处理。02.编写SQL语句:使⽤预处理后,编写SQL语句可以使⽤占位符。03.设置参数:因为使⽤了占位符,所以要设置参数,setXXX(int parameterIndex,Object value)04.执⾏SQL语句:执⾏SQL语句的⽅法与Statement的⼀样,只不过此处执⾏时,不需要把SQL语句传⼊。limit[m],n参数解释m:m表⽰从第⼏条记录开始查询,注意:该索引是从0开始的。⽐如:m为0,那么就表⽰从第1条记录开始查询。m参数是可选择的,也就是可写可不写。如果m不写,那么就默认从第⼀条记录开始查询。n:n表⽰查询⼏条记录。例如,n为3,就表⽰此次查询3条记录。例⼦:select * from 表名 limit 2,5;:表⽰从第3条记录开始查询,⼀共查询5条记录。也就是查询第3,4,5,6,7条记录。