数据库的增、删、改、查操作-----(一)

时间:2022-12-11 20:55:34

  初学JAVA,想把一些笔记以博客的形式保存。

最近学了一些有关数据库操作的内容:增、删、改、查。下面将这些知识点以实现一个简单的新闻管理系统为例进行分享(注:新闻实体类代码略)。

1、首先我们需要连接数据库(MYSQL),采用直连的方式:

简要说明一下直连的步骤:①导入驱动包→②加载JDBC驱动→③通过驱动管理类获取连接对象→④通过连接对象创建编译对象→⑤定义要执行的SQL语句→⑥通过编译对象设置参数→⑦通过编译对象执行SQL指令并处理返回结果→⑧释放操作源

代码示例:

<pre name="code" class="java"><span style="font-size:14px;">//加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/NEWSDB";
String user = "root";
String password = "root";
//获取连接对象
Connection con = DriverManager.getConnection(url,user,password);
//创建编译对象
Statement st = con.createStatement();
//定义执行的SQL语句
String sql = "select * from newsinfo";
//通过编译对象执行SQL语句
ResultSet rs = st.executeQuery(sql);
//处理返回结果
if(rs != null){
while(rs.next()){
int id = rs.getInt("newsId");
String title = rs.getString("newsTitle");
String content = rs.getString("newsTitle");
System.out.print(id+" "+title+" "+content);
}
}</span>


 
直连这一步骤代码块在增、删、改、查数据操作时,要多次被用到,这时我们可以将其提取出来写进一个类里,这样可以节省时间也提高了代码的复用性。 

为了使这个类的类对象在内存中只存在一个副本,故本类采用单例设计模式:

①构造函数私有化

②提供一个当前类类型的静态私有属性

③提供一个创建本类对象的公共静态方法

<span style="font-size:14px;">public class DBConnect{

private static DBConnect con;
//构造函数私有化
private DBConnect(){

}

public static DBConnect newsInstance(){

if( con == null){
con = new Connection();
}
return con;
}

/**获取连接的方法**/
public Connection getConnect(){

Connection con = null;
try{
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/NEWSDB";
String user = "root";
String password = "root";
//获取连接对象
con = DriverManager.getConnection(url,user,password);
}catch(Exception e){
e.printStackTrace();
}
return con;
}
}</span>

