初学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>