MySQL是一种DBMS,而且是一种一个小型的开源的关系型数据库管理系统。2008年1月16日MySQL AB被Sun公司收购。而2009年,SUN又被Oracle收购。就这样如同一个轮回,MySQL成为了Oracle公司的另一个数据库项目。
MySQL它在世界范围内得到了广泛的安装和使用,应该是使用人数最多的数据库软件了,因为它有着这样的特性:
成本——MySQL是开源软件,可以免费使用和修改。
性能——MySQL性能很好处理速度很快。
简单——MySQL很容易安装和使用,对新手友好。
MySQL数据库软件也是使用最常用的数据库管理语言:结构化查询语言(SQL)进行数据库管理和操作。
create database if not exists mysqldemo;
use mysqldemo;
create table if not exists book(id int primary key auto_increment,name varchar(20),price double,status tinyint(1),discount float,isBorrowed tinyint(2) default 0, createTime datetime default now());
为了尽可能演示MySQL中的数据类型和Java中类型的关系,这里将Book表的属性类型有int , varchar,doble,tinyint,float,tinyint,datetime。在这个表中isBorrowed 对应的实体类是一个Boolean类型,但是在MySQL中不支持Boolean类型的存储,但是可以通过tinyint来代替Boolean进行存储,在创建表的时候类型选择tinyint,长度*必须\为1,即tinyint(1).数据就保存0或者1,这样,在java后端取出数据的时候才会自动转化成true(数据库中的1)和false(数据库中的0)。
对应的实体类,在这个实体类中,类的属性和数据库表中的属性名一致方便之后的操作:
package entity;
import java.util.Date;
/**
* @author 陌意随影
* @create 2020-01-31 17:34
* @desc 书籍类
**/
public class Book {
//书籍的唯一主键,由数据库自动生成
private int id;
//书籍名称
private String name;
//价格
private double price;
//状态
private byte status;
/**状态正常*/
public final static byte STATUS_NORMAL=1;
/**状态异常*/
public final static byte STATUS_ERRO=0;
//折扣
private float discount;
//是否被借阅
boolean isBorrowed;
/**被借阅*/
public final static boolean isBorrowed_TRUE = true;
/**未被借阅*/
public final static boolean isBorrowed_FALSE = false;
//创建时间
private Date createTime;
public Book() {
}
@SuppressWarnings("javadoc")
public Book(int id, String name, double price,byte status, float discount, boolean isBorrowed, Date createTime) {
this.id = id;
this.name = name;
this.price = price;
this.status = status;
this.discount = discount;
this.isBorrowed = isBorrowed;
this.createTime = createTime;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public byte getStatus() {
return status;
}
public float getDiscount() {
return discount;
}
public boolean isBorrowed() {
return isBorrowed;
}
public Date getCreateTime() {
return createTime;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPrice(double price) {
this.price = price;
}
public void setStatus(byte status) {
this.status = status;
}
public void setDiscount(float discount) {
this.discount = discount;
}
public void setBorrowed(boolean isBorrowed) {
this.isBorrowed = isBorrowed;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
insert into book(name,price,status,discount,isBorrowed,createTime) values("围城",45.5,1,7.5,false,now());
insert into book(name,price,status,discount,isBorrowed,createTime) values("千年一叹",55.0,1,8.0,true,now());
insert into book(name,price,status,discount,isBorrowed,createTime) values("西游记",50.0,1,9.0,false,now());
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
jdbc连接数据库总体就是有五个步骤,简记为 “贾连预执释”:
“贾”:加载MySQL数据库驱动。
“连”:通过DriverManager.getConnection(url,user,password)获取连接对象Connection。其中url为需要连接的数据库名的地址,user为登录数据库的用户名,password为登录数据库的密码。
“预”:通过connection.createStatement();创建预处理对象。
“执”:执行SQL语句。
“释”:释放连接资源。
同:
1.PreparedStatement和Statement都是用来执行SQL查询语句的API之一。
2.PreparedStatement接口继承了Statement接口。
异:
/**
* @param book 需要保存的对象
* @return 保存成功返回1否则返回 0
*/
public int saveByStatement(Book book) {
//拼接需要执行的sql语句
String sql = "insert into book(name,price,status,discount,isBorrowed,createTime) values(\""+ book.getName()+"\",\""
+ book.getPrice()+"\",\""+book.getStatus()+"\",\""+book.getDiscount()+"\"," + book.isBorrowed()+",\"" + book.getCreateTime().toLocaleString()+"\");";
System.out.println(sql);
int result = 0;
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//2.获取创建连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysqldemo?serverTimezone=UTC", "root", "root");
//3.创建预处理对象
Statement statement = connection.createStatement();
//4.执行sql语句并返回执行结果影响的行数
result = statement.executeUpdate(sql);
//5.释放资源,先开启的后释放
statement.close();
connection.close();
return result;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* @param book 需要保存的对象
* @return 保存成功返回1否则返回 0
*/
public int saveByPrepareStatement(Book book) {
//拼接需要执行的sql语句
String sql = "insert into book(name,price,status,discount,isBorrowed,createTime) values(?,?,?,?,?,?)";
int result = 0;
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//获取创建连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysqldemo?serverTimezone=UTC", "root", "root");
//创建预处理对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//设置name占位符对应的值
preparedStatement.setString(1, book.getName());
//设置price占位符对应的值
preparedStatement.setDouble(2, book.getPrice());
//设置status占位符对应的值
preparedStatement.setByte(3, book.getStatus());
//设置discount占位符对应的值
preparedStatement.setFloat(4, book.getDiscount());
//设置isBorrowed对应占位符的值
preparedStatement.setBoolean(5, book.isBorrowed());
//设置createTime占位符对应的值,需要将 java.Util.Date 转化为 java.sql.Date才可以
preparedStatement.setDate(6,new Date(book.getCreateTime().getTime()));
//开始执行,并返回影响的行数
result = preparedStatement.executeUpdate();
//释放资源,先开启的后释放
statement.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
connection.prepareStatement(sql)用来产生一个PreparedStatement预处理对象,此时需要插入到数据库的值使用“?”来代替,这个就叫占位符。此时SQL中的操作参数从左到右和每个占位符一一对应。比如String sql = “insert into book(name,price,status,discount,isBorrowed,createTime) values(?,?,?,?,?,?)”;中,name的对应占位符是第1个“?",price对应的占位符是第2个“?”,以此类推。注意,在preparedStatement.setXX(int parameterIndex, XX x)时,parameterIndex是从1开始的,而不是从0开始!并且preparedStatement.setXX(int parameterIndex, XX x)中setXX的类型要和真实值x一致。比如preparedStatement.setString(1, book.getName());中book.getName()的值就是preparedStatement.setString()中setXX的XX,也就是String类型,其它的依次类推。注意preparedStatement.setBoolean(5, book.isBorrowed());中这里设置的是Boolean类型,但是我们知道MySQL是没有Boolean类型的。而在之前我们说过在数据库中这个isBorrowed属性是tinyint(1),当Java在取值或者设置值时,会自动将true转换为1,将false转换为0,从而数据库达到相当于存储Boolean类型的情况。
//设置name占位符对应的值
preparedStatement.setString(1, book.getName());
//设置price占位符对应的值
preparedStatement.setDouble(2, book.getPrice());
//设置status占位符对应的值
preparedStatement.setByte(3, book.getStatus());
//设置discount占位符对应的值
preparedStatement.setFloat(4, book.getDiscount());
//设置isBorrowed对应占位符的值
preparedStatement.setBoolean(5, book.isBorrowed());
//设置createTime占位符对应的值,需要将 java.Util.Date 转化为 java.sql.Date才可以
preparedStatement.setDate(6,new Date(book.getCreateTime().getTime()));
通过使用真实值替换占位符,最终执行preparedStatement.executeUpdate()时的语句为:
insert into book(name,price,status,discount,isBorrowed,createTime) values("红楼梦","60.5","1","8.0",false,"2020-10-31 0:01:11");
1,boolean execute 允许执行查询语句、更新语句、DDL语句
返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句。
2,getUpdateCount方法 获取更新的记录数量。
3,int executeUpdate(String sql)执行给定 SQL 语句
该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
4,ResultSet executeQuery(String sql) 执行给定的 SQL 语句
该语句返回单个 ResultSet 对象。返回值是更新的记录数量。
@Test
void testSaveBookByStament() {
Book book = new Book();
book.setName("红楼梦");
book.setBorrowed(Book.isBorrowed_FALSE);
book.setCreateTime(new Date());
book.setDiscount(8);
book.setPrice(60.5);
book.setStatus(Book.STATUS_NORMAL);
BookDao bookDao = new BookDao();
int result = bookDao.saveByStatement(book);
if(result == 1) {
System.out.println("添加新书成功!");
}else {
System.out.println("添加新书失败!");
}
}
eclipse 2019, JDK1.8 ,MySQL8.0
http://moyisuiying.com/index.php/javastudy/mysql/330.html