JDBC详解,看这篇就够了(java复习day12)

一、JDBC基础

1、基础
概念:java语言操作数据库(java 数据库连接)
本质:官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以直接使用这套接口编程,真正执行的代码是驱动jar包中的实现类

	public static void main(String[] args) throws Execption{
		//1、导入驱动jar包	
		//2、注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//3、获取数据库连接对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","password");
		//4、定义sql语句
		String sql = "select * from stu";
		//5、获取执行sql对象 Statement
		Statement stmt = conn.createStatement();
		//6、执行sql语句
		String result = stmt.excuteUpdate(sql);
		//7、处理结果
		System.out.println(result);
		//8、释放资源
		stmt.close();
		conn.close();
	}

2、JDBC类详解
DriverManager:驱动管理对象

	/*
		1、注册驱动:告诉程序该使用哪个数据库驱动jar
		注册给定的驱动程序Drivermanager
		mysql5之后的驱动jar包可以省略注册驱动的步骤
	*/
	
	static void registerDriver(Driver driver)
	//写代码注册,通过源码发现,在com.mysql.jdbc.Driver类中存在静态代码块
	Class.forName("com.mysql.jdbc.Driver");
	
	/*
		2、获取数据库连接
	*/
	static Connection getConnection(String url,String user,String password)

Connection:数据库连接对象

	/*
		1、功能:获取执行sql对象
	*/
	Statement createStatement();
	PrepareStatement prepareStatement(String sql);

	/*
		2、管理事务
	*/
	开启事务:setAutoCommit(boolean autoCommit) ,调用该方法设置参数为false,即开启事务
	提交事务:commit()
	回滚事务:rollback()

Statement :执行sql的对象

	/*
		1、执行sql
	*/
	boolean execute(String sql),可以执行任意的sql

	//返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功(返回大于0,则成功;反之,则失败)
	int executeUpdate(String sql),执行DML(insert、update、delete)语句,DDL(create、alter、drop)语句 

	ResultSet executeQuery(String sql),执行DQL(select)语句

ResultSet:结果集对象

	next() //游标向下移动一行
	getXxx(参数) //获取数据
	Xxx:代表数据类型 如: int getInt(),String getString()
	参数:
		int:代表列的编号,从1开始 如:getString(1)
		String:代表列的开始 如:getDouble("balance")

	使用步骤:
	游标向下移动一行
	判断是否有数据
	获取数据

	while(rs.next()){
		//获取数据
		int id = rs.getInt(1);
		String name = rs.getString("name");
		double balance = rs.getDouble(3);
		
		System.out.println(id+name+balance);
	}

PreparedStetement:执行sql的对象
作用:
可以防止SQL注入
效率更高

	1、SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题
	如: 输入用户随便,abc123 输入密码:a' or 'a' = 'a
	sql:select * from user where username = 'abc123' and password = a' or 'a' = 'a;

	2、解决sql注入问题:使用PrepareStatement对象来解决
	3、预编译的SQL:参数使用?作为占位符
	
	4、步骤:
	导入驱动jar包
	
	注册驱动
	
	获取数据库连接对象 Connection
	
	定义sql
	sql:select * from user where username = ? and password = ?;
	
	给?赋值
	方法:setXxx(参数1,参数2)
	参数1:?的位置编号 从1开始
	参数2:?的值
	
	执行sql,并接受返回结果,不需要传递sql语句

	处理结果
	
	释放资源

3、JDBC控制事务
使用Connection对象来管理事务
开启事务:setAutoCommit(boolean autoCommit) ,调用该方法设置参数为false,即开启事务(在执行sql之前开启事务)
提交事务:commit()(当所有sql都执行完提交事务)
回滚事务:rollback()(在catch中回滚事务)

二、数据库连接池

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

实现:
标准接口,DataSource

	//方法,获取连接
	geConnection()
	
	//归还连接(应注意此方法是归还不是关闭)
	Connection.close()

常见连接池:C3P0、Druid

