创建数据库表stu,结构uid,uname,upwd,umoney,使用预处理和配置文件制作增删改查程序
create table stu(
uid int primary key identity(1, 1),
uname nvarchar (20) ,
upwd nvarchar (20),
umoney int
)
insert into stu values('诗书','0',233)
insert into stu values('江唯','1',666)
insert into stu values('嘉怡','2',777)
insert into stu values('画唱','3',888)
insert into stu values('点赞','4',999)
--select * from stu
--delete from stu
--drop table stu
package liZi;
import java.io.*;
import java.util.*;
import java.sql.*;
public class peiZhi {
public static void main(String[] args)
throws Exception{
System.out.println("查表的所有信息:\n");
//selectSql:查询的SQL语句
String selectAllSql="select * from stu";
ResultSet resNeiRong1=DBUtils.Select(selectAllSql);
selectTableAll(resNeiRong1);
System.out.println("——————————");
System.out.println("修改表的信息后查表的所有信息:\n");
String updateSql
="update stu set uname=? where uid=?";
Object[] o={"诗书画唱",1};
//Object[] o={第一个"?",第二个"?",...第n个"?"};
DBUtils.ZSG(updateSql, o);
//______________________________
ResultSet resNeiRong2=DBUtils.Select(selectAllSql);
selectTableAll(resNeiRong2);
System.out.println("——————————");
System.out.println("删除表的信息后查表的所有信息:\n");
String deleteSql
="delete from stu where uid=?";
Object[] oo={2};
DBUtils.ZSG(deleteSql,oo);
//______________________________
ResultSet resNeiRong3=DBUtils.Select(selectAllSql);
selectTableAll(resNeiRong3);
System.out.println("——————————");
System.out.println("增加表的信息后查表的所有信息:\n");
String insertSql
="insert into stu values(?,?,?)";
Object[] ooo={"点赞投币收藏和关注",4,666};
DBUtils.ZSG(insertSql, ooo);
//______________________________
ResultSet resNeiRong4=DBUtils.Select(selectAllSql);
selectTableAll(resNeiRong4);
System.out.println("——————————");
}
//当有一段代码会常用,那么就会用
//鼠标右键等的快捷键封装生成的自定义方法。
//自己总结的自定义方法模板:private static void
//方法名(被传值的类型 被传值名){内容}
//resNeiRong可获得resNeiRong1或resNeiRong2等的内容
//下面是用快捷键封装生成的自定义方法,
//selectTableAll:查询表的所有信息。
private static void selectTableAll(ResultSet resNeiRong)
throws SQLException {
while(resNeiRong.next()){
System.out.println("用户编号:"
+resNeiRong.getObject(1)
+"\t用户名:"
+resNeiRong.getObject(2));
}
}
}
package liZi;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class DBUtils {
public static Connection con=null;
public static ResultSet res=null;
public static PreparedStatement ps=null;
public static String uname,pwd,root,url;
static{//static为每个类中最先执行的地方,因为要让这部分先执行,所以这部分外面套个static,顺序不对,就会有问题
try {
//将创建的配置文件转化为字节流信息(类加载器读):
InputStream is= DBUtils.class.getResourceAsStream("./database.properties");
Properties p=new Properties();
//字节流转为内容
p.load(is);
root=p.getProperty("root");
url=p.getProperty("url");
uname=p.getProperty("uname");
pwd=p.getProperty("pwd");
//加载驱动
Class.forName(root);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getCon(){
if(con==null){
try {
con=DriverManager.getConnection(url,uname,pwd);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return con;
}
public static ResultSet Select(String sql,Object... o){
con=getCon();
try {
ps=con.prepareStatement(sql);
for(int i=0;i
ps.setObject(i+1,o[i]);
}
res=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res;
}
public static boolean ZSG(String sql,Object... o){
//自己的总结:
//public static 方法的数据类型 方法名(XXX(被传值的数据类型)... 被传值名){}:表示声明了一个公共,静态,有任意数量的被传值的数据类型为XXX的被传值的方法
con=getCon();
boolean b=false;
try {
ps=con.prepareStatement(sql);
for(int i=0;i
ps.setObject(i+1,o[i]);
}
int num=ps.executeUpdate();
if(num>0){
b=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
}
url=jdbc:sqlserver://localhost;databaseName=yonghu
uname=qqq
pwd=123
root=com.microsoft.sqlserver.jdbc.SQLServerDriver
DBUtils中nain主函数中使用方法:
package Text;
import java.io.*;
import java.util.*;
import java.sql.*;
public class DBUtils {
//必须先把sqljdbc包导入,不然会报错
//下面的main主函数可以在这个DBUtils中直接调用
//DBUtilsprepareStatement
//这个用了预处理的类,类里面有增删改或查的方法
//用“.”来调用,自己的总结
//:(类名).(这个类中有的方法名)
//这个类可以分开写到单独的文件,也可以
//写在有main主函数调用的.java文件
public static void main(String[] args)
throws Exception{
String printlnAllSql="select * from stu";
String updateSql
="update stu set uname=? where uid=?";
Object[] duiXiang={"诗书画唱",1};
//想对某个对象进行操作的自己的总结:
//声明一个Object[] 对象名={?的值,?的第某个位置数值};
//之后用下面声明的增删改或查的方法,来执行下面的方法的内容
DBUtilsPrepareStatement.ZSGFangFa
(updateSql, duiXiang);
ResultSet res
=DBUtilsPrepareStatement
.selectFangFa(printlnAllSql);
System.out.println("打印所有stu表的内容:\n");
while(res.next()){
System.out.println(
"用户名:"+res.getObject(1)
+";用户编号:"+res.getObject(2));
}
//for(int i=0;i
//System.out.println(duiXiang[i]);
//}
}
//————————————————————————————————————————————————————
//public static void bianLiFangFa(Object... o){
//for(int i=0;i
//System.out.println(o[i]);
//}
//}
//————————————————————————————————
}
class DBUtilsPrepareStatement{
static String root,url,uname,pwd;
static Connection con=null;
static PreparedStatement ps=null;
static ResultSet res=null;
//常在静态代码块中读取配置文件
//static静态代码块就是优先执行的部分
static{
InputStream is=
DBUtilsPrepareStatement
.class.getResourceAsStream("./db.properties");
Properties p=new Properties();
try {
p.load(is);
root=p.getProperty("root");
url=p.getProperty("url");
uname=p.getProperty("uname");
pwd=p.getProperty("pwd");
//用Class.forName加载驱动,
//root为驱动的根(root)目录com.microsoft.sqlserver.jdbc.SQLServerDriver
Class.forName(root);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//个人理解:下面是加载数据库链接的方法 ,lianJieUrlUnamePwd
//连接url,uname,pwd
//就是用.getConnection
//把这里root对应的
//com.microsoft.sqlserver.jdbc.SQLServerDriver
//
//字符串,DriverManager和url,uname,pwd对应的字符串拼接或联系起来等
public static Connection lianJieUrlUnamePwd(){
if(con==null){
try {
con=DriverManager.getConnection(url,uname,pwd);
} catch (SQLException e) {
e.printStackTrace();
}
}
return con;
}
//声明用上prepareStatement预处理的封装的查询方法
public static ResultSet
selectFangFa(String sql,Object... o)
{
con=lianJieUrlUnamePwd();//拿到数据库链接
try {
ps=con.prepareStatement(sql);
for(int i=0;i
ps.setObject(i+1, o[i]);
}
//得到结果集
res=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res;
}
//封装增删改查的方法
public static boolean
ZSGFangFa(String sql,Object... o){
con=lianJieUrlUnamePwd();
boolean b=false;
try {
ps=con.prepareStatement(sql);
for(int i=0;i
ps.setObject(i+1, o[i]);
}
if(ps.executeUpdate()>0){
b=true;
}
//executeQuery():查询的时候用 ResultSet
//executeUpdate():增删改的时候用 int >0成功
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
}
root=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost;databaseName=yonghu
uname=qqq
pwd=123
I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。
package peiZhi;
import java.io.*;
import java.util.*;
public class pz {
public static void main(String[] args)throws Exception{
// input英[ˈɪnpʊt]
// 美[ˈɪnpʊt]
// v.输入(信息);
// stream英[striːm]
// 美[striːm]
// n.流; (液) 流; (气) 流; (人) 流; (车) 流;
// InputStream:输入流
// resource英[rɪˈsɔːs]
// 美[ˈriːsɔːrs]
// n.资源
// getResourceAsStream:得到资源作为(As)流
// 在Java中,能够读取一个字节序列的对象就称作一个输入流。
// ————————————————
// 下面的neiRong就是被声明成输入流。
// 输入流是一种输入的格式,
// 所谓的“流”,意味着是顺序访问形式
// (也就是相对于随机访问形式来说的)。
// 打开一个文件的时候,文件指针会按顺序读取里面的内容
// ,就好像水顺次从水管中流出一样,
// 而这一个模型我们把它抽象为“输入流”。
InputStream neiRong=pz.class.
getResourceAsStream("./pz.properties");
// properties英[ˈprɒpətiz]
// 美[ˈprɑpərtiz]
// n.所有物; 特性;
// Properties类表示一个持久的属性集,
// Properties可以保存在流中或从流中加载,
// 属性列表中每一个键及其对应值都是一个字符串。
// Properties集合是一个唯一和IO流相结合的集合
//
// 1.可以使用Properties集合中的方法store,
// 把集合中的临时数据,持久化写入到硬盘中存储
//
// 2.可以使用Properties集合中的load,
// 把硬盘中保存的文件(键值对),读取到集合中使用
//
// 属性列表中每一个键及其对应值都是一个字符串。
//
// Properties集合是一个双列集合,key和value默认都是字符串
//property英[ˈprɒpəti]
//美[ˈprɑːpərti]
//n. 财产;
//创建Properties集合对象,
// 使用Properties集合存储数据,
// 遍历取出Properties集合中的数据:
Properties jiHe=new Properties();
try{
// load英[ləʊd]
// 美[loʊd]
//
// v.【(把大量…) 装上,装入;
// 承载; 】装载; 【大量给予(尤指得携带的东西);】
//
jiHe.load(neiRong);
// 把nerong装载到jiHe里,之后可以直接打印出来
System.out.println("打印所有内容:"+jiHe);
// 使用getProperty方法通过key获取value
System.out.println("打印name对应的值:"
+jiHe.getProperty("name"));
// "name"为Properties文件中的key键,
// name=XXX中的XXX为对应的value值
}catch(IOException e){
e.printStackTrace();
}
}
}