2、接着就可以编写各个操作的方法了。由于增加、修改、删除数据操作类似,只是其中的SQL指令会有所不同,这时我们可以写一个方法,通过传递不同参数来选择执行不同增加、修改或者删除数据操作。这里传递不同参数来选择SQL指令通过定义枚举来实现。
<span style="font-size:14px;">public enum OperateEnum{      INSERT,UPDATE,DELETE}</span>
将获取连接对象方法定义成操作类中的一个私有属性,以便后面使用
<span style="font-size:14px;">private DBConnect dbcon = DBConnect.newsInstance();</span>
增加、修改、删除数据操作方法
<span style="font-size:14px;">public int operateEnum(NewsInfo news,OperateEnum openum){    int row = 0;    //句柄    Connection con = null;    Statement st = null;    try{        con = dbcon.getConnection();        st = con.createStatement();        //获取属性值        Integer id = news.getNewsId();        String title = news.getNewsTitle();		String content = news.getNewsContent();		Date date = news.getNewsDate();        String dateString = null;		//判断日期值是否为空,不为空则转换成字符串		if(date != null){		    //convertDateToString()是将日期对象转换为字符串的方法			dateString = convertDateToString(date);		}		String sql = null;		switch(openum){		    case INSERT:		        sql = "insert into newsinfo values(null,'"+title+"','"+content+"','"+dateString+"')";		        break;		    case DELETE:		        sql = "delete from newsinfo where newsId = " + id;		        break;		    case UPDATE:		        sql =  "update newsinfo set newsTitle = '" + title+ "',newsContent='" + content + "',newsDate='"					+ dateString + "' where newsId =" + id;		        break;		}		row = st.executeUpdate(sql);    }catch(Exception e){        e.printStackTrace();    }finally{        st.close();        if(!con.isClosed()){            con.close();            con = null;        }    }    return row;}/***把日期对象转换为字符串****/private String converDateToString(Date date){    //创建时间格式化对象    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    return sdf.format(date);}</span>
查询操作
<span style="font-size:14px;">public List<NewsInfo> listNewsInfo(){           //新闻集合对象    List<NewsInfo> newsList = new ArrayList<NewsInfo>();    //相关操作句柄    Connection con = null;    Statement st = null;    ResultSet rs = null;    try{        con = dbcon.getConnection();        st = con.createStatement();        String sql = "select * from newsInfo";        rs = st.executeQuery(sql);        if(rs != null){            while(rs.next()){                //循环获取当前循环行的每一列对应值		Integer newsId = rs.getInt("newsId");		String newsTitle = rs.getString("newsTitle");		String newsContent = rs.getString("newsContent");						//把java.sql.Timestamp转换为java.util.Date对象		Date newsDate = new Date(rs.getTimestamp("newsDate").getTime());						//把当前行每一列对应值封装到NewsInfo对象对应属性中		NewsInfo newsInfo = new NewsInfo();		newsInfo.setNewsId(newsId);		newsInfo.setNewsTitle(newsTitle);		newsInfo.setNewsContent(newsContent);		newsInfo.setNewsDate(newsDate);		//把构建的新闻对象存储到新闻集合中		newsList.add(newsInfo);                    }        }    }catch(Exception e){        e.printStackTrace();    }finally{        st.close();        if(!con.isClosed()){            con.close();            con = null;        }    }    return newsList;}/***显示表中所有信息***/public void showInfo(){        List<NewsInfo> list = listNewsInfo();    if(list !=null && list.size() > 0){        for(NewsInfo news : list){            System.out.println(news.getNewsId()+"\t\t"+news.getNewsTitle()+"\t\t"+news.getNewsContent()+"\t\t"+convertDateToString(news.getNewsDate()));        }    }}</span>
3、方法写完后,就可以在主类中测试了

<span style="font-size:14px;">public class NewsUI {

/**
* @param args
*/
public static void main(String[] args) {

System.out.println("====================欢迎使用新闻管理系统==================");
Scanner sc = new Scanner(System.in);
// 创建一个新闻操作类对象
NewsManager mg = new NewsManager();
while(true){
System.out.println("\n1. 添加新闻\n2. 删除新闻\n3. 修改新闻\n4. 查询新闻\n请选择功能(1,2,3,4):");
int select = sc.nextInt();
int row = 0;
//创建一个新闻对象
NewsInfo news = new NewsInfo();

switch(select){
case 1:
sc.nextLine();
System.out.println("请输入新闻标题:");
String title = sc.nextLine();
System.out.println("请输入新闻内容:");
String content = sc.nextLine();

news.setNewsTitle(title);
news.setNewsContent(content);
news.setNewsDate(new Date());
//调用编辑新闻信息的方法[选择添加功能]
row = mg.operateNews(news, OperateEnum.INSERT);
//受影响的行数大于0,即操作成功
if(row > 0){
//显示添加后的新闻信息
mg.showInfo();
}
break;
case 2:
System.out.println("请输入要删除的新闻的编号");
int deleId = sc.nextInt();
//构建一个新闻对象
news.setNewsId(deleId);
//调用编辑新闻信息的方法[选择删除功能]
row = mg.operateNews(news, OperateEnum.DELETE);
if(row > 0){
//显示添加后的新闻信息
mg.showInfo();
}
break;
case 3:
System.out.println("请输入要修改的新闻的编号:");
int updateId = sc.nextInt();
//构建一个新闻对象
news.setNewsId(updateId);
System.out.println("原始信息:" + mg.getNewsInfo(news));
sc.nextLine();
//提示输入修改信息
System.out.println("请输入修改后的新闻标题:");
String newsTitle = sc.nextLine();
System.out.println("请输入修改后的新闻内容:");
String newsContent = sc.nextLine();
System.out.println("请输入修改后的新闻时间:");
String newsDate = sc.nextLine();
//把修改的值封装到对象对应属性中
news.setNewsContent(newsContent);
try {
news.setNewsDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(newsDate));
} catch (ParseException e) {
e.printStackTrace();
}
news.setNewsTitle(newsTitle);
//调用编辑新闻信息的方法[选择修改功能]
row = mg.operateNews(news, OperateEnum.UPDATE);
//受影响的行数大于0,即操作成功
if(row > 0){
//显示添加后的新闻信息
mg.showInfo();
}
break;
case 4:
mg.showInfo();
break;
}
}
}

}</span>