JDBC
什么是JDBC:java连接数据库的规范(标准),可以使用java语言连接数据库完成CRUD操作
环境搭建
- 新建lib文件夹,存放jar包
- 将mysql驱动mysql-connector-java-5.1.x复制到lib文件夹中。
- 右键lib文件夹选择Add as Libraay,选择OK
JDBC开发步骤
- 注册驱动
- 加载驱动;手动加载字节码文件到JVM中
Class.forName("com.mysql.jdbc.Driver");
- 连接数据库
- 获取数据库连接对象
- URL统一资源定位符:由协议、IP、端口、SID程序实例名称组成
Conncetion conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8","root","1234");
- 获取发送SQL的对象
Statement statement = conn.createStatement();
- 执行SQL语句
//DML语句返回int型
String sql = "delete .....";
int result = statement.executeUpdate(sql);
-----------------------------------------------------------
//DQL语句返回ResultSet结果集
ResultSet rs = statement.executeQuery(sql);
- 处理结果
//DML语句
if(result == 1 ){
System.out.println("Success!!")
}
//DQL语句
while(rs.next() ){
String job_id = resultSet.getString( "列名" 或者 列的序号 1);
int min_salary = resultSet.getInt( "列名" 或者 列的序号 2);
...
}
- 释放资源
- 先开后关原则
rs.close();//处理结果集时
statement.close();
conn.close();
常见错误
- java.lang.ClassNotFoundException:找不到类(类名书写错误、没有导入jar包)
- java.sql.SQLexception:与sql语句相关的错误
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknow column:列值string类型没有加单引号
- Duplicate entry ‘1’ for key ‘PRIMARY’ 原因,主键值已经存在或者混乱,更改主键值或清空表
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknown column ‘password’ in 可能输入的值的类型不对
SQL注入问题
- 用户输入的数据中有SQL关键字或语法并且参与了SQL语句的编译,导致SQL语句编译后的条件含义为true,一直到得正确的结果,这种现象称为SQL注入
- PreparedStatement
- 继承Statement接口,预编译SQL语句,安全,避免SQL注入
PreparedStatement pstmt = conn.prepareStatement( "select * from user where username =? and password =?" );
pstmt.setString(1,username);
pstmt.setString(2,password);
int result = pstmt.executeUpdate();//DML语句
ResultSet rs = pstmt.executeQuery();//DQL语句
while(rs.next()){
int pid = rs.getInt("列名");
String name = rs.getString("name");
...
}
Date工具类
/**
* 日期转换
* 字符串转UtilDate
* UtilDate转SqlDate
* UtilDate转成字符串
*/
public class DateUtils {
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//字符串转Util
public static java.util.Date strToUtilDate(String str){
try {
return simpleDateFormat.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
//Util转sql
public static java.sql.Date utilToSql(java.util.Date date){
return new java.sql.Date(date.getTime());
}
//Util转字符串
public static String toStr(java.util.Date bornDate){
return simpleDateFormat.format(bornDate);
}
}
Druid连接池
- 使用步骤
- 创建db.properties配置文件
- 引入druid-1.1.5.jar文件
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mydql://localhost:3306/school
username=root
password=root
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位
maxWait=5000
事物
在JDBC中,获得Connection对象开始事物–提交或回滚–关闭连接。其事物策略是
- conn.setAutoCommit(false);
- conn.commit();
- conn.rollback();
DbUtils
public class DbUtils {
private static DruidDataSource ds;
ThreadLocal<Connection> t1 = new ThreadLocal<Connection>();
static{
Properties properties=new Properties();
try {
properties.load(DbUtils.class.getResourceAsStream("database.properties"));
ds = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn=t1.get();
if (conn == null){
conn = ds.getConnection();
t1.set(conn);
}
return conn;
}
public static void closeAll(ResultSet rs, Statement st,Connection conn){
try{
if (rs != null){
rs.close();
}
if (st != null){
st.close();
}
if (conn != null){
conn.close();
t1.remove();
}
}catch (SQLException e){
e.printStackTrace();
}
}
//开启事务
public static void begin(){
Connection conn=getConnection();
try{
conn.setAutoCommit(false);
}catch (SQLException e){
e.printStackTrace();
}
}
//提交事务
public static void commit(){
Connection conn=getConnection();
try{
conn.commit();
}catch (SQLException e){
e.printStackTrace();
}finally {
DbUtils.closeAll(null,null,conn);
}
}
//回滚事务
public static void rollback(){
Connection conn=getConnection();
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DbUtils.closeAll(null,null,conn);
}
}
}
DaoUtils
public class DaoUtils {
public int commonsUpdate(String sql,Object...args){
Connection conn=null;
PreparedStatement pstmt=null;
try {
conn=DbUtils.getConnection();
pstmt=conn.prepareStatement(sql);
for (int i=0;i< args.length;i++){
pstmt.setObject(i+1,args[i]);
}
return pstmt.executeUpdate();
}catch (SQLException e){
e.printStackTrace();
}finally {
DbUtils.closeAll(null,pstmt,conn);
}
return 0;
}
public List<T> commonsSelect(String sql, RowMapper<t> rowMapper,Object...args){
List<T> elements=new ArrayList<T>();
Connection conn=null;
PreparedStatement pstmt =null;
ResultSet rs=null;
try {
conn=DbUtils.getConnection();
pstmt = conn.prepareStatement(sql);
if (args != null){
for (int i=0;i< args.length;i++){
pstmt.setObject(i+1,args[i]);
}
}
rs=pstmt.executeQuery();
while (rs.next()){
T t=rowMapper.getRow(rs);
elements.add(t);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DbUtils.closeAll(rs,pstmt,conn);
}
return elements;
}
}