JDBC连接MySQL(干货)

JAVA连接JDBC操作数据库

什么是JDBC

Java DataBase Connectivity,Java数据库连接,jdbc实际是java中的一套和数据库交互的API(application program interface 应用程序编程接口)

为什么使用JDBC

因为Java程序员需要连接多种数据库,为了避免每一个数据库都学习一套新的API,sun公司提出了一个JDBC接口,各个数据库厂商根据此接口写实现类(驱动),这样java程序员只需要掌握JDBC接口中的一套方法,就可以访问任何数据库。
导包: import java.sql.*

如何使用JDBC
外网访问:https://mvnrepository.com/
1. 从maven网站上搜索mysql 找到5.1.6版本的坐标,把坐标复制到工程的pom.xml文件中 ,在pom.xml文件源码里面project标签内部 添加<dependecies>标签,把复制的内容粘贴到里面 ,保存在工程中出现奶瓶即可、
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.6</version>
	</dependency>
2. 创建Demo01.java 在main方法中写以下代码:
	//1.注册驱动
	Class.forName("com.mysql.jdbc.Driver");
	//2. 获取连接对象
	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/newdb3","root","root");
	//System.out.println(conn);
	//3.创建执行SQL语句的对象
	Statement stat = conn.createStatement();
	//4.执行SQL
	String sql = "create table if not exists jdbct1(id int primary key auto_increment,name varchar(10))";
	stat.execute(sql); 
	System.out.println("执行完成");
	//5.关闭资源,先打开的资源后关闭
	stat.close();
	conn.close(); 
执行SQL的方法
execute(sql): 此方法可以执行任意SQL,但是推荐执行DDL(create drop alter truncate) ,方法的返回值为布尔值,返回值代表是否有结果集,'true':有结果集,'false':没有结果集
executeUpdate(sql): (DML)此方法执行增删改的SQL,方法返回值为int类型,代表生效(ok)行数
executeQuery(sql):	此方法执行select查询的SQL,返回值为ResultSet结果集
解析配置文件
配置文件位置:
	src/main/resources
配置文件名:jdbc.properties
		driver=com.mysql.jdbc.Driver
		url=jdbc:mysql://localhost:3306/newdb3
		username=root
		password=123456
		initialSize=2
		maxActive=10
解析文件:
	/**
	 * 解析Properties后缀文件,获取对应的信息
	* properties后缀文件是以键值对方式存储信息
	 */
	//创建属性对象
	Properties prop= new Properties();
	//得到文件输入流'Demo05表示类名'
	InputStream ips=Demo05.class.getClassLoader().getResourceAsStream("jdbc.properties");
	//把流交给属性对象
	prop.load(ips);
	//获取数据,只能获取到字符串类型的数据
	String name = prop.getProperty("name");
	String age = prop.getProperty("age");
	System.out.println(name+": "+age);	
	//注册驱动以及设置连接池
ResultSet
	获取数据的方式有两种:
		1、通过查询到的字段名称获取数据   rs.getString("ename");
		2、通过查询到的字段位置获取数据   rs.getString(2);
	数据库类型和java类型对比:
		MySQL               	java
		int 		       		getInt()
		varchar		       		getString()
		float/double       		getFloat()/getDouble()
		datetime/timestamp 		getDate()
数据库连接池DBCP
DataBase Connection Pool:数据库连接池
	为什么使用:如果没有数据库连接池,每次业务都需要和数据库建立一次连接,用完之后断开,如果有1万次业务请求则有1万次连接的开和关,频繁开关连接,浪费资源,使用数据库连接池可以将连接重用,避免资源的浪费
如何使用数据库连接池
	1. 下载jar包: 从maven服务器中搜索 dbcp
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
	2. 把坐标复制粘贴到pom.xml中
	3. 代码如下:
		//创建数据源对象
		BasicDataSource dataSource = new BasicDataSource();
		//设置数据库连接信息
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/newdb3");
		dataSource.setUsername("root");
		dataSource.setPassword("123456");
		//设置初始连接数量
		dataSource.setInitialSize(3);
		//设置最大连接数量
		dataSource.setMaxActive(5);
		//从连接池中得到连接
		Connection conn = dataSource.getConnection();
		System.out.println(conn);

@Test 测试单元注解
只能对无参无返回值的方法进行单元测试

SQL的注入风险
select count(*) from t_user where username='libai' and password='admin1';
SQL注入的演示
	执行语句
		String sql = "insert into jdbcuser values(null,'"+name+"',"+age+")"; 
	输入:' or '1'='1	
	输出SQL拼接语句:
		select count(*) from t_user where username='asdfsdf' and password='' or '1'='1'
	出现登陆成功状态	
PreparedStatement对象
预编译的SQL对象
1. 为什么PreparedStatement可以避免SQL注入?
	因为预编译的SQL执行对象 在创建stat对象的时候已经将SQL进行编译并且把SQL语句的逻辑固定,不会因为后期替换进去的内容改变SQL语句		 	
	String sql = "select count(*) from t_user where username=? and password=?";	
	stat = conn.prepareStatement(sql);
	//替换问号的值
	stat.setString(1, username);
	stat.setString(2, password);	
	//执行SQL 
	rs = stat.executeQuery();		'不需要传入参数'	
2、好处
	1. 代码更直观避免了拼接SQL语句 
	2. 可以避免SQL注入 
	3. 执行效率略高于statement
	如果SQL语句中存在变量则使用PreparedStatement,如果没有变量则使用Statement
批量操作
将多次和数据库服务器的数据交互合并成一次,提高执行效率
	'添加到批量操作中'
	stat.addBatch(sql1);
	stat.addBatch(sql2);
	stat.addBatch(sql3);
	'执行批量操作'
	stat.executeBatch();
事务
1、设置自动提交的状态 
	conn.setAutoCommit(false
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值