您的位置:首页 > 其它

JDBC(3)

2015-11-12 18:12 429 查看
Statement主要执行静态sql语句,

即内容固定内容不变的sql语句

oracle数据库会重用

preparedStatement是接口,继承自Statement

参数用问号

conn.createStatement(type,concurrency);

conn.createStatement(type,ResultSet.concurrency);

可滚动结果集导致较多的io操作,不推荐。

推荐把结果集放在list中,在内存中操作后,

然后可一次性更新数据库

JDBC默认自动提交事务:

每执行一条DML操作,就会提交事务

事务特性ACID:

1:原子性:要么都执行,要么都不执行

2:一致性

3:隔离性

4:持久性

批处理用于DML操作(插入,更新等)

不执行select语句,因为select语句返回结果不一样

MySql分页:

select * from t limit begin,pageSize;

begin:第几条开始

pageSize每页多少条

DAO date access object数据访问对象

DAO操作的目的就是让我们操作数据库变得面向对象化(hibernate的精髓)

DAO是属于数据持久层,处于业务层跟数据库之间

好的程序都是面向接口

public class Test {

public static void main(String[] args) {

//List list = new ArrayList();

List list = ApplicationContext.getBean(“list”);

}


}
ORM对象关系映射

object /relation mapping

–表和类对应

–表字段跟属性对应

create sequence user_seq_ls start with 1000;

create sequence dept_seq_ls start with 60;

commit;

alter table user_ls add(deptno number(2));

desc dept_ls;

insert into dept_ls values(dept_seq_ls.nextval

,’IT’,’beijing’);

select MAX(deptno) from dept_ls;

insert into user_ls values (

user_seq_ls.nextval,

‘boss’,’123456’,5000,’boss.qq.com’,

dept_seq_ls.currval

);

select * from dept_ls;

select * from user_ls;

select * from emp_ls order by empno;

select * from dept_ls order by deptno;

desc user_ls;

#config.properties文件
driver=oracle.jdbc.driver.OracleDriver
#
url=jdbc:oracle:thin:@localhost:1521:xe
#
user=system
#
psw=zaq12wsx
initsize=1
maxactive=5
maxwait=2000
minidle=1
maxidle=2


DBUtil2 :此类经常使用

package day20151100;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;

/*
* 使用连接池技术管理数据库连接
*/
public class DBUtil2 {
//连接池
private static BasicDataSource ds;
//为不同线程管理连接
private static ThreadLocal<Connection> tl;

static{
try{
// 读取配置文件
Properties prop = new Properties();
// 此处默认src为当前目录,适合tomcat,推荐使用
InputStream is = DBUtil2.class.getClassLoader()
.getResourceAsStream("day20151100/config.properties");

prop.load(is);
is.close();
//初始化连接池
ds= new BasicDataSource();
//设置驱动(Class.forName())
ds.setDriverClassName(prop.getProperty("driver"));
//设置url
ds.setUrl(prop.getProperty("url"));
//设置数据库用户名
ds.setUsername(prop.getProperty("user"));
//设置数据库密码
ds.setPassword(prop.getProperty("psw"));
//设置初始连接数
ds.setInitialSize(Integer.parseInt(prop.getProperty("initsize")));
//设置连接池最大连接数
ds.setMaxActive(Integer.parseInt(prop.getProperty("maxactive")));
//设置最大等待时间
ds.setMaxWait(Integer.parseInt(prop.getProperty("maxwait")));
//设置最小空闲线程数
ds.setMinIdle(Integer.parseInt(prop.getProperty("minidle")));
//设置最大空闲线程数
ds.setMaxIdle(
Integer.parseInt(
prop.getProperty("maxidle")));

//初始化线程本地
tl = new ThreadLocal<Connection>();

}catch(Exception e){
e.printStackTrace();
}}public static Connection getConnection() throws SQLException{
Connection conn = ds.getConnection();
tl.set(conn);
return conn;
}//关闭数据库连接
public static void closeConnection(){
try{
Connection conn = tl.get();
if(conn != null){
/*
* 恢复连接为自动提交事务
*
* (在userService类的转账操作方法中
* 改成不自动提交事务了,这里在连接池恢复自动提交)
*/
conn.setAutoCommit(true);
/*
* 通过连接池获取的Connection
* 的close方法实际上兵灭有将连接关闭,
* 而是将该连接归还
*/
conn.close();
tl.remove();
}}catch(Exception e){
e.printStackTrace();
}
}
}


