目录
JDBC
jdbc:(java database connection) java数据库连接。
思考: java是什么语言: 面向对象的语言
SQL是什么语言:结构化查询语言。
-----------------------------java语言和SQL语言进行沟通--------------------------------------------
解决方案:---------------翻译。
编写相关的代码
(1)创建java工程 并把驱动引入到该工程
(2)解压该jar包
(3)编写代码
(1)加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
(2)获取连接对象
String url="jdbc:mysql://ip:port/数据库名?serverTimezone=Asia/Shanghai";
String user="root"
String password="密码"
Connection connection=DriverManager.getConnection(url,user,password);
(3)获取执行sql语句的对象
Statement st=connection.createStatement();
(4)执行sql语句 增删改
st.executeUpdate(sql);
2、常见错误:
1.Class---->别写为class
2、驱动jar包
- 没有引入驱动jar包。
- 没有解压驱动jar包
3、账号或密码错误
4、没有再url后添加时区。
5、表不存在
6、sql语法有误
注:一上是经常出现的错误
3、 jdbc----查询功能
public static void findAll() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai","root","root");
Statement st=connection.createStatement();
// 执行sql语句
String sql="select * from 表名";
ResultSet set=st.executeQuery(sql); //执行查询sql语句 并把查询的结果封装到ResultSet容器中
//遍历出来
while(set.next()){ //指针向下移动并且判断当前行是否有记录 有:true 无:false
int deptId=set.getInt("deptId");//获取当前行中指定列的值
String deptName= set.getString("deptName");
System.out.println(deptId+"============="+deptName);
}
}
4、如何防止sql注入
sql注入: sql中存在特殊字符时 则sql会按照特殊字符来解析。
sql注入的演示:
public static void main(String[] args)throws Exception {
findByName("asdasdsadas' or '1'='1");
}
public static void findByName(String name) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai","root","root");
Statement st=connection.createStatement();
// 执行sql语句
String sql="select * from 表名 where deptName='"+name+"'";
System.out.println(sql);
ResultSet set=st.executeQuery(sql); //执行查询sql语句 并把查询的结果封装到ResultSet容器中
//遍历出来
while(set.next()){ //指针向下移动并且判断当前行是否有记录 有:true 无:false
int deptId=set.getInt("deptId");//获取当前行中指定列的值
String deptName= set.getString("deptName");
System.out.println(deptId+"============="+deptName);
}
}
因为Statement类导致了sql注入的危险!
如何解决:-----演变出一个Statement的子类----->PreparedStatement[重写相应的方法]
public static void findByName2(String name) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名?serverTimezone=Asia/Shanghai","root","root");
String sql="select * from 表名 where deptName=?"; //占位符
PreparedStatement ps=connection.prepareStatement(sql);//预编译sql
//为占位符赋值parameterIndex:占位符的索引 占位符的内容
ps.setString(1,name);
// 执行sql语句
System.out.println(sql);
ResultSet set=ps.executeQuery(); //执行查询sql语句 并把查询的结果封装到ResultSet容器中
//遍历出来
while(set.next()){ //指针向下移动并且判断当前行是否有记录 有:true 无:false
int deptId=set.getInt("deptId");//获取当前行中指定列的值
String deptName= set.getString("deptName");
System.out.println(deptId+"============="+deptName);
}
}
获得更多学习资源点击此处A_M阿木的博客_CSDN博客-领域博主