在学习了java基础和mysql以及SQL语法之后,那我们可以开始学习如何程序对数据库的数据进行操作,基本操作就是,查询,新增,更新,删除,四个基本操作,也是全部操作。
这节我们将通过jdbc,通过程序去查询数据库中表数据。
一、准备工作
1>开发工具idea或者eclipse
现在开发工具一般去用idea,推荐大家使用。就是破解需要花点时间
2>mysql数据库服务
我们需要通过程序去操作查询数据库中的数据,我们可以自己在自个电脑搭建一个mysql5.6或者mysql5.7,mysql8.0的也可以。目前mysql8是目前的最新的版本
3>驱动包
通过程序去连接数据库服务,这个时候这个就需要一个驱动包帮助我们通过它去连接数据库并去使用数据服务。在选择下载驱动包时,最好一定要和数据库服务的版本一致。
二、通过开发工具新建项目
我这里用的是idea
file>New>Project
取好名字,点击create
三、导入驱动包
将下载好的驱动包,我这里是mysql-connector-java-8.0.14.jar
我们在项目根目录下新建目录lib,将驱动包复制进去
然后选中lib,右键
将lib目录加入项目依赖包
四、编写实体类
本节案例我们是查询一张文章表的数据,我们需要建立和文章表对应的一个实体对象类ArticleInfo
package hm.jdbc.model;
import com.sun.org.apache.xpath.internal.operations.Bool;
import java.util.Date;
public class ArticleInfo {
private Long id;
private Long typeId;
private String title;
private Integer viewNum;
private String contents;
private Date createTime;
private Date upTime;
private Boolean enabled;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getTypeId() {
return typeId;
}
public void setTypeId(Long typeId) {
this.typeId = typeId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getViewNum() {
return viewNum;
}
public void setViewNum(Integer viewNum) {
this.viewNum = viewNum;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpTime() {
return upTime;
}
public void setUpTime(Date upTime) {
this.upTime = upTime;
}
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
}
五、dao层
这里是本节学习的重点,首先我们先看下代码
package hm.jdbc.dao;
import hm.jdbc.model.ArticleInfo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class ArticleInfoDao {
public List<ArticleInfo> getList(){
List<ArticleInfo> articleInfoList = new ArrayList<ArticleInfo>();
// 数据库连接
Connection conn = null;
// 执行sql用的
PreparedStatement ps = null;
// 结果集
ResultSet rs = null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获得连接对象
conn = DriverManager.getConnection("jdbc:mysql://192.168.0.177:3389/blog", "root", "root");
//3.获得语句对象(执行Sql语句)
String sql="select * from article_info";
ps = conn.prepareStatement(sql);
//4.执行Sql语句并接受结果集
rs = ps.executeQuery();
while (rs.next()) {
ArticleInfo articleInfo = new ArticleInfo();
articleInfo.setId(rs.getLong("id"));
articleInfo.setContents(rs.getString("contents"));
articleInfo.setTitle(rs.getString("title"));
articleInfo.setTypeId(rs.getLong("type_id"));
articleInfo.setEnabled(rs.getBoolean("enabled"));
articleInfo.setCreateTime(rs.getDate("create_time"));
articleInfo.setUpTime(rs.getDate("up_time"));
articleInfo.setViewNum(rs.getInt("view_num"));
articleInfoList.add(articleInfo);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return articleInfoList;
}
}
}
通过jdbc连接数据库查询数据有几个步骤
1>加载驱动
Class.forName("com.mysql.jdbc.Driver");
2>获得数据库连接对象
conn = DriverManager.getConnection("jdbc:mysql://192.168.0.177:3389/blog", "root", "root");
3>获取执行sql对象
ps = conn.prepareStatement(sql);
4>执行sql
rs = ps.executeQuery();
5>解析结果集
结果集对象是ResultSet,拿到结果集对象后,我们通过while循环同时判断是否存在下一个元素对象,在循环中,我们通过新建实体类对象,将结果
集中每一个对象解析放到对象属性,然后加入list中返回。
6>关闭连接
在使用完数据连接查询到数据之后,我们需要关闭对于的数据库连接,和最初打开获取的对象顺序相反。
六、编写测试入口类
public static void main(String [] args){
ArticleInfoDao articleInfoDao = new ArticleInfoDao();
List<ArticleInfo> list = articleInfoDao.getList();
for(ArticleInfo articleInfo : list){
System.out.println("文章标题:" + articleInfo.getTitle() + " 文章id:" + articleInfo.getId());
}
}
文章标题:文章标题1 文章id:1
文章标题:文章标题2 文章id:2
文章标题:文章标题3 文章id:3
文章标题:文章标题4 文章id:4
文章标题:文章标题5 文章id:5
编写教程不易,如果该文对你有帮助,同时你需要完整源代码时,可以通过下面连接下载
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/