JDBC(3)

3 篇文章 0 订阅

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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值