package day20151109;

import java.sql.Connection;
import java.sql.Statement;

import day20151100.DBUtil2;

public class JDBCDemo1 {
/**
* 使用statement执行DML操作(DML:增删改)
* @param args
*/
public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
Statement state = conn.createStatement();
String sql = "insert into emp(empno,ename,job,sal,deptno) "
+ "values(8000,'jack','manager',5000,30)";
System.out.println(sql);
if(state.executeUpdate(sql)>0){
System.out.println("插入成功");

}else{
System.out.println("插入失败");
}state.close();
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}}
}


package day20151109;

import java.sql.Connection;
import java.sql.Statement;

import day20151100.DBUtil2;

public class JDBCDemo2 {
/**
* 修改记录
* @param args
*/
public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
Statement state = conn.createStatement();
String sql = "update emp set ename ='rose' "
+ "where empno=8000";
if(state.executeUpdate(sql)>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}state.close();
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}}
}


package day20151109;

import java.sql.Connection;
import java.sql.Statement;

import day20151100.DBUtil2;

public class JDBCDemo3 {
/**
* 删除工号为8000的员工
* @param args
*/
public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
Statement state = conn.createStatement();
String sql = "delete from emp "
+ "where empno=8000";
if(state.executeUpdate(sql)>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}state.close();
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}}
}


package day20151109;

import java.sql.Connection;
import java.sql.Statement;

import day20151100.DBUtil2;
/**
* 创建表
*
*/
public class JDBCDemo4 {

public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
Statement state = conn.createStatement();
String sql = "create table user_ls( " +
" id number(4)," +
" name varchar2(30)," +
" password varchar2(30)," +
" money number(6)," +
" email varchar(60))";
/*
* 使用excute(String sql)执行DDL
* excute方法可以执行任何sql语句
* 返回值为true:说明执行的是查询语句
* 并返回了结果集
* 通常使用它来执行DDL
*
* 有结果集返回true
* 没有结果集返货false
* 所以无论返回true或false都执行成功
* 如果执行失败会出错
*
* (DDL:用于建立、修改、删除数据库对象
* Create、alter、drop、truncate)
*/
if(!state.execute(sql)){
System.out.println("表创建成功");
}state.close();

}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}}
}


package day20151109;

import java.sql.Connection;
import java.sql.PreparedStatement;

import day20151100.DBUtil2;

/**
* 使用预编译sql提高执行效率
*
*/
public class JDBCDemo5 {
public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
//Statement state = conn.createStatement();
/*
* 密码不变都用123456
* 使用问号作为参数:批量插入效率高
*
* 如果sql固定不变,可以使用Statement,
* oracle数据库会重用执行计划.
*
* 如果sql纵使变,oracle数据库总是会创建新的执行计划,消耗资源
*
* 以下参数会变的sql,最好使用PreparedStatement
* 数据库也会重用执行计划
*
* PreparedStatement的另一好处是可以防止注入式入侵
*/
String sql = "insert into user_ls " +
"values(?,?,'123456',?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
long start = System.currentTimeMillis();
for(int i=2000;i<3000;i++){//耗时:1528
ps.setInt(1, i);
ps.setString(2, "test"+i);
ps.setInt(3, 5000);
ps.setString(4, "test"+i+"@qq.com");
ps.executeUpdate();
}
// for(int i=1000;i<2000;i++){//耗时:3249
// String sql0 = "insert into user_ls " +
// "values("+i+",'test"+i+"','12345'," +
// "50000,'test"+i+"@qq.com')";
// state.executeUpdate(sql0);
// }System.out.println("插入数据完毕");
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));

}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}
}
}


package day20151109;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import day20151100.DBUtil2;

public class JDBCDemo6 {

public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
Statement state = conn.createStatement();
String sql = "select empno,ename,sal,deptno from emp";
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
//数据库里都是从1开始
/*
* 不推荐,可读性差
*/
int empno = rs.getInt(1);
String ename = rs.getString(2);
int sal = rs.getInt(3);
int deptno = rs.getInt(4);
System.out.println(empno+","+ename+","+sal+","+deptno);
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}
}
}


package day20151109;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import day20151100.DBUtil2;

