JAVA_JDBC_概念与快速入门

概念

概念: Java DataBase Connectivity //java语言操作数据库

本质: 其实是(sun公司)定义的一套操作所有关系型数据库的规则,各个数据库厂商实现对应的接口,提供jar包。
我们可以使用这套接口编程,真正执行代码的是驱动jar包中的实现类

在这里插入图片描述

快速入门

//1.导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
//	1.复制jar包到项目libs目录下
//	2.右键-->Add As Library
//2.注册驱动 mysql5之后的jar包可以省略注册驱动的代码
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","123");
//4.定义sql
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql接收返回结果
int count stmt.executeStatement(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");
	通过查看源码发现:com.mysql.jdbc.Driver中存在静态代码块
	static {
		try{
			java.sql.DriverManager.registerDriver(new Driver());
		}catch (SQLException E){
			throw new RuntimeException("Can't register driver!");
		}
	}
	
2.获取数据库连接:
	Connection conn = DriverManager.getConnection(String url,String user,String password);
	url: 指定连接的路径 jdbc:mysql://ip:端口/数据库名称
	user: 用户名
	password: 密码
Connection: 数据库连接对象
1.获取执行sql的对象:
	Statement createStatement()
	PreparedStatement preparedStatement(String sql)
2.管理事务:
	开启事务: void setAutoCommit(boolean autoCommit) //设置参数false就是开启事务
	提交事务: void commit()
	回滚事务: void rollback()
Statement: 执行静态sql的对象
1.执行sql:
	//返回值 是否执行成功
	boolean execute(String sql) //可以执行任意sql语句
	//返回值 影响的行数 可以以此是否大于0来判断DML语句是否执行成功
	int executeUpdate(String sql) //执行DML(insert/update/delete)语句、DDL(create/alter/drop)语句
	ResultSet executeQuery(String sql) //执行DQL(select)语句
ResultSet: 结果集对象
 1.next() : 游标向下移动一行
 2.getXxx() : 获取数据
 	1.Xxx代表数据类型如: int getInt()
 	2.参数:
 		1.int : 代表列表的编号,从1开始
 		2.String : 代表列的名称
 3.注意:
 	1.游标向下移动一行
 	2.判断是否有数据
 	3.获取数据
 4.伪代码
	 while(rs.next()){
		int id = rs.getInt(1);
		String name = rs.getString("name");
		System.out.println(id+"--"+name);
	 }
PreparedStatement: 执行动态(预编译)sql的对象
1.SQL注入问题:
	1.String sql = "select * from user where uname = '"+name+"' and password = '"+pwd+"'";
	2.此时用户名随便写,密码写 a' or 'a' = 'a 就可以登录
2.预编译sql:sql的参数使用占位符
	1.例如 select * from user where uname = ? and password = ?;
	2.获取sql执行对象: PreparedStatement Connection.prepareStatement(String sql)
	3.?赋值: setXxx(问号位置1开始,)

数据库连接池

0.实现
各个数据库连接池厂商实现 DataSource接口 javax.sql包下
1.获取连接: getConnection()
2.归还连接: 如果Connection是从连接池中获取的,那么调用Connection.close()方法就不会关闭连接,而是归还连接对象
1.C3P0
1.导入jar包: c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
2.在src目录下定义配置文件: c3p0.properties 或 c3p0-config.xml
3.创建数据库连接池对象: ComboPolledDataSource
4.获取连接: getConnection

在这里插入图片描述

//0.记得将包添加到libs
//1.创建连接池
DataSource ds = new ComboPolledDataSource();
//2.获取连接对象
Connection conn = ds.getConnection();
2.Druid(德鲁伊 由阿里巴巴提供)
1.导入jar包: druid-1.0.9.jar
2.定义配置文件: druid.properties
3.获取数据库连接池: DruidDataSourceFactory 

在这里插入图片描述

//加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//获取连接
Connection conn = ds.getConnection();
定义工具类
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Druid连接池的工具类
 */
public class JDBCUtils {

    //1.定义成员变量 DataSource
    private static DataSource ds ;

    static{
        try {
            //1.加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 释放资源
     */
    public static void close(Statement stmt,Connection conn){
       /* if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();//归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }*/

       close(null,stmt,conn);
    }


    public static void close(ResultSet rs , Statement stmt, Connection conn){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();//归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取连接池方法
     */

    public static DataSource getDataSource(){
        return  ds;
    }

}

Spring JDBC

1.导入jar包: 
2.创建JdbcTemplate 依赖于DataSource : JdbcTemplatetmp = new JdbcTemplate(ds);
3.调用JdbcTemplate的方法来完成CRUD操作
	update() : 执行增删改
	queryForMap() : 查询结果将结果封装为map
	queryForList() : 查询结果将结果封装为list
	query() : 查询结果将结果封装为javaBean
	queryForObject() : 查询结果将结果封装为对象
使用方法
//2.
@Test
public void test_queryForMap() {
    JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource());
    Map<String, Object> map = jt.queryForMap("SELECT * FROM emp WHERE id=?", 3);
    System.out.println(map);
}

//3.
@Test
public void test_queryForList() {
    JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource());
    List<Map<String, Object>> list = jt.queryForList("SELECT * FROM emp");
    for (Map<String, Object> map : list) {
        System.out.println(map);
    }
}

//4.
@Test
public void test_queryForObject_RowMapper() {
    JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource());
    emp emp = jt.queryForObject("SELECT * FROM emp WHERE id=?", new BeanPropertyRowMapper<>(emp.class), 3);
    /**
     * 这里rowmapper是一个接口,快捷键Ctrl+H查看选中接口的结构图,使用BeanPropertyRowMapper<>(类名.class)
     */
    System.out.println(emp);
}

//5.
@Test
public void test_queryFor() {
    JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource());
    List<emp> empList = jt.query("SELECT * FROM emp", new BeanPropertyRowMapper<>(emp.class));
    for (emp emp : empList) {
        System.out.println(emp);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值