导包 数据库驱动包 msql-connector-java
1.掌握JDBC连接数据库
1.1 JDBC 流程图
- Connection接口 数据库连接接口(想操作数据库 首先就要连接起来 其实就是驱动对接)
- Statement接口 语句执行者(SQL语句执行平台) 它能够帮助你在连接建立好之后 进行SQL语句执行
- ResultSet接口 结果集 它是数据库执行完对应的【查询】之后得到的伪数据表集合
Connection conn = null;
Statement state = null;
ResultSet rs = null;
try {
/**1.加载驱动(驱动<对应JavaJDBC的实现类>是数据库厂商提供)*/
Class.forName("com.mysql.jdbc.Driver"); // 本来Class.forName() 获取对应的类的字节码对象
// DriverManager.registerDriver(new Driver()); 因为它的静态代码块已经注册过了 所以不用了
/**2.建立与数据库的连接*/
// p1:数据库地址 p2:数据库用户名 p3:数据库密码
// HTTP协议:http://localhost:8080 你现在是JDBC连接 所以它也有固定前缀 jdbc:数据库://
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/kgcnews", "root", "root");
/**3.创建SQL语句执行平台*/
state = conn.createStatement();
/**4.准备SQL语句*/
String sql = "select * from news_detail limit 5";
/**5.语句执行平台执行SQL语句*/
rs = state.executeQuery(sql);
/**6.处理结果集(只在查询的时候才有,可以理解为是一个伪查询到的表)*/
// 每一次next()表示判断是否存在下一行 而且可以理解为有一个虚拟的指针指向了某行
while(rs.next()) {
// 将某行的指定列数据取出来 并 转换为合适的Java数据类型
int id = rs.getInt(1); // 根据列的索引获取对应的列内容
String title = rs.getString(3);
String author = rs.getString("author"); // 根据列的名称来获取列内容(有别名记得改为别名)
System.out.println(id+"--"+title+"--"+author);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
rs.close();
state.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
2.使用JDBC对数据库进行Crud操作
2.1 最开始的步骤
- 加载驱动
- 获取连接
- 创建语句执行者
- 编写SQL语句
- 执行SQL语句
- 处理结果集(如果是增删改 没有结果集)
- 释放资源(关闭连接…)
public class JDBCDemo3 {
public static void main(String[] args) {
Connection conn = null;
Statement state = null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接 本地可以省略那串
conn = DriverManager.getConnection("jdbc:mysql:///kgcnews", "root", "root");
// 3.创建语句执行者
state = conn.createStatement();
// 4.编写SQL语句
String sql = "update news_category set name = '汽车' where id = 8";
// 5.执行SQL语句
int rows = state.executeUpdate(sql);
if(rows > 0) {
System.out.println("修改成功!");
}else {
System.out.println("修改失败!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
state.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.2 解决SQL注入之后采用步骤
- 加载驱动
- 获取连接
- 编写SQL语句
- 根据SQL语句创建语句执行者。(预编译SQL)
- 如果有占位符 给占位符赋值
- 执行SQL语句
- 处理结果集…
- 释放资源
public class JDBCDemo5 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = input.next();
System.out.print("请输入密码:");
String password = input.next();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
/** 1.加载驱动(驱动<对应JavaJDBC的实现类>是数据库厂商提供) */
Class.forName("com.mysql.jdbc.Driver"); // 本来Class.forName() 获取对应的类的字节码对象
/** 2.建立与数据库的连接 */
// p1:数据库地址 p2:数据库用户名 p3:数据库密码
// HTTP协议:http://localhost:8080 你现在是JDBC连接 所以它也有固定前缀 jdbc:数据库://
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/kgcnews", "root", "root");
/** 3.准备SQL语句 */
String sql = "select * from news_user where username = ? and password = ?";
/** 4.创建SQL语句执行平台 */
ps = conn.prepareStatement(sql);
/** 5.给占位符赋值 索引从1开始 */
ps.setString(1, username);
ps.setString(2, password);
/** 6.语句执行平台执行SQL语句 */
rs = ps.executeQuery();
/** 6.处理结果集(只在查询的时候才有,可以理解为是一个伪查询到的表) */
// 每一次next()表示判断是否存在下一行 而且可以理解为有一个虚拟的指针指向了某行
boolean flag = false;
while (rs.next()) {
flag = true;
}
System.out.println(flag == true ? "登录成功!" : "登录失败!");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
模糊查询 ==需要写concat 不写会报错,数据库中写写sql的话 不需要concat 代码中需要加 ==
StringBuffer sql=new StringBuffer();
List<Object> params=new ArrayList<>();
sql.append("select * from news_detail where 1=1 ");
if(categoryId!=null && categoryId>0) {
sql.append(" and categoryId=? ");
params.add(categoryId);
}
if(!(StringUtils.isNullOrEmpty(title))) {
sql.append(" and title like CONCAT('%',?,'%')");
params.add(title);
}
sql.append(" order by createDate desc limit ?,?");
params.add(startIdex);
params.add(pageSize);