/**
* 取得结果集中的元数据
*/
public class JDBCDemo7 {
public static void main(String[] args) {
try{
Connection conn = DBUtil2.getConnection();
Statement state = conn.createStatement();
String sql = "select * from emp";
ResultSet rs = state.executeQuery(sql);

/*
* 元数据在结果集中
* 可通过结果集获取元数据
*/
ResultSetMetaData rsm = rs.getMetaData();
/*
* 获取结果集中列的总数
*/
int columnCount = rsm.getColumnCount();
for(int i=1;i<=columnCount;i++){
String colName=rsm.getColumnName(i);
System.out.println(colName);

}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}}}


package day20151109;

import java.util.UUID;

/**
* UUID:java自动生成ID
*/
public class Test {

public static void main(String[] args) {
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
//6e03b5aa-ef1a-4d05-8b3c-698c2ecbd505
//da1655ee-65d8-4c2d-832b-a6e8050ec57d
}
}


package day20151109;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

import day20151100.DBUtil2;

/**
* 与用户相关的业务逻辑
*/
public class UserService {

public static void main(String[] args) {
/*
* 程序启动后: 选择1、2、3、4等操作 1:注册新用户 2:更改用户信息 3:删除用户信息 4:查询用户信息
*/
System.out.println("请输入选项:");
System.out.println("1:注册");
System.out.println("2:登陆");
System.out.println("3:修改");
System.out.println("4:删除");
System.out.println("5:查询");
Scanner sc = new Scanner(System.in);
int option = Integer.parseInt(sc.nextLine().trim());
switch (option) {
case 1:
// 注册
regUser(sc);
break;
case 2:
login(sc);
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
}
/**
* 注册操作
*
* @param sc
*/
public static void regUser(Scanner sc) {
/*
* 若是注册:
* 1:获取用户输入的信息
* 2:获取连接
* 3:获取statement
* 4:先获取id的最大值
* 5:对该值+1,作为当前记录的主键值
* 6:插入记录
* 7:关闭连接
*/
try {
// 1
System.out.println("现在是注册操作:");
System.out.println("请输入用户名:");
String user = sc.nextLine().trim();
System.out.println("请输入密码:");
String pwd = sc.nextLine().trim();
System.out.println("momey:");
String money = sc.nextLine().trim();
System.out.println("mail:");
String email = sc.nextLine().trim();
// 2
Connection conn = DBUtil2.getConnection();
// 3
Statement state = conn.createStatement();
// 4 对id取别名
String sql = "select MAX(id) id from user_ls";
// 5
ResultSet rs = state.executeQuery(sql);
int id = -1;
if (rs.next()) {
id = rs.getInt("id");
}System.out.println("当前id最大值:" + id);
//统计后对id加1
id++;
rs.close();
//6
/*
* insert into user_ls
* values(1,'jack','1234',5000,'jack@qq.com')
*/
sql="insert into user_ls "
+ "values("+id+",'"+user+"','"+pwd+"',"+money+",'"+email+"')";
System.out.println(sql);
if(state.executeUpdate(sql)>0){
System.out.println("注册成功,欢迎你:"+user);
}else{
System.out.println("呵呵");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil2.closeConnection();
}}/**
* 登录
*/
public static void login(Scanner sc){
/*
* 1:要求输入用户名密码
* 2:去表中查
* 3:查到,对的
*/
System.out.println("现在是登陆操作:");
System.out.println("输入用户名:");
String user = sc.nextLine().trim();
System.out.println("pwd:");
String pwd = sc.nextLine().trim();
try{
Connection conn = DBUtil2.getConnection();
/*
* Statement的不安全因素:
* 假设用户名任意,密码:a' OR '1'='1
* select * from user_ls
* where LOWER(name)=LOWER('wewq')
* and password = 'a' OR '1'='1'
* 可以登陆成功
*/
//Statement state = conn.createStatement();
//String sql = "select * from user_ls " +
// "where LOWER(name)=LOWER('"+user+"') and password = '"+pwd+"'";
String sql = "select * from user_ls where " +
"name=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, pwd);
ResultSet rs = ps.executeQuery();
//ResultSet rs = state.executeQuery(sql);
//根据用户输入能否查到数据
if(rs.next()){
System.out.println("登录成功");
}else{
System.out.println("用户名或密码错误");
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil2.closeConnection();
}}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: