JDBC相关

痴心易碎 提交于 2019-12-29 22:34:46

在一个Java空工程下,可以创建多个模块
创建新模块步骤:Project Structure -> Modules -> + -> New Module
此时可以选择:
            Java(表示创建一个纯Java模块,不涉及任何外部东西)
            Java Enterprise -> Web Application (Java Web用)
            Maven 
每个完整的模块应包含4个包:
    src:存放项目源代码(entity,common,config,utils,controller,services,dao)
    [以下三个包建好后右击:Mark Directory as...]
    resources:存放外部配置文件 
    test:存放测试代码
    testresources:存放测试配置文件
            
使用第三方工具的基本步骤:导包-> 写配置文件 -> 写测试代码

localhost = 127.0.0.1

使用JDBC(Java Database Connectivity)[Java中用来规范客户端程序如何访问DB的API]连接数据库步骤:
    1、创建新模块(可选)
    2、将mysql的jar包放入选定模块下的某个包中
    3、将该jar文件与选定模块相关联:Project Structure -> Libraries -> +
       java -> 找到该jar文件并与选定模块关联
    4、JDBC具体使用步骤(思路):
       (1)注册驱动:
              原生注册方式:DriverManager.registerDriver(new Driver());
              Class.forName("com.mysql.jdbc.Driver");
       (2)建立连接:DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名","用户名","密码");
       (3)创建对象:Statement st=con.createStatement(); [该方式有sql安全注入问题]
                    PreparedStatement ps=con.prepareStatement(""); [sql语句中使用占位符?,通过调用对象的set()方法向sql语句中的占位符赋值]
            PreparedStatement相对于Statement的优点:
                    没有SQL注入的问题。
                    Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
                    数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。 
       (4)执行sql语句:
                    查询:st.executeQuery("select * from student");
                    增、删、改:st.executeUpdate("");
       (5)处理结果:ResultSet中的方法使用
       (6)关闭资源:从内向外关闭,不用一定要关闭
    
    构建工具类使得数据库连接更加便捷:
        1、创建工具类
        2、私有化构造方法
        3、私有化连接参数:URL、用户名、密码
        4、静态代码块加载驱动
        5、对外提供静态公共方法获取连接对象
        5、对外提供静态公共方法释放资源(内->外)[方法重载(只有查询才有结果集对象),关闭前要先判断是否为空]
    注:将可能发生更改的驱动名,URL,用户名,密码放入外部的配置文件中(.properties)
        静态代码块中以流的形式加载配置文件,获取相应值:
            Properties p=new Properties();
            InputStream in=工具类.class.getClassLoader().getResourceAsStream(".properties");
            p.load(in); //以流的形式加载
            String driveClass=p.getProperty("driveClass"); //获取相应值
            Class.forName(dirveClass);
            ....
    
    连接池的出现(简化连接过程,提高连接效率):
        使用自定义连接池:
            创建连接池类(实现javax.sql.DataSource接口) -> 创建List容器 -> 生成一定数量连接对象存入容器 
            -> 对外提供使用连接的方法 -> 对外提供归还连接的方法
        注:每次向用户返回连接对象时要判断连接池中是否还存在对象,不存在则生成一定数量对象存入连接池
            
        使用第三方开源连接池C3P0:
            创建Web模块,除了建立resources,test,testresources包之外,额外在web包下建立名为lib的子包存放jar文件
            在配置文件中修改驱动名称,URL,用户名,密码信息
            ComboPooledDataSource dataSoure=new ComboPooledDataSource(); //创建连接池
            Connection con=dataSoure.getConnection();  //从连接池中获得一个连接对象
            
    DBUtils的出现(简化增删改查操作):
        只需导入jar包,不需要创建配置文件
        DBUtils只能帮助我们简化CRUD的代码,但是连接的创建以及获取工作不在它的考虑范围
        步骤:
            1、使用数据库连接池创建DBUtils核心类对象:
               QueryRunner qr=new QueryRunner(new ComboPooledDataSource());
            2、增删改:
               qr.update("sql语句",占位符对应的值);  //因为存在占位符?,所以顶层使用了PreparedStatment
                  查询:
                   1、new接口的匿名实现类:
                        Student ss =  qr.query("select * from account where id = ?", new ResultSetHandler<Student>(){
                        @Override
                        public Student handle(ResultSet rs) throws SQLException {
                            Student account  =  new Student ();
                            while(rs.next()){
                                String name = rs.getString("name");
                                int money = rs.getInt("money");
                                account.setName(name);
                                account.setMoney(money);
                            }
                            return account;
                        }
                     }, 6);
                   2、直接使用已经实现的类:
                      * 查询单个对象
                        Student ss = qr.query("select * from account where id = ?", new BeanHandler<Student >(Student .class), 8);    
                      * 查询多个对象
                        List<Student> list = qr.query("select * from account ",new BeanListHandler<Student>(Student.class));
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
    
    
    
    
    
    
    
    
    
    

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!