C3P0

	导入jar包c3p0、mchange-commons-java、mysql-connector-java
	
	定义配置文件:
	名称:c3p0.properties 或者c3p0-config.xml
	路径:src目录下

	创建数据库连接池对象 CombopooledDataSource

	获取连接 getConnection

	/*
		c3p0获取11个数据库连接
	*/
	public static void main(String[] args) throw SQLException{
		//1、获取DataSource
		DataSource ds = new ComboPooledDataSource();
		//2、获取连接
		for(int i = 1; i<= 11; i++){
			Connection conn = ds.getConnection();
			System.out.println(i+":"+conn);

			if(i = 5){
				conn.close(); //当获取数据库连接数到5时,用完该对象后,归还连接
			}
		}
		
	}

Druid

	导入jar包 druid
	
	定义配置文件(properties形式,可放在任意文件夹)

	获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory

	获取连接:getConnection
	
	/*
  		druid获取数据库连接、打印连接对象
	*/
	public static void main(String[] args) throw SQLException{
		//1、导入jar包
		//2、定义配置文件
		//3、加载配置文件
		Properties pro = new Properties();
		InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
		
		//4、获取连接池对象
		DataSource ds  = DruidDateSourceFactory.createDataSource(pro);

		//5、获取连接
		Connection conn = ds.getConnection();
		
		//6、打印输出
		System.out.println(conn);
	}

定义JDBCUtils工具类

	定义一个类 JDBCUtils
	
	提供静态代码块配置文件,初始化连接池对象

	提供方法
		1、获取连接方法:通过数据库连接池获取连接
		2、释放资源
		3、获取连接池的方法
	
	public static void main(String[] args){
		//1、定义成员变量 DataSource
		private static DataSource ds;

		static{
			try{
				//1、加载配置文件
				Properties pro = new Properties();
				InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");

				//2、获取连接池对象
				DataSource ds  = DruidDateSourceFactory.createDataSource(pro);
			}catch(IOException e){
				e.printStackTrace();
			}catch(Exception e){
				e.printStackTrace();
			}
		}

		/*
		 获取连接
		*/
		public static void getConnection(String[] args) throw SQLException{
			return ds.getConnection();
		}

		/*
			释放资源
		*/
		public static void close(String stmt,Connection conn){
			close(null,stmt,conn);
		}

		public static void close(ResultSet rs, String 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;
		}
	}

三、JDBCTemplate

Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发

步骤:
1、导入jar包
2、创建jdbcTemplate对象,依赖于数据库DataSource
JdbcTemplate template = new JdbcTemplate(ds);

3、调用jdbcTemplate的方法来完成CRUD的操作

update():执行DML语句,增删改

//这个方法查询的结果集长度只能是一
queryForMap():查询结果将结果集封装在map集合 
将列明作为key,将值作为value,将这条记录封装到一个map集合

//将每一条记录封装为一个Map集合,再讲Map集合装在到List集合中
queryForList():查询结果将结果集封装在List集合

//query的参数为RowMapper,一般使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
//new BeanPropertyRowMapper<类型>(类型.class)
query():查询结果将结果封装为javaBean对象

//一般用于聚合函数的查询
queryForMap():查询结果将结果集封装为对象

	/*
		JDBCTemplate创建对象、调用方法
	*/
	
	public static void main(String[] ars){
		//导入jar包
		//创建JDBCTemplate对象
	  JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

		//调用方法
		String sql = "update account set balance = 5000 where id = ?";
		int count = template.update(sql,3);
		System.out.println(count);
	}
	
	/*
		queryForMap()
		queryForList() 方法代码演示
	*/
	public static void main(String[] ars){
		//导入jar包
		//创建JDBCTemplate对象
	   JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

		//调用方法
		String sql = "select * from emp";
		
		List<Map<String,Object>> list = template.queryForList(sql);

		for(Map<String,Object> stringObjectMap : list){
			System.out.println(stringObjectMap);
		}
	}
	
	/*
		query():查询结果将结果封装为javaBean对象
	*/
	public static void main(String[] ars){
		//导入jar包
		//创建JDBCTemplate对象
	   JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

		//调用方法
		String sql = "select * from emp";
		
		List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));

		for(Emp emp : list){
			System.out.println(emp);
		}
	}

你可能感兴趣的:(JDBC详解,看这篇就够了(java复习day12))