简述
数据库上到JDBC了,也做了几个实验,在此总结几个入门的java操作数据库的常用方法。(不足,待添加,第一次先写statement和PreparedStatement)
使用jar包的一些遭遇
先说实验最开始吧,实验最开始,没怎么费力气,同学帮忙改了时区,添了8.0的jar包,在URL里加了使用ssl的声明,然后就成功连接,无异常
然后在第二次实验的那周不知道什么时候,发现去掉8.0的jar包连接,仅使用5.0的jar依然正常,就在IDE里把8.0的jar包去了,过了不久突然出现Communications link failure的奇怪错误,上网查了后,发现博客,似乎是因为长时间不用JDBC连接数据库的原因导致数据库自闭了,我:?!?!,你自闭个毛线,但想了想,这个设定估计是为了节省数据库的资源,猜想:第一次成功连接后,数据库一直处于等待状态,有资源在运行,所以设置了这个,防止长时间的等待。但该解决的问题也得解决,就按照博客上的办法各种修改,到最后发现毛用没有。后来上课时问了老师,老师问:你数据库版本是多少?把jar包换一下试试?然后就突然想起来,是不是去了jar包的原因,遂重新把8.0的jar包连接上,问题解决。
在此总结错误,对于5.0版本的mysql,使用5.0的jar包,对于8.0版本的mysql,应使用对应的8.0的jar包(似乎8.0的mysql,除了要连接8.0的jar包外,5.0的也需要?待实验,以后补充)
java中使用JDBC连接数据库
在此模仿老师的思路,新建一个DBUtil类,得到连接
import java.sql.Connection;
public class DBUtil {
private static final String jdbcUrl="";
private static final String dbUser="";
private static final String dbPwd="";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws java.sql.SQLException{
return java.sql.DriverManager.getConnection(jdbcUrl, dbUser, dbPwd);
}
}
jdbcUrl:连接数据库的钥匙,书写有点复杂,待补充
dbUesr:数据库用户名,一般为rooy
dbPwd:数据库密码
连接步骤:先调用Class.forName(“com.mysql.jdbc.Driver”)加载驱动,接着调用java.sql.DriverManager.getConnection(jdbcUrl, dbUser, dbPwd)得到一个类型为Connection的连接,返回即可
类的使用:使用时,新建Connection的变量赋值为DBUTil.getConnection(),即可
java中使用sql语句增删查改
Statement
查
单纯的查,有对应的executeQuery方法实现
Connection con = DBUtil.getConnection();
String sql = "select * from table";
java.sql.Statement st = con.createStatement();
java.sql.ResultSet rs = st.executeQuery(sql);
第一句,定义一个类型为Connection的变量con,同时调用之前连接写的DBUtil类的getConnection方法得到连接
第二句,书写sql语句,一般都是在数据库(navicat或者DataGrip)中书写好,运行正常后直接复制到双引号中,就可以正常使用
第三句,创建一个类型为Statement的st变量,暂且叫中间件吧(我是这么理解的),然后调用con的createStatement方法得到一个中间件方便下面sql语句的执行
第四句,创建一个结果集(ResuSet),名为st,通过st中间件的方法executeQuery带上sql语句参数,执行sql语句,得到结果返回给结果集
有关statement中间件的具体理解,我也没理解透,上网查到了一个博客 待看懂了再来补充
增删改
这三个基本都属于对数据库进行修改,所以用一个executeUpdate方法实现了
Connection con = DBUtil.getConnection();
String sql = "delete from table where ......";
java.sql.Statement st = con.createStatement();
int al = st.executeQuery(sql);//Affected lines
前三句基本相同,除了第二句换位增删改的语句以外
第四句,调用st的方法executeQuery执行sql语句,返回一个int值,为执行sql语句过后受影响的行数
PreparedStatement
查
还是单纯的查,和statement一样,有executeQuery
Connection con = DBUtil.getConnection();
String sql = "select * from table where clomne = ?";
java.sql.reparedStatement pst = con.prepareStatement(sql);
pst.setString(/*位置*/, /*替换字符*/);
java.sql.ResultSet rs = pst.executeQuery();
与statement略有不同
第一句相同
第二句,同样的是sql的查语句,但有了一个“?”,这里是为了实现带限制条件的查询,在statement里可以通过字符串的拼接实现,但PreparedStatement更好一些(具体比较下面再说),这里的问号可以不止一个,对应替换使用set…方法替换
第三句改了名字,同时在这里就sql语句传入
第四句调用pst的setstring方法,替换位置参数地方的问号为替换字符参数,同时前后加上单引号。例:pst.setString(1,“test”);,则替换后的待执行sql语句为"select * from table where clomne = ‘test’",如果想模糊查询加上通配符,需自己通过字符串拼接加上去。同时这里不止setString,还有set…,用法基本类似
第五句,调用pst的executeQuery方法,执行sql语句,同时返回结果集
增删改
类比statement,PreparedStatement也有executeUpdate方法,具体用法不再赘述,比statement多了PreparedStatement的替换操作。
小结
两个中间件(就叫中间件吧,待我回头问问老师),相比来说,第二个更好一些,同时第二个的性能要比第一个优秀,且第二个也可以不带替换的执行,性能比第一个更好,不用字符串拼接的奇怪错误。但具体为什么第二个优秀,找了一篇博客,先咕咕咕,待日后看懂了再来补充。
推荐Statement,PreparedStatement