标签:mat 十分 package hash owa rate actor put img
礼悟:
好好学习多思考,尊师重道存感恩。叶见寻根三二一,江河湖海同一体。
虚怀若谷良心主,愿行无悔给最苦。读书锻炼强身心,诚劝且行且珍惜。
数据、数据,命根就在数据。云计算、AI等技术,都是以数据为基础。操作数据库一定要谨慎小心。给最苦 这里的代码,看看就好,要有自己的判断。遇到抉择,要不耻上下问。
javaSE:8
mysql:5.7.14
mysql-connector-java:5.1.44
os:windows7 x64
ide:MyEclipse 2017
项目结构

下面是各个包下的各个类的代码展示
com.jizuiku.jdbc
- JDBCUtils
package com.jizuiku.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jizuiku.jdbc.dao.DaoException;
/**
*
*
* @author 给最苦
* @version V17.11.07
*/
public final class JDBCUtils {
/**
* url格式 -> jdbc:子协议:子名称//主机名:端口号/数据库的名字?属性名=属性值&属性名=属性值
* configString变量中有多个参数,需要深入地去研究它们的具体含义
*/
private static String configString = "?useUnicode=true&characterEncoding=utf8&useSSL=true";
private static String url = "jdbc:mysql://localhost:3306/jdbcforjava" + configString;
// 本地的mysql数据库(无子名称) 端口号3306 数据库jdbcforjava
private static String user = "root";
private static String password = "";
// 工具类,直接使用,不可生对象
private JDBCUtils() {
}
// 把注册驱动放到静态代码块中,因为 静态代码块只执行一次
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
// 异常要抛出去
throw new ExceptionInInitializerError(e);
}
}
/**
* 获取与指定数据库的链接
*
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/**
* 释放三种资源ResultSet Statement Connection
*
*/
public static void free(ResultSet rs, PreparedStatement ps, Connection con) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new DaoException(e);
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new DaoException(e);
} finally {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new DaoException(e);
}
}
}
}
}
com.jizuiku.jdbc.dao
- BookDao
package com.jizuiku.jdbc.dao;
import com.jizuiku.jdbc.domain.Book;
/**
* 这个接口可以将 业务逻辑层与数据访问层 分割开来的,是一种很强的思想。
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public interface BookDao {
/**
* 添加新的书籍
*
*/
public void addBook(Book book);
/**
* 根据id来查询相关书籍的信息,因为id是唯一的
*
*/
public Book getBook(int id);
/**
* 更新数据库中的书籍
*
* */
public void updateBook(Book book);
/**
* 删除数据库中的指定书籍
*
* */
public void deleteBook(Book book);
}
- DaoException
package com.jizuiku.jdbc.dao;
/**
* 这个类很重要,即完成了抛异常的动作、通过编译,又可以使数据逻辑层的接口保持简洁。
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class DaoException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
public DaoException() {
// TODO Auto-generated constructor stub
}
public DaoException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public DaoException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
public DaoException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public DaoException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
}
- DaoFactory
package com.jizuiku.jdbc.dao;
import java.io.InputStream;
import java.util.Properties;
/**
* 工厂类-单例模式
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class DaoFactory {
/*
* 这里有个大坑:只要把这两句话,调换一下位置。那么返回的bookDao总是null
* 为什么?
* 因为想想初始化的顺序,new DaoFactory()经过千辛万苦 把bookDao弄好了,
* 紧接着 BookDao bookDao = null;...前功尽弃
* */
private static BookDao bookDao = null;
private static DaoFactory instance = new DaoFactory();
/**
* Properties + 反射 ->初始化
* 这样的话,以后 给最苦 把接口从新实现了一下,生出了一个新的类。那么 只需要改配置文件就OK了
* 天呀,这是哪位前辈想到的。。。
*
* */
private DaoFactory() {
// TODO Auto-generated constructor stub
// 这里使用Properties读取配置文件
// 也可以使用xml
Properties prop = new Properties();
InputStream inputStream = null;
try {
// 这个写的,很强!
inputStream = DaoFactory.class.getClassLoader().getResourceAsStream("bookDao.properties");
// 通过流加载配置文件
prop.load(inputStream);
/*
* bookDao=com.jizuiku.jdbc.dao.impl.BookDaoJDBCImpl
* key:bookDao
* value:com.jizuiku.jdbc.dao.impl.BookDaoJDBCImpl
* value刚好是bookDao接口的实现类
*/
String bookDaoImplClassPath = prop.getProperty("bookDao");
// 有了bookDaoImplClassPath,就可以应用反射来构造这个类
bookDao = (BookDao)Class.forName(bookDaoImplClassPath).newInstance();
} catch (Exception e) {
// try中所有的代码都是初始化的过程,所以 一旦有错误,那么直接报错!
throw new ExceptionInInitializerError(e);
}
}
public static DaoFactory getInstance() {
return instance;
}
public BookDao getBookDao() {
return bookDao;
}
}
com.jizuiku.jdbc.dao.impl
- BookDaoJDBCImpl
package com.jizuiku.jdbc.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.jizuiku.jdbc.JDBCUtils;
import com.jizuiku.jdbc.dao.BookDao;
import com.jizuiku.jdbc.dao.DaoException;
import com.jizuiku.jdbc.domain.Book;
/**
*
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class BookDaoJDBCImpl implements BookDao {
/**
* 增加操作
*
* */
@Override
public void addBook(Book book) {
// TODO Auto-generated method stub
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 注册驱动并建立连接
con = JDBCUtils.getConnection();
// 创建语句 并 对sql语句进行一些预处理
String sql = "insert into book(name,quantity,time,price) values(?,?,?,?)";
// 注明要返回主键
ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
// 向sql语句中传入值
ps.setString(1, book.getName());
ps.setInt(2, book.getQuantity());
ps.setDate(3, new java.sql.Date(book.getTime().getTime()));
ps.setBigDecimal(4, book.getPrice());
// 执行sql语句
ps.executeUpdate();
// 得到的主键
// 因为主键就一个,而且是Int类型的
int id = 0;
rs = ps.getGeneratedKeys();
if(rs.next()){
// 该对象成功插入数据库,把得到的主键给这个book对象
id = rs.getInt(1);
book.setId(id);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
// 这里针对异常的处理,蕴含着智慧,十分关键!
throw new DaoException(e.getMessage(), e);
} finally {
// 释放资源
JDBCUtils.free(rs, ps, con);
}
}
/**
* 查询操作
* */
@Override
public Book getBook(int id) {
// TODO Auto-generated method stub
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
Book book = null;
try {
// 注册驱动并建立连接
con = JDBCUtils.getConnection();
// 创建语句
String sql = "select id,name,quantity,time,price from book where id=?";
ps = con.prepareStatement(sql);
ps.setInt(1, id);
// 执行语句
rs = ps.executeQuery();
// 处理结果
if (rs.next()) {
// 有查询到,那么创建一个对象s
book = mappingBook(rs);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
// 这里针对异常的处理,蕴含着智慧,十分关键!
throw new DaoException(e.getMessage(), e);
} finally {
// 释放资源
JDBCUtils.free(rs, ps, con);
}
return book;
}
/**
* 修改操作
*
* */
@Override
public void updateBook(Book book) {
// TODO Auto-generated method stub
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 注册驱动并建立连接
con = JDBCUtils.getConnection();
// 创建语句
String sql = "update book set name=?,quantity=?,time=?,price=? where id=?";
ps = con.prepareStatement(sql);
// 向sql语句中传入值
ps.setString(1, book.getName());
ps.setInt(2, book.getQuantity());
// 进行转换 从util包下的date转为 sql包下的date
ps.setDate(3, new java.sql.Date(book.getTime().getTime()));
ps.setBigDecimal(4, book.getPrice());
ps.setInt(5, book.getId());
// 执行语句
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
// 这里针对异常的处理,蕴含着智慧,十分关键!
throw new DaoException(e.getMessage(), e);
} finally {
// 释放资源
JDBCUtils.free(rs, ps, con);
}
}
/**
* 删除操作
*
* */
@Override
public void deleteBook(Book book) {
// TODO Auto-generated method stub
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 注册驱动并建立连接
con = JDBCUtils.getConnection();
// 创建语句
String sql = "delete from book where id=?";
ps = con.prepareStatement(sql);
ps.setInt(1, book.getId());
// 执行语句
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
// 这里针对异常的处理,蕴含着智慧,十分关键!
throw new DaoException(e.getMessage(), e);
} finally {
// 释放资源
JDBCUtils.free(rs, ps, con);
}
}
/**
* 根据查询结果对Book对象进行赋值,并返回一个赋值好的对象
*
*/
private Book mappingBook(ResultSet rs) throws SQLException {
// 这样做的好处是:减少代码重复使用
// 便于以后的优化
Book book = new Book();
book.setId(rs.getInt("id"));
book.setName(rs.getString("name"));
book.setQuantity(rs.getInt("quantity"));
book.setTime(rs.getTimestamp("time"));
book.setPrice(rs.getBigDecimal("price"));
return book;
}
}
com.jizuiku.jdbc.domain
- Book
package com.jizuiku.jdbc.domain;
import java.math.BigDecimal;
/**
* Book对象与数据库的表示对应的
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class Book {
private int id;
private String name;
private int quantity;
private java.util.Date time;
private BigDecimal price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public java.util.Date getTime() {
return time;
}
public void setTime(java.util.Date time) {
this.time = time;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((price == null) ? 0 : price.hashCode());
result = prime * result + quantity;
result = prime * result + ((time == null) ? 0 : time.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (price == null) {
if (other.price != null)
return false;
} else if (!price.equals(other.price))
return false;
if (quantity != other.quantity)
return false;
if (time == null) {
if (other.time != null)
return false;
} else if (!time.equals(other.time))
return false;
return true;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", quantity=" + quantity + ", time=" + time + ", price=" + price
+ "]";
}
}
数据库中的数据

下面进行 增删查改 的测试!
com.jizuiku.jdbc.demo
- Demo
package com.jizuiku.jdbc.demo;
import java.math.BigDecimal;
import java.util.Date;
import com.jizuiku.jdbc.dao.BookDao;
import com.jizuiku.jdbc.dao.DaoFactory;
import com.jizuiku.jdbc.domain.Book;
/**
* 测试类
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class Demo {
public static void main(String[] args) {
// 使用工厂类,扩展性变得更强!
BookDao bookDao = DaoFactory.getInstance().getBookDao();
Book book = new Book();
book.setId(15);
// 删除测试
// 删除id=15的那条记录
bookDao.deleteBook(book);
System.out.println(book.toString());
}
}
运行代码前数据库的状态

运行代码,控制台的输出是

数据库中的数据发生变动

package com.jizuiku.jdbc.demo;
import java.math.BigDecimal;
import java.util.Date;
import com.jizuiku.jdbc.dao.BookDao;
import com.jizuiku.jdbc.dao.DaoFactory;
import com.jizuiku.jdbc.domain.Book;
/**
* 测试类
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class Demo {
public static void main(String[] args) {
// 使用工厂类,扩展性变得更强!
BookDao bookDao = DaoFactory.getInstance().getBookDao();
Book book = new Book();
book.setName("孟子");
book.setQuantity(40);
book.setTime(new Date());
book.setPrice(new BigDecimal(Double.toString(99.99)));
// 增加测试完成!
bookDao.addBook(book);
System.out.println(book.toString());
}
}
运行代码前数据库的状态

运行代码,控制台的输出是

数据库中的数据发生变动

package com.jizuiku.jdbc.demo;
import java.math.BigDecimal;
import java.util.Date;
import com.jizuiku.jdbc.dao.BookDao;
import com.jizuiku.jdbc.dao.DaoFactory;
import com.jizuiku.jdbc.domain.Book;
/**
* 测试类
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class Demo {
public static void main(String[] args) {
// 使用工厂类,扩展性变得更强!
BookDao bookDao = DaoFactory.getInstance().getBookDao();
Book book = new Book();
// 查找测试完成!
book = bookDao.getBook(5);
System.out.println(book.toString());
}
}
数据库中存储的数据

运行代码后,控制台输出的结果

注:给最苦 所做的这个查询是按照 id值来查询的,结果唯一。给最苦 没有实现结果不唯一的查询。
package com.jizuiku.jdbc.demo;
import java.math.BigDecimal;
import java.util.Date;
import com.jizuiku.jdbc.dao.BookDao;
import com.jizuiku.jdbc.dao.DaoFactory;
import com.jizuiku.jdbc.domain.Book;
/**
* 测试类
*
* @author 博客园-给最苦
* @version V17.11.08
*/
public class Demo {
public static void main(String[] args) {
// 使用工厂类,扩展性变得更强!
BookDao bookDao = DaoFactory.getInstance().getBookDao();
Book book = new Book();
book.setId(6);
book.setName("孟子");
book.setQuantity(40);
book.setTime(new Date());
book.setPrice(new BigDecimal(Double.toString(99.99)));
// 更改测试完成!
// 是根据Id值来更改的
bookDao.updateBook(book);
System.out.println(book.toString());
}
}
执行代码前,数据库的内容

执行代码后,控制台的输出

数据库的变动

好,博文到这里就结束了。。。终于结束了。给最苦 都写累了。
那个《金刚经》上讲:“以无我无人无众生无寿者。修一切善法。”,所以 给最苦 在这里就不讨要个 感恩的心了。但是,还是讲如果有心的话,在心里说声谢谢呗。虽然 给最苦 的技术很差,这篇博文的水平也只能用来参考。但是,这份坚持把 给最苦 都感动坏了。
还是博文开头的那句话:
数据、数据,命根就在数据。云计算、AI等技术,都是以数据为基础。操作数据库一定要谨慎小心。给最苦 这里的代码,看看就好,要有自己的判断。遇到抉择,要不耻上下问。
加油!
学习资源:itcast和itheima视频库。如果您有公开的资源,可以分享给我的话,用您的资源学习也可以。
博文是观看视频后,融入思考写成的。博文好,是老师讲得好。博文坏,是 给最苦 没认真。
标签:mat 十分 package hash owa rate actor put img
原文地址:http://www.cnblogs.com/jizuiku/p/7845485.html