JDBC:

Java DataBase Connectivity Java 数据库连接, Java语言操作数据库

快速入门

		1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
			1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
			2.右键-->Add As Library
		2. 注册驱动
		3. 获取数据库连接对象 Connection
		4. 定义sql
		5. 获取执行sql语句的对象 Statement
		6. 执行sql,接受返回结果
		7. 处理结果
		8. 释放资源
		
* 代码实现:
	  	//1. 导入驱动jar包
        //2.注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
        //4.定义sql语句
        String sql = "update account set balance = 500 where id = 1";
        //5.获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //6.执行sql
        int count = stmt.executeUpdate(sql);
        //7.处理结果
        System.out.println(count);
        //8.释放资源
        stmt.close();
        conn.close();

DriverManager:驱动管理对象

		* 功能:
		1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
		static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。 
		写代码使用:  Class.forName("com.mysql.jdbc.Driver");
		2.获取数据库连接:
* 方法:static Connection getConnection(String url, String user, String password) 
	* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
	* 例子:jdbc:mysql://localhost:3306/db3
	* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:				jdbc:mysql:///数据库名称

Connection:数据库连接对象

	1. 获取执行sql 的对象
		* Statement createStatement()
		* PreparedStatement prepareStatement(String sql)  
	2. 管理事务:
		* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
		* 提交事务:commit() 
		* 回滚事务:rollback() 

Statement:执行sql的对象

执行sql
	1. boolean execute(String sql) :可以执行任意的sql 了解 
	2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句

返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。

	3. ResultSet executeQuery(String sql)  :执行DQL(select)语句	

ResultSet:结果集对象,封装查询结果

	* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
	* getXxx(参数):获取数据
		* Xxx:代表数据类型   如: int getInt() ,	String getString()
		* 参数:
			1. int:代表列的编号,1开始   如: getString(1)
			2. String:代表列名称。 如: getDouble("balance")
	* 注意:
		* 使用步骤:
			1. 游标向下移动一行
			2. 判断是否有数据
			3. 获取数据
			  //循环判断游标是否是最后一行末尾。
	            while(rs.next()){
	                //获取数据
	                //6.2 获取数据
	                int id = rs.getInt(1);
	                String name = rs.getString("name");
	                double balance = rs.getDouble(3);
	                System.out.println(id + "---" + name + "---" + balance);
	            }

PreparedStatement:执行sql的对象

执行sql的对象
1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
	1. 输入用户随便,输入密码:a' or 'a' = 'a
	2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 
2. 解决sql注入问题:使用PreparedStatement对象来解决
3. 预编译的SQL:参数使用?作为占位符
4. 步骤:1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
		2. 注册驱动
		3. 获取数据库连接对象 Connection
		4. 定义sql
	* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
		5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
		6. 给?赋值:
		SetString/SetInt/SetDouble(参数1,参数2)
			* 方法: setXxx(参数1,参数2)
				* 参数1:?的位置编号 从1 开始
				* 参数2:?的值
			7. 执行sql,接受返回结果,不需要传递sql语句
			8. 处理结果
			9. 释放资源
5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
			1. 可以防止SQL注入
			2. 效率更高
			
			
案例

见例:E:\idea_Projects\javaSE_web\day01\src\Demo03

public static Boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }
        Connection conn = null;
        PreparedStatement pstate = null;
        ResultSet rs =null;
        try {
            conn = JDBCUtils.getConnection();
            //定义sql语句
            String sql = "select * from user where username = ? and password = ?";
            //获取执行sql的对象
            pstate = conn.prepareStatement(sql);
            //给 ? 赋值
            pstate.setString(1,username);
            pstate.setString(2,password);

            rs = pstate.executeQuery();

            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,conn,pstate);
        }
        return false;
    }

抽取JDBC工具类 : JDBCUtils

		* 解决:配置文件
			jdbc.properties
				url=
				user=
				password=

jdbc工具类

见例:E:\idea_Projects\javaSE_web\day01\src\utils

package utils;

import java.io.IOException;
import java.sql.*;
import java.util.Properties;
//标准格式
//jdbc工具类
public class ju {
    private static String url;
    private static String username;
    private static String password;
    private static String driver;

