mysql-jdbc

前言------  经过了两天的整理,终于把jdbc连接数据库的知识整理完了,继续加油!

JDBC

jdbc:java database connectivity java 数据库连接池

为什么使用jdbc:

       jdbc是SUN公司提供的一种访问数据库的一种规范,因为数据库的种类非常的多,并且java语言使用非常的广泛,所                    以 就出现了jdbc,sun公司要求其他数据库公司都去实现jdbc的底层的访问规则,而我们java程序员只需要sun公司提                    供的jdbc驱动就可以。

使用JDBC

1、注册驱动

//为防止二次驱动不这样写     
//DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");

2、完成数据库的链接

  conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/hou","root","123456");

3、创建Statement对象,与数据库打交道    

 st = conn.createStatement();

4、执行写入的sql语句,返回ResultSet结果集

  String sql = "select * from student"; 

      rs = st.executeQuery(sql);

5、遍历结果集

while (rs.next()) { 

              int id = rs.getInt("id"); 

              String name = rs.getString("name");

              int age = rs.getInt("age"); 

              System.out.println(id+" "+name+" "+age);

       }

6、释放资源

if (rs != null) {
        try {
            rs.close();
        } catch (SQLException sqlEx) { } // ignore 
        rs = null;
    }

构建Util工具类:

1、释放资源

//关闭资源,向外提供一个公共的方法
    public static void closeResource(Connection conn ,Statement st , ResultSet rs){
        closeRs(rs);
        closeStatement(st);
        closeConnection(conn);
    }

    //关闭ResultSet
    private static void closeRs(ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //关闭Statement
    private static void closeStatement(Statement st){
        try {
            if(st != null){
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    //关闭Connection
    private static void closeConnection(Connection conn){
        try {
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

2、防止二次注册驱动


Class.forName("com.mysql.jdbc.Driver");
//当类加载的时候就静态的执行了静态代码块,DriverManager.registerDriver(new Driver());

   Driver类中的static静态代码块中有注册驱动的,当类加载的时候,就给注册了驱动,所以为防止二次驱动,写以下代码                即可

Class.forName("com.mysql.jdbc.Driver");

3、使用文件名.properties配置文件

        建立Properties类,放在static代码块中

Properties pro = new properties();

         读取properties配置文件,当文件在src目录下时候使用,当类加载时候,会把properties文件一块加载

InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");

         加载properties文件

pro.load(is);

         读取properties文件中的属性

pro.getProperty("属性名");
static {
        try {
            Properties properties = new Properties();
            //当文件位于项目工程根目录底下的时候,写相对路径,
            //参照物为:D:\idea\idea_project\javahou
            //InputStream is = new FileInputStream("mysql-all/jdbc.properties");
            //当文件位于src目录底下的时候
            InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
            properties.load(is);
            driverClass = properties.getProperty("driverClass");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            System.out.println(driverClass+"   "+url +"   "+username+"   "+password);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

数据库的CRUD sql

增加

 public static void textInsert(){
        try {
            //连接数据库
            Connection conn = JDBCUtil.getConn();
            //创建Statement
            Statement st = conn.createStatement();
            //执行查询语句返回ResultSet结果集
            String sql = "insert into student values(6,'哈哈',15)";
            int row = st.executeUpdate(sql);
            if(row > 0){
                System.out.println(row+"插入成功");
            }else{
                System.out.println(row+"插入失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

删除

public static void textDelete(){
        try {
            //连接数据库
            Connection conn = JDBCUtil.getConn();
            //创建Statement
            Statement st = conn.createStatement();
            //执行查询语句返回ResultSet结果集
            String sql = "delete from student where id = 5 or id = 6";
            int row = st.executeUpdate(sql);
            if(row > 0){
                System.out.println(row+"删除成功");
            }else{
                System.out.println(row+"删除失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

public static void textUpdate(){
        try {
            //连接数据库
            Connection conn = JDBCUtil.getConn();
            //创建Statement
            Statement st = conn.createStatement();
            //执行查询语句返回ResultSet结果集
            String sql = "update student set age=23 where name = 'zhangsan'";
            int row = st.executeUpdate(sql);
            if(row > 0){
                System.out.println(row+"更新成功");
            }else{
                System.out.println(row+"更新失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

public static void textQuery(){
        try {
            //连接数据库
            Connection conn = JDBCUtil.getConn();
            //创建Statement
            Statement st = conn.createStatement();
            //执行查询语句返回ResultSet结果集
            String sql = "select * from student";
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String  age = rs.getString("age");
                System.out.println(id+"   "+"   "+name+"  "+age );
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Dao模式

Dao层实现业务的逻辑

implDao层实现具体的业务

text层进行测试

util层是各种工具,比如连接数据库等

1、新建一个dao接口,里面生命数据库的访问规则,比如增删改查

/**
     * 执行添加
     * @param userName
     * @param password
     */
    void insert(int id,String userName , int age);

2、新建一个dao的实现类,具体实现在dao接口中定义的规则

@Override
    public void insert(int id,String userName, int age) {
        try {
            //连接数据库
            Connection conn = JDBCUtil.getConn();
            //创建Statement
            Statement st = conn.createStatement();
            //执行查询语句返回ResultSet结果集
            String sql = "insert into student values("+id+",'"+userName+"',"+age+")";
            int row = st.executeUpdate(sql);
            if(row > 0){
                System.out.println(row +"插入成功");
            }else{
                System.out.println(row+"插入失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

3、在text里面直接使用

 public static void textInsert(){
        UserDaoImpl d = new UserDaoImpl();
        d.insert(4,"haha",24);
    }

PrepareStatement对象的使用

             Statement安全问题

             Statement执行 ,其实是拼接sql语句的。 先拼接sql语句,然后在一起执行。

String sql = "select * from t_user where username='"+ username  +"' and password='"+ password +"'";

	UserDao dao = new UserDaoImpl();
	dao.login("admin", "100234khsdf88' or '1=1");

	SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1' 

	/*前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。 */
	rs = st.executeQuery(sql);

PreporeStatement 

相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递              进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。

 比如:String sql = "insert into student values(?,?,?);"

String sql = "insert into student valiues(?,?,?)";
//预先对sql语句执行语法的校验, ? 对应的内容,后面不管传递什么进来,都把它看成是字符串。 or select 
PreparedStatement ps = conn.preporeStatement(sql);

 //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
ps.setString(1,username);
pa.setString(2,password);

//执行sql语句
ps.execQuery();

idea使用junit单元测试的配置

https://blog.csdn.net/u010569419/article/details/87539995

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值