配置连接数据库文件
在根目录下新建resources文件,并点亮如图
导入jar包,其中mysql-connector-java-5.1.0-bin.jar为jdbc连接数据库的必要包
!
在导入jar包时,problem会显示有问题,进去如图点击即可,最后记得点击ok应用生效
在resources文件夹内新建db.properties配置数据库属性文件,文件内容
driver=com.mysql.jdbc.Driver //启动驱动
url=jdbc:mysql://192.168.56.29:3306/qMall //连接的数据库地址
user=kb07 //数据库登陆用户名
pwd=ok //数据库登陆用户密码
在src目录下新建class文件使用单例模式读取数据库属性文件
public class Prop {
//使用单例模式保证该对象 由始至终只有一个
private static Properties p;
private Prop() {//工具类不需要构建对象
}
static {
p=new Properties();
try {
InputStream is=Prop.class.getClassLoader().getResourceAsStream("db.properties");
p.load(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static final String DRIVER=p.getProperty("driver");
public static final String URL=p.getProperty("url");
public static final String USER=p.getProperty("user");
public static final String PWD=p.getProperty("pwd");
}
接下来把加载驱动,连接数据库,负责将执行的sql语句提交到数据库,执行sql查询语句返回的结果集,关闭资源五个模块提取方法,以方便使用
public class BaseDao {
private Connection conn;
private PreparedStatement pst;
public ResultSet rs;
public void getConn() throws ClassNotFoundException, SQLException {
Class.forName(Prop.DRIVER); //启动执行驱动
conn= DriverManager.getConnection(Prop.URL,Prop.USER,Prop.PWD);
System.out.println("连接完成");
//获取连接
}
public void query(String sql,Object...params) throws SQLException {
pst=conn.prepareStatement(sql);
for (int i = 1; i <=params.length ; i++) {
pst.setObject(i,params[i-1]);
}
rs=pst.executeQuery();
System.out.println("查询完成");
}
public int update(String sql,Object...params) throws SQLException {
pst=conn.prepareStatement(sql);
for (int i = 1; i <=params.length ; i++) {
pst.setObject(i,params[i-1]);
}
return pst.executeUpdate();
}
public void close() throws SQLException {
//关闭资源
if(rs!=null){
rs.close();
}
if(pst!=null){
pst.close();
}
if(conn!=null){
conn.close();
}
System.out.println("关闭完成");
}
}
使用PreparedStatement的好处:
简化Statement中的操作
提高执行语句的性能
提高安全性,防止sql注入
可读性和可维护性更好
方法executeQuery和executeUpdate的简单介绍
1、方法executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。
2、方法executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
事例测试
执行前数据库数据(数据纯瞎编),这里测试更改第一条的loginStatus
继承调用上面提取的方法,编写sql语句
public class UserDaoImpl extends BaseDao{
//通过反射获取logger对象,用来打印测试,引入log4j的jar包才能使用,导入时选择org.apache.log4j.Logger
Logger logger=Logger.getLogger(UserDaoImpl.class);
public boolean changeType(int id,int i) {
int num=0;
try {
getConn();
String sql="update tb_user set loginStatus=? where uid=?";
Object[] o={i,id};
num=update(sql,o);
logger.info("执行 update成功");
logger.info(num>0?true:false);
logger.debug("测试");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return num>0?true:false;
}
//测试
public static void main(String[] args) {
UserDaoImpl userDao=new UserDaoImpl();
userDao.changeType(1, 1);
}
}
执行后控制台输出页面
数据库变化,显示更改成功