测试学院
PreparedStatement可以等到所有的参数通过set方法的传递完全再一起执行,减少对数据库的重复访问。
set方法中,可以引入数据表的映射的get方法,使得传参数更自由。
PreparedStatement ptmt = conn.prepareStatement(sql); ... ptmt.execute();//预编译sql语句,执行该语句时才会生效
sql语句中 使用 ?做占位符。
sql语句中 可以current_data()等语句
java.util.Date和java.sql.Date的区别和相互转化
一、共同点:
都有getTime方法返回毫秒数,可以直接构建
二、不同点:
1、java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分,一般在读写数据库的时候用,PreparedStament的setDate()的参数和ResultSet的getDate()方法的都是java.sql.Date
2、java.util.Date是在除了SQL语句的情况下面使用,一般是日常日期字段
3、java.util.Date 是 java.sql.Date 的父类,即:继承关系:java.lang.Object --》 java.util.Date --》 java.sql.Date
三、相互转化:
1.java.sql.Date转为java.util.Date
java.sql.Date date=new java.sql.Date();
java.util.Date d=new java.util.Date (date.getTime());
2.java.util.Date转为java.sql.Date
java.util.Date utilDate=new Date();
java.sql.Date sqlDate=new java.sql.Date(utilDate.getTime());
java.sql.Time sTime=new java.sql.Time(utilDate.getTime());
java.sql.Timestamp stp=new java.sql.Timestamp(utilDate.getTime());
四、这里所有时间日期都可以被SimpleDateFormat格式化format()
SimpleDateFormat f=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
f.format(stp);
f.format(sTime);
f.format(sqlDate);
f.format(utilDate)
java.sql.Date sqlDate=java.sql.Date.valueOf(" 2005-12-12");
utilDate=new java.util.Date(sqlDate.getTime());
另类取得年月日的方法:
import java.text.SimpleDateFormat;
import java.util.*;
java.util.Date date = new java.util.Date();
如果希望得到YYYYMMDD的格式SimpleDateFormat
sy1=new SimpleDateFormat("yyyyMMDD");
String dateFormat=sy1.format(date);
如果希望分开得到年,月,日SimpleDateFormat
sy=new SimpleDateFormat("yyyy");
SimpleDateFormat sm=new SimpleDateFormat("MM");
SimpleDateFormat sd=new SimpleDateFormat("dd");
String syear=sy.format(date);
String smon=sm.format(date);
String sday=sd.format(date);
1.String sql="..."+"..."+"..."+"...",插入表+字段+values+占位符
2.执行sql语句:conn.prepareStatement();//预编译sql语句,prepareStatement()这个方法,将sql语句加载到驱动程序的执行程序中,在调用execute()方法时才真正执行。
3.“?”是占位符
4.给sql语句传递参数时,把对数据库进行映射的model里的那个类传进来,public void addGoddess(Goddess g) throws Exception{...};,再从g的这个对象获取数据,即ptmt.setString(1, g.getUser_name());这个下标是从1开始。
5.//ptmt.setDate(4, g.getBirthday());
//错误,当前的getBirthday是java.util.Date,而setDate需要的参数却是java.sql.Date
ptmt.setDate(4, new Date(g.getBirthday().getTime()));
6.create_date和update——date不需要前台写入,这是根据创建的时间决定的,所以直接在sql语句里将这个创建日期传入进去,即current_date()。
综上,新增的方法步骤为1.拿到数据库的连接;2.拼写sql语句;3.预编译;4.传参,给这些“?”预编译符去赋值;5.执行。
//通过静态方法,获取连接数据库的连接 Connection conn = DBUtil.getConnection(); //sql语句 String sql = "" + " insert into imooc_goddess " + " (user_name,sex,age,birthday,email,mobile, " + " create_user,create_date,update_user,update_date,isdel) " + " values("+ " ?,?,?,?,?,?,?,current_date(),?,current_date(),?);" ; //预编译sql语句 PreparedStatement ptmt = conn.prepareStatement(sql); ptmt.setString(1, g.getUser_name()); ptmt.setInt(2, g.getSex()); ptmt.setInt(3, g.getAge()); ptmt.setDate(4, new Date(g.getBirthday().getTime())); ptmt.setString(5, g.getEmail()); ptmt.setString(6, g.getMobile()); ptmt.setString(7, g.getCreate_user()); ptmt.setString(8, g.getUpdate_user()); ptmt.setInt(9, g.getIsdel()); ptmt.execute();
Mysql的日期函数:current_date() 获得的是当前日期。直接在sql语句中使用
java.util.Date转换成java.sql.Date:
ptmt.setDate(4,new Date(g.getBirthday().getTime()));
输入输出异常:IOException
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
操作数据库异常:SQLException
文件未找到异常:FileNotFoundException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
字符串转换为数字异常:NumberFormatException
方法未找到异常:NoSuchMethodException
@JDBC---预编译与日期转变
1.预编译
PreparedStatement和Statement的区别
一.代码的可读性和可维护性。
二.PreparedStatement提高性能,因在被编译后有缓存,下次用相同的不编译,传参直接执行。
三.提高安全性。
PrepareStatement ptmt=conn.prepareStatement(sql);//将sql加载到驱动程序中但不执行; ptmt.setString/Int....(index,值);//index为int或String ptmt.execute;//再执行
2.日期转换
java.sql.Date类是java.util.Date类的子类
java.util.Date转java.sql.Date
new java.sql.Date(new java.util.Date().getTime());
java.sql.Date转java.util.Date
new java.util.Date(new java.sql.Date());
3.实例
//通过静态方法,获取连接数据库的连接 Connection conn = DBUtil.getConnection(); //sql语句 String sql = "insert into imooc_goddess " + "(user_name,sex,age,birthday,email,mobile, " + "create_user,create_date,update_user,update_date,isdel) " + "values(?,?,?,?,?,?,?,current_date(),?,current_date(),?);" ; //预编译sql语句 PreparedStatement ptmt = conn.prepareStatement(sql); //赋值 ptmt.setString(1, g.getUser_name()); ptmt.setInt(2, g.getSex()); ptmt.setInt(3, g.getAge()); //java.util.Date转换java.sql.Date ptmt.setDate(4, new Date(g.getBirthday().getTime())); ptmt.setString(5, g.getEmail()); ptmt.setString(6, g.getMobile()); ptmt.setString(7, g.getCreate_user()); ptmt.setString(8, g.getUpdate_user()); ptmt.setInt(9, g.getIsdel()); //执行sql语句 ptmt.execute();
mysql , current_date()函数获取当前年月日
把java.util.Date日期类型转换为java.sql.Date日期类型
用prepareStatement 减少对数据库的操作
Date可能会出现的问题