`

传智播客李勇Jdbc视频笔记(7-17)

阅读更多
7、PerparedStatement的应用:
在上面的例子中,我们看到了在构造sql语句的时候使用拼串的方式会有sql注入的问题,这个时候我们可以用
PreparedStatement 来解决这个问题
public void read(String name) {
		......
		PreparedStatement ps = null;
		String sql = "select * from xxx where name = ?";
		ps = conn.prepareStatement(sql);
		ps.setString(1, name);
		rs = ps.executeQuery();
		......
		..
	}

如果我们采用上面的方式来构造sql语句就不会有sql注入问题了,因为PerparedSatatement会对传递给他的sql
语句进行一系列的处理。然后再执行。
注意:rs = ps.executeQuery()如果你写成了rs = ps.executeQuery(sql)编译器也是不会报错的,因为PerparedSatement
是从Satement继承来的,所以如果你调用的是ps.executeQuery(String sql)这个带有参数的方法的时候,其实是调用的
Statement接口的方法,因为你上面sql语句是用PerparedStatement的方式进行构造的 用?代替了参数部分,这个时候会包
错误说 ? 是非法字符,因为调用的是Statement的方法他不会对?进行处理直接传递给数据库执行,而数据库是不能解析
这个字符的。

总结:
在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。
PreperedStatement(从Statement扩展而来)相对Statement的优点:
1.没有SQL注入的问题。
2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。

9、Eclipse的使用问题
10、jdbc中的数据类型与日期问题
public class DateTest {
		public static void main(String[] args) throws SQLException {
			// create("name2", new Date(), 500.0f);
			Date d = read(7);
			System.out.println(d);
		}

		static Date read(int id) throws SQLException {
			Connection conn = null;
			Statement st = null;
			ResultSet rs = null;
			Date birthday = null;
			try {
				// 2.建立连接
				conn = JdbcUtils.getConnection();
				// conn = JdbcUtilsSing.getInstance().getConnection();
				// 3.创建语句
				st = conn.createStatement();

				// 4.执行语句
				rs = st.executeQuery("select birthday  from user where id=" + id);

				// 5.处理结果
				while (rs.next()) {
					//birthday = new Date(rs.getDate("birthday").getTime());
					//取值的时候是java.sql.Date赋值给一个父类类型java.util.Date是没有问题的
					birthday = rs.getDate("birthday");
				}
			} finally {
				JdbcUtils.free(rs, st, conn);
			}
			return birthday;
		}

		static void create(String name, Date birthday, float money)
				throws SQLException {
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs = null;
			try {
				// 2.建立连接
				conn = JdbcUtils.getConnection();
				// conn = JdbcUtilsSing.getInstance().getConnection();
				// 3.创建语句
				String sql = "insert into user(name,birthday, money) values (?, ?, ?) ";
				ps = conn.prepareStatement(sql);
				ps.setString(1, name);
				//插入的时候传递的是java.util.Date而方法要求的是java.sql.Date,所以要进行一下转化
				ps.setDate(2, new java.sql.Date(birthday.getTime()));
				ps.setFloat(3, money);

				// 4.执行语句
				int i = ps.executeUpdate();

				System.out.println("i=" + i);
			} finally {
				JdbcUtils.free(rs, ps, conn);
			}
		}
	}


11、jdbc访问大段文本数据:数据库产品不一样,字段可能不同:mysql:Text  Oracle:可能是Clob

//存储大段文本数据
	public static void clobTest() throws SQLException, IOException {
		Connection conn = JdbcUtils.getConnection();
		String sql = "insert into clob(content) values (?)";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		//把一个文件的内容读进来存储到数据库中
		File file = new File("src/org/guo/jdbc/JdbcUtils.java");
		//如果你把reader转换为数组,然后再转换成String,在这个地方可以直接pstmt.setString()
		//前提是你的数据库的那个字段规定的是Clob(Text)类型,那么在下面取数据的时候
		//可以直接getString()进行读取操作。
		Reader reader = new BufferedReader(new FileReader(file));
		//以字符流的方法设置参数
		pstmt.setCharacterStream(1,reader, file.length());
		pstmt.executeUpdate();
	}
	
	//读取大段文本数据
	public static void readTest() throws SQLException, IOException {
		Connection conn = JdbcUtils.getConnection();
		String sql = "select content from clob";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		while(rs.next()) {
			//字符大对象
			Clob clob = rs.getClob(1);
			//下面两种方式都可以
			//Reader reader = clob.getCharacterStream();
			Reader reader = rs.getCharacterStream(1);
			File fileBak = new File("jdbcUtils.bak.java");
			
			Writer writer = new BufferedWriter(new FileWriter(fileBak));
			char[] data = new char[1024];
			//reader.read(data):把读取到的一个字符放到data字符数组中
			for(int i=0; (i=reader.read(data)) >0;) {
				//把字符数组中的内容写到文件中
				writer.write(data, 0, i);
			}
			writer.close();
			reader.close();
		}
	}


12、jdbc访问二进制类型的数据

//存储二进制数据(图片为例)
	public static void blobTest() throws SQLException, IOException {
		Connection conn = JdbcUtils.getConnection();
		String sql = "insert into t_blob(big_bit) values (?)";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		File file = new File("baby.gif");
		InputStream in = new BufferedInputStream(new FileInputStream(file));
		pstmt.setBinaryStream(1, in, file.length());
		pstmt.executeUpdate();
	}
	
	//读取二进制数据
	public static void readTest() throws SQLException, IOException {
		Connection conn = JdbcUtils.getConnection();
		String sql = "select big_bit from t_blob";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		while(rs.next()) {
			//二进制大对象
			Blob blob = rs.getBlob(1);
			//下面两种方式都可以
			//Reader reader = clob.getCharacterStream();
			InputStream in = blob.getBinaryStream();
			//下面这种方式也可以,和读取大段文本数据的原理是一样的
			//InputStream in = rs.getBinaryStream(1);
			File imgBit = new File("baby2.gif");
			
			OutputStream out = new BufferedOutputStream(new FileOutputStream(imgBit));
			byte[] data = new byte[1024];
			for(int i=0; (i=in.read(data)) >0;) {
				out.write(data, 0, i);
			}
			out.close();
			in.close();
		}
	}

13、JDBC_jdbc访问其他各种数据类型:解释数据库中的类型与java中的数据类型的相互的对应关系--------->查看mysql的参考文档

14、传智播客JDBC_答疑学员的索引号问题

15、分析在实际项目中该如何应用



我们上面的例子程序都是简单的在控制台打印一下,但是在真实的开发中不可能这样,那么我们能不能返回ResultSet对象呢?
这个其实是不可以的当Connection关闭之后,ResultSet中的数据你就拿不到了。如果我们要进行传值需要定义个domain对象。
16、DAO设计思想与搭建骨架

17、结合Service层讲解DAO层的异常处理
在处理异常的时候,不能catch住异常之后什么都不做,最起码要打印一下堆栈,最好的方式是将这个异常转化为RuntimeException抛出
如果出现了异常,你catch住了,程序会继续往下执行。如果你throw出来了 程序就不继续往下运行了
  • 大小: 73.7 KB
分享到:
评论

相关推荐

    传智播客 李勇老师 JDBC代码全部和ppt

    【标题】"传智播客 李勇老师 JDBC代码全部和ppt" 提供的是一个关于JDBC编程的全面学习资源,由知名教育机构传智播客的讲师李勇主讲。JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的...

    传智播客-Jdbc-李勇.ppt

    传智播客-Jdbc-李勇.ppt 传智播客-Jdbc-李勇.ppt 传智播客-Jdbc-李勇.ppt

    传智播客李勇hibernate源码1-20课

    传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...

    传智播客李勇hibernate PPT

    【传智播客李勇hibernate PPT】是一份由知名教育机构传智播客推出的关于Hibernate框架的培训资料,由讲师李勇精心制作。这份PPT详细讲解了Hibernate在实际开发中的应用,旨在帮助学员深入理解并掌握这一强大的Java...

    传智播客_hibernate李勇笔记

    传智播客_hibernate李勇笔记是在学习李勇老师讲的hibernate3.2.5后整理的笔记

    hibernate_传智播客_李勇

    hibernate_传智播客_李勇

    传智播客李勇hibernate

    【传智播客李勇hibernate】课程详解了ORM框架Hibernate的核心概念和技术,适合初学者和想要深入了解Hibernate的开发者。以下是对课程内容的详细解析: 1. **引入ORM框架**: - 阻抗不匹配:由于Java是面向对象的...

    hibernate传智播客李勇ppt

    传智播客hibernate讲解视频配套ppt,李勇

    传智播客 李勇 hibernate 的ppt

    【传智播客 李勇 Hibernate 讲解】 在IT领域,ORM(Object-Relational Mapping,对象关系映射)框架是将面向对象的模型与关系数据库之间进行映射的关键技术,有效地解决了“模型不匹配”(也称为“阻抗不匹配”)的...

    传智播客JDBC_所有源码与ppt

    本资源“传智播客JDBC_所有源码与ppt”是针对JDBC学习的一个综合包,包含了源代码和相关的教学演示PPT,非常适合初学者或希望深入理解JDBC的开发者使用。传智播客是一家知名的教育机构,其课程内容通常具有系统性和...

    JDBC笔记 李勇

    **JDBC笔记 李勇** JDBC(Java Database Connectivity)是Java编程语言中用来规范应用程序如何访问数据库的应用程序编程接口,提供了诸如连接数据库、发送SQL语句、处理结果集等功能。李勇老师的JDBC学习笔记主要...

    传智播客 hibernate PPT 很经典

    传智播客 hibernate PPT 很经典

    传智播客SSHppt

    - **传智播客李勇hibernate**:李勇老师的Hibernate课程可能包括了Hibernate的基本原理、实体类与表的映射、CRUD操作、查询语言(HQL)、Criteria查询、级联操作、缓存策略等。他可能强调了如何优雅地处理数据库操作...

    传智播客SSH三大框架的PPT

    在IT行业中,SSH三大框架是Java Web开发领域中不可或缺的一部分...这些PPT资源,如"传智播客李勇hibernate.ppt"、"spring.ppt"、"struts2.ppt",提供了详细的讲解和示例,对学习SSH框架的开发者来说是一份宝贵的资料。

    传智播客Java培训ppt大全

    本Java培训资料集合了多位知名讲师的精华内容,包括比向东、方力勋、黎活明、张孝祥、杨忠科、李勇、韩顺平等,覆盖了Java的基础到高级知识点,旨在帮助学习者全面掌握Java编程。 1. **Java基础** - **语法基础**...

Global site tag (gtag.js) - Google Analytics