    //读取配置文件
    static {
        try {
            Properties prop = new Properties();
            prop.load(ju.class.getClassLoader().getResourceAsStream("jdbc.properties"));
            url = prop.getProperty("url");
            username = prop.getProperty("username");
            password = prop.getProperty("password");
            driver = prop.getProperty("driver");
            //注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

    //获取Connection连接对象
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

    //释放资源
    public static void close(ResultSet resultSet,
                             Connection connection,
                             Statement statement) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        close(connection, statement);
    }

    //重载
    public static void close(Connection connection,
                             Statement statement) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

数据库连接池

1. 概念:其实就是一个容器(集合),存放数据库连接的容器。
	    当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

2. 好处:
	1. 节约资源
	2. 用户访问高效
C3P0:数据库连接池技术
* ##### 步骤:
	
1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
		
	不要忘记导入数据库驱动jar包
	
2. 定义配置文件:

    名称: c3p0.properties 或者 c3p0-config.xml

    路径:直接将文件放在src目录下即可。

3. 创建核心对象 数据库连接池对象 ComboPooledDataSource

4. 获取连接: getConnection
public class c3p0Demo01 {
    public static void main(String[] args) throws SQLException {
        //创建数据库连接
        DataSource ds = new ComboPooledDataSource();
        //获取连接对象
        Connection conn = ds.getConnection();
        System.out.println(conn);
    }
}
Druid:数据库连接池实现技术
  • 步骤:
  1. 导入jar包 druid-1.0.9.jar
  2. 定义配置文件:

是properties形式的

可以叫任意名称,可以放在任意目录下

  1. 加载配置文件。Properties
  2. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
  3. 获取连接:getConnection
public class druidDemo {
    public static void main(String[] args) throws Exception {
        Properties pro = new Properties();
        //加载配置文件
        pro.load(druidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
        //获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);
    }
}
Druid:数据库连接池 抽取Utils工具类
  1. 定义一个类 JDBCUtils

  2. 提供静态代码块加载配置文件,初始化连接池对象

  3. 提供方法

  4. 获取连接方法:通过数据库连接池获取连接

  5. 释放资源

  6. 获取连接池的方法

    见E:\idea_Projects\javaSE_web\day05_dataSource_jdbcTemplate\src\cn\itcast\datascoure\utils

    public class JDBCUtils {
        private static DataSource dataSource;
    
        static {
            try {
                Properties properties = new Properties();
                properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                dataSource = DruidDataSourceFactory.createDataSource(properties);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //获取Connection连接的方法
        public static Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
    
    
        //关闭资源方法
        public static void close(Connection connection, Statement statement) {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
        //关闭方法(ResultSet)重载
        public static void close(ResultSet resultSet, Connection connection, Statement statement) {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            close(connection, statement);
        }
    
        //获取连接池对象
        public static DataSource getDataSource() {
            return dataSource;
        }
    }
    

Spring JDBC

步骤
* 步骤:
	1. 导入jar包
	2. 创建JdbcTemplate对象。依赖于数据源DataSource
		* JdbcTemplate template = new JdbcTemplate(ds);
	3. 调用JdbcTemplate的方法来完成CRUD的操作

5个方法

update

* update():执行DML语句。增、删、改语句
例:
  	String updatesql="update account set banalan = ? where id =?"
//参数1:要执行的SQL语句
//参数2:是一个可变参数,参数的位置和?的位置一一对应,并数据类型也对相应
		template.update(updatesql,5000,3);
	update方法执行DML语句,返回值时int
	使用jdbcTemplate无需手动释放资源,jdbcTemplate帮我们进行资源释放

例:

public class jdbcTemplateDemo01 {
    public static void main(String[] args) {
        //导包
        //创建jdbcTemplate对象
        JdbcTemplate template= new JdbcTemplate(JDBCUtils.getDataSource());
        //调用方法
        String updateSql = "update emp set salary = ? where id = ?";
        int update = template.update(updateSql, 555,1001);
        System.out.println(update);
    }
}

queryForMap

* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
		* 注意:这个方法查询的结果集长度只能是1
	例:
	public void test4() {
        //定义查询语句
        String sql = "select * from emp where id = ?";
        Map<String, Object> queryForMap = template.queryForMap(sql, 1001);
        System.out.println(queryForMap);
    }

queryForList

* queryForList():查询结果将结果集封装为list集合
	* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
	例:
 	public void test5() {
 		String sql = "select * from emp";
		List<Map<String, Object>> queryForList = template.queryForList(sql);
		for (Map<String, Object> map : queryForList) {
			System.out.println(map);
		}
    }
重点
queryForMap一次只能查询一条数据,将这一条数据封装到Map中
queryForList能够查询到多条数据,将多条数据每一条都封装为一个Map,然后将这个Map封装到List集合中

query

* query():查询结果,将结果封装为JavaBean对象
	* query(参数1,参数2):
	参数1:要执行的SQL语句
	参数2:RowMapper
	  使用匿名内部类实现
	  		ResultSet转换为我们需要的JavaBean
		* 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
		* new BeanPropertyRowMapper<类型>(类型.class)
    例:
    public void test6() {
		String sql = "select * from account";
		List<Emp> empList = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
        for (Emp emp : empList) {
            System.out.println(emp);
        }
    }

queryForObject

* queryForObject:查询结果,将结果封装为对象
		* 一般用于聚合函数的查询
    例:
    public void test7() {
        String sql = "select count(id) from emp";
        Integer i = template.queryForObject(sql, Integer.class);
        System.out.println(i);
    }
Logo

更多推荐