`
天使的左手
  • 浏览: 55662 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jdbc入门

    博客分类:
  • jdbc
阅读更多
JDBC(Java DataBase Connectivity):是SUN制定的一套java连接/操作数据库的规范。属于Java SE的一部分,接口和类主要分布在java.sql和javax.sql中。




Java应用程序只是简单的调用JDBC API完成数据库的操作,底层的代码是由具体的Driver(各个数据库生产厂商提供)实现。


我的第一个JDBC程序
		// First, register jdbc driver
		Class.forName("com.mysql.jdbc.Driver");

		// Second, get connection
		Connection conn = DriverManager
				.getConnection("jdbc:mysql://localhost/jdbc?user=root&password=root");

		// Third, create sql statement
		Statement stmt = conn.createStatement();

		// Fourth, execute statement
		ResultSet rs = stmt.executeQuery("select * from t_user");

		// Last, iterate result set
		while (rs.next()) {
			System.out.println(rs.getString("name") + ", " + rs.getInt("age"));
		}



两种常用的注册驱动的方法

		// register mysql jdbc driver
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());

		// Class.forName("com.mysql.jdbc.Driver");




调用DriverManager.registerDriver(new Driver())会导致添加两遍Driver实例

URL格式
JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&...

使用Satement时,如果操作带一些条件,需要拼接SQL,会导致SQL注入问题。

String name = "' or 1 or '";
String sql = "select * from t_user where name = '" + name + "'";


/*
	 
  一个新的 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象
1、结果集类型:设置是否滚动,以及设置滚动结果集是否感知数据的更新
	ResultSet.TYPE_FORWARD_ONLY 只能向前
	ResultSet.TYPE_SCROLL_INSENSITIVE 可滚动,不感知数据变化。
	ResultSet.TYPE_SCROLL_SENSITIVE 可滚动,并感知数据变化。
2、并发性:设置是否允许更新
	ResultSet.CONCUR_READ_ONLY 只读
	ResultSet.CONCUR_UPDATABLE 可更新
3、可保存性:设置提交时候是否关闭结果集
	ResultSet.HOLD_CURSORS_OVER_COMMIT 
	在提交后结果集还可用ResultSet.CLOSE_CURSORS_AT_COMMIT:在提交时候关闭结果集

由于这些特性比较高级,不同数据库驱动对此实现也不一样。
因此在使用JDBC高级特性的时候最好做个测试,以保证程序的可靠性
	  
	 */


获取自动生成主键的值
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();

			String sql = "insert into t_user(name, age, salary, birthday) values (?, ?, ?, ?)";
			pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			pstmt.setString(1, "小时代" + Math.random());
			pstmt.setInt(2, 12);
			pstmt.setFloat(3, 5000);
			pstmt.setDate(4, new java.sql.Date(System.currentTimeMillis()));

			pstmt.executeUpdate();

			rs = pstmt.getGeneratedKeys();
			if (rs.next())
				System.out.println(rs.getObject(1));
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("Execute failed!", e);
		} finally {
			JdbcUtils.closeResource(conn, pstmt, rs);
		}


批量添加多条记录
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			String sql = "insert into t_user(name,birthday,age,salary) values(?,?,?,?)";
			pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			for (int i = 0; i < 100; i++) {
				pstmt.setString(1, "Batch Name" + i);
				pstmt.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
				pstmt.setInt(3, 23 + i);
				pstmt.setFloat(4, 5000 + i);

				pstmt.addBatch();
			}
			pstmt.executeBatch();

			rs = pstmt.getGeneratedKeys();

			while (rs.next()) {
				System.out.println(rs.getInt("GENERATED_KEY"));
				// System.out.println(rs.getInt(1));
			}
		} catch (SQLException e) {
			throw new DAOException("Failed to execute batch sqls.", e);
		} finally {
			JdbcUtils.closeResource(conn, pstmt, rs);
		}


模拟一个简单的数据源
public class MyDataSource implements DataSource {
	private static String url = "jdbc:mysql://localhost:3306/jdbc";
	private static String username = "root";
	private static String password = "root";

	private LinkedList<Connection> pool = new LinkedList<Connection>();

	private static int initialSize = 3;
	private static int maxSize = 5;
	private static int maxUsedCount = 5;

	private int currentSize = 0;

	public MyDataSource() {
		try {
			for (int i = 0; i < initialSize; i++) {
				pool.addLast(createConnection());
				currentSize++;
			}
		} catch (SQLException e) {
			throw new ExceptionInInitializerError(
					"DataSource initialization failed!");
		}
	}

	@Override
	public PrintWriter getLogWriter() throws SQLException {
		return null;
	}

	@Override
	public void setLogWriter(PrintWriter out) throws SQLException {

	}

	@Override
	public void setLoginTimeout(int seconds) throws SQLException {

	}

	@Override
	public int getLoginTimeout() throws SQLException {
		return 0;
	}

	@Override
	public <T> T unwrap(Class<T> iface) throws SQLException {
		return null;
	}

	@Override
	public boolean isWrapperFor(Class<?> iface) throws SQLException {
		return false;
	}

	@Override
	public Connection getConnection() throws SQLException {
		synchronized (pool) {
			if (pool.size() > 0) {
				return pool.removeFirst();
			}

			if (currentSize < maxSize) {
				Connection conn = createConnection();
				currentSize++;
				return conn;
			}

			throw new SQLException("Out of max size");
		}
	}

	private Connection createConnection() throws SQLException {
		Connection realConn = DriverManager.getConnection(url, username,
				password);
		return new MyProxyConnection(realConn).getConnection();
	}

	@Override
	public Connection getConnection(String username, String password)
			throws SQLException {
		throw new SQLException("Not implemented.");
	}

	private class MyProxyConnection implements InvocationHandler {
		private Connection real;
		private Connection wrappedConn;
		private int currentUsedCount = 0;

		public MyProxyConnection(Connection realConnection) {
			this.real = realConnection;
		}

		public Connection getConnection() {
			wrappedConn = (Connection) Proxy.newProxyInstance(
					MyProxyConnection.class.getClassLoader(),
					new Class[] { Connection.class }, this);
			return wrappedConn;
		}

		@Override
		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
			if ("close".equals(method.getName())) {
				currentUsedCount++;
				if (currentUsedCount < MyDataSource.maxUsedCount)
					MyDataSource.this.pool.addLast(wrappedConn);
				else {
					real.close();
					MyDataSource.this.currentSize--;
				}
				return null;
			} else if ("toString".equals(method.getName())) {
				return "My_Proxy_Connection@"
						+ Integer.toHexString(real.hashCode());
			}
			return method.invoke(real, args);
		}
	}
}


Spring JDBC Template使用
public class SimpleDaoImpl extends SimpleJdbcDaoSupport {
	private static final String ADD_USER = "insert into t_user(name, age, birthday,salary) values(:name, :age, :birthday, :salary)";
	private static DataSource dataSource;

	static {
		String url = "jdbc:mysql://localhost:3306/jdbc";
		String username = "root";
		String password = "root";
		DriverManagerDataSource ds = new DriverManagerDataSource(url, username,
				password);
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource = ds;
	}

	public static void main(String[] args) {
		SimpleDaoImpl dao = new SimpleDaoImpl();
		dao.setDataSource(dataSource);

		User user = new User();
		user.setName("Test Simple JDBC Support");
		user.setAge(23);
		user.setBirthday(new Date());
		user.setSalary(8967);

		dao.addUser(user);
	}

	public void addUser(User user) {
		int status = getSimpleJdbcTemplate().update(ADD_USER,
				new BeanPropertySqlParameterSource(user));

		System.out.println("Affect Rows: " + status);
	}
}


>>更多Spring JDBC Template
http://my.oschina.net/u/218421/blog/38598
  • 大小: 16.2 KB
  • 大小: 49.3 KB
分享到:
评论

相关推荐

    JDBC 入门电子书.zip

    **JDBC 入门知识详解** Java Database Connectivity (JDBC) 是Java编程语言中用于与各种类型数据库交互的标准API。它是Java平台的核心部分,由Java SE的Java SQL类库提供,使得开发者能够编写数据库独立的代码,...

    jdbc入门至精通

    【jdbc入门至精通】 在Java开发中,JDBC(Java Database Connectivity)是连接Java应用程序与各种数据库的关键技术。本文将从基础概念出发,逐步深入,帮助读者从入门到精通JDBC。 **第二节 jdbc的概念** 2.1 **...

    Java_JDBC.rar_JDBC入门

    在这个“Java_JDBC.rar_JDBC入门”的资源包中,我们主要会探讨以下几个关键知识点: 1. **JDBC API概述**:JDBC是Java平台上的一个核心部分,由Java.sql包中的类和接口组成。主要接口包括Connection(数据库连接)...

    JDBC_2.rar_JDBC入门例子

    这个名为“JDBC_2.rar”的压缩包文件包含了JDBC入门的例子,非常适合初学者学习和理解JDBC的基本概念和用法。 首先,我们来看一下JDBC的核心组件: 1. **驱动管理器(Driver Manager)**:它是JDBC的入口点,负责...

    ha-jdbc入门demo

    【ha-jdbc入门demo】是针对高可用性(High Availability, HA)数据库连接技术的一次实践,主要聚焦在如何利用ha-jdbc实现数据库的高可用和负载均衡。在这个入门示例中,我们将深入理解ha-jdbc的工作原理,以及如何...

    JAVA数据库接口JDBC入门基础讲座

    **Java数据库接口JDBC入门基础讲座** 在Java编程领域,JDBC(Java Database Connectivity)是连接Java应用程序与各种类型数据库的重要桥梁。它提供了一套标准的API,使得开发者能够使用Java语言来操作数据库,实现...

    Java连接数据库的JDBC入门介绍

    **Java JDBC 入门介绍** Java JDBC(Java Database Connectivity)是Java编程语言中用于与数据库交互的一组标准API。它是Java平台的一部分,允许Java开发者执行SQL语句并处理数据库返回的结果。JDBC提供了统一的...

    SpringJDBC入门Demo

    一个简单的Spring JDBC入门Demo通常包括以下步骤: - 配置数据源 - 创建JdbcTemplate实例 - 编写SQL语句 - 使用JdbcTemplate的方法执行SQL - 实现RowMapper或ResultSetExtractor进行结果映射 通过这个入门...

    JDBC入门中文文档

    **JDBC(Java Database Connectivity)**是Java...这个“JDBC入门中文文档”将详细介绍这些概念,帮助初学者快速掌握JDBC的基本用法和最佳实践。通过深入学习和实践,你将能够利用JDBC实现高效、可靠的数据库应用程序。

    JDBC入门基础讲座

    **JDBC入门基础讲座** Java Database Connectivity(JDBC)是Java平台中用于与关系数据库进行交互的一种标准API。它是Java编程语言的一部分,允许程序员使用Java语言来访问和处理各种数据库。JDBC提供了一组接口和...

    jdbc入门、分页以及事务

    **JDBC入门** Java Database Connectivity (JDBC) 是Java编程语言中用于与关系数据库交互的一组接口和类。它是Java平台的标准部分,允许应用程序通过Java代码执行SQL命令。以下是JDBC入门的一些关键知识点: 1. **...

    JDBC入门案例详解源代码压缩包

    本压缩包提供了JDBC入门案例的源代码,旨在帮助初学者理解并掌握JDBC的基本用法。 在学习JDBC时,你需要了解以下几个关键知识点: 1. **JDBC驱动**:JDBC驱动是Java程序与数据库之间的桥梁,主要有四种类型:Type ...

    JAVA数据库编程JDBC 与 Java数据库接口JDBC入门基础讲座 与 JDBC API数据库编程实作教材-程序设计-JAVA JDBC全压缩包.rar

    本压缩包包含了三个重要组成部分:《JAVA数据库编程JDBC》、《Java数据库接口JDBC入门基础讲座》以及《JDBC API数据库编程实作教材》。这些资源将帮助初学者全面理解和掌握JDBC的基础知识和实践技巧。 《JAVA数据库...

    java jdbc入门教程笔记

    以下是一些关于JDBC入门的关键知识点: 1. **注册驱动**: 在JDBC中,注册驱动是为了使Java应用程序能够识别并连接到特定的数据库。通常有两种方法: - 使用`Class.forName()`方法,例如`Class.forName(...

    JDBC 入门教程内含源码以及说明书可以自己运行复现.zip

    **JDBC 入门教程概览** 本教程旨在帮助初学者深入理解Java数据库连接(Java Database Connectivity,简称JDBC)的基础知识,通过源码实践和详细的说明书,你可以自行运行示例,加深对JDBC的理解。以下将分别介绍...

    Java数据库接口JDBC入门基础讲座

    ### Java数据库接口JDBC入门基础知识点详解 #### 一、JDBC概览 JDBC,全称为Java Database Connectivity,是Sun Microsystems(现为Oracle公司的一部分)提供的一套用于执行SQL语句的Java API函数集。它由一系列用...

    JDBC入门(学习课件1)

    **JDBC入门(学习课件1)** Java Database Connectivity(JDBC)是Java语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems(现已被Oracle收购)开发,是Java平台的标准部分,允许Java应用程序...

Global site tag (gtag.js) - Google Analytics