一、用JDBC连接mysql数据库基本流程
<%
//1.注册驱动Class.forName("com.mysql.jdbc.Driver");
//2.建立连接
String url="jdbc:mysql://localhost:3306/news";
String user="root";
String password="qiuqiu";
Connection conn=DriverManager.getConnection(url, user, password);
//3.创建语句
Statement stmt=conn.createStatement();
//4.执行语句
String sql="SELECT id,userName,PASSWORD,email,userType FROM news_user";
ResultSet rs=stmt.executeQuery(sql);
//5.处理结果
while(rs.next()){
System.out.println(rs.getObject("id")+"------");
System.out.println(rs.getObject("userName")+"------");
System.out.println(rs.getObject("PASSWORD")+"------");
System.out.println(rs.getObject("email")+"------");
System.out.println(rs.getObject("userType"));
}
//释放资源
rs.close();
stmt.close();
conn.close();
%>
二、各流程详解
1. 注册驱动(只做一次),有三种方式:
<%/*1.注册驱动(只做一次),有三种方式*/
//方式一(推荐使用):
Class.forName("com.mysql.jdbc.Driver");
//方式二:
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
//方式三:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
/*注意:
其中方式三,会造成DriverManager中产生两个一样的驱动 并会对具体的驱动类产生依赖 所有不推荐使用
方式二虽然不会对具体的驱动类产生依赖 但是注册不太方便 因此也很少用
方式一不会对具体的驱动类产生依赖 书写也比较方便 推荐使用
*/
/*2.建立连接(Connection)*/
//a.代码格式
Connection conn=DriverManager.getConnection(url, user, password);
//b.url格式
/*jdbc:子协议:子名称//主机名:端口/数据库名?属性名=属性值&...如果主机名与端口号是缺省值 主机名和端口号可省略:jdbc:子协议:子名称///数据库名?属性名=属性值&...*/
/*User,Password可以用"属性名=属性值的方式告诉数据库"*/
/*其他参数如:useUnicode = true&characterEncoding=GBK.*/
/*3.创建可执行sql语句的对象(Statement)*/
Statement stmt=conn.createStatement();
/*4.执行sql语句 用ResultSet对象接受执行结果*/
ResultSet rs=stmt.executeQuery("SELECT id,userName,PASSWORD,email,userType FROM news_user");
/*5.rs.next()遍历查询到的结果*/
while(rs.next()){
System.out.println(rs.getObject("id")+"-----");
System.out.println(rs.getObject("userName")+"-----");
System.out.println(rs.getObject("PASSWORD")+"----");
System.out.println(rs.getObject("email")+"----");
System.out.println(rs.getObject("userType"));
}
/*6.释放资源*/
rs.close();
stmt.close();
conn.close();
%>
JDBC学习笔记(二)SQL注入
一、Statement对象执行的SQL语句需要与字符串变量进行连接的时候,传递特殊的字符就会导致SQL注入问题
String sql = "select * from user where id = ? || name = ? || age = ?";
PreparedStatement ps = conn.prepareStatement(sql);
// 把SQL语句中的第一个问号替换为变量id ps.setInt(1, id);
// 把SQL语句中的第二个问号替换为变量name ps.setString(2, name);
// 把SQL语句中的第三个问号替换为变量age ps.setInt(3, age);
// 注意在查询时不能带参数,否则会调用ps的父类Statement的executeQuery方法
ResultSet rs = ps.executeQuery();
三、PreparedStatement相对Statement的优点
1. PreparedStatement没有SQL注入的问题。
2. Statement会使数据库频繁编译SQL, 可能造成数据库缓冲区溢出。
3. 数据库和驱动可以对PreparedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效).
JDBC学习笔记(三)大文本数据的读写
ps = conn.prepareStatement(sql);
File f = new File("D:\\BaiduNetdiskDownload\\mysql\\jdbc.sql");
Reader reader = new BufferedReader(new FileReader(f));
ps.setCharacterStream(1, reader , f.length());
int res = ps.executeUpdate();
System.out.println(res);
reader.close();
二、从数据库读取大文本数据写入到文件中
方式一:直接把数据保存到字符串中
String big_text = rs.getString("bit_text"); File f = new File("D:\\BaiduNetdiskDownload\\mysql\\jdbc.bak.sql"); Writer wt = new FileWriter(f); wt.write(big_text); wt.close();
方式二:通过ResultSet对象rs获取输入流读取数据,创建输出流写到文件
Reader rd = rs.getCharacterStream("bit_text");
File f = new File("D:\\BaiduNetdiskDownload\\mysql\\jdbc.bak.sql");
Writer wt = new FileWriter(f);
char[] buff = new char[1024];
int i = 0;
while ((i = rd.read(buff)) != -1)
{
wt.write(buff, 0, i);
}
wt.close();
rd.close();
方式三、通过Clob对象获取输入流
cb = rs.getClob("bit_text");
Reader rd = cb.getCharacterStream();
File f = new File("D:\\BaiduNetdiskDownload\\mysql\\jdbc.bak.sql");
Writer wt = new FileWriter(f);
char[] buff = new char[1024];
int i = 0;
while ((i = rd.read(buff)) != -1)
{
wt.write(buff, 0, i);
}
wt.close();
rd.close();