JSP(3) ----JDBC编程2

接上节:

对上节http://4440271.blog.51cto.com/4430271/1661684

程序修改:

package com.jike.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TransactionTest {
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/info", "*****", "******");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}

	// 向用户表中插入数据
	// 对代码修改
	public static void insertUserData(Connection conn) throws SQLException {
		// ctrl+shift+f格式化代码
		String sql = "insert into tbl_user(id, name, password, email)"
				+ "values(10, ‘Tom‘, ‘2525252‘, ‘[email protected]‘)";
		Statement st = conn.createStatement();
		int count = st.executeUpdate(sql);
		System.out.println("向用户表中插入了" + count + "条数据");
		// conn.close();

	}

	// 向地址表中插入数据
	public static void insertAddressData(Connection conn) throws SQLException {
		String sql = "insert into tbl_address(id, city, country, user_id)"
				+ "values(1, ‘shanghai‘, ‘china‘, ‘10‘)";
		Statement st = conn.createStatement();
		int count = st.executeUpdate(sql);
		System.out.println("向地址表中输入了" + count + "条记录");
		// conn.close();
	}

	public static void main(String[] args) {
		Connection conn = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(false); // 禁止事务自动提交

			insertUserData(conn);
			insertAddressData(conn);
			// 这里,在提交insertAddressData方法是抛出异常,异常被捕获,因此事务回滚。

			//提交事务
			conn.commit();
		} catch (Exception e) {
			System.out.println("*************捕获到sq异常************");
			e.printStackTrace();
			try {
				conn.rollback(); //如果提交失败则回滚
				System.out.println("事务回滚成功");
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}finally{
			try {
				if(conn != null){
					conn.close();
				}
			} catch (Exception e3) {
				// TODO: handle exception
				e3.printStackTrace();
			}
		}

	}

}

输出结果:

在数据库中:

数据没有插入,说明回滚成功,数据的一致性没有受到破坏。

JDBC 编程优化:

将配置信息提取出来,放到属性文件里面:

创建属性文件 : 在src目录下右键,点击 new-->  other --> General-->File-->next---> 文件名. properties-->finish

点击add,添加如下内容:

点击下方的source可以看到:

新建如下两个类:

在工厂类中添加代码:

package com.jike.jdbc.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

// 创建数据库连接工厂类,放在util包下
public class ConnectionFactory {
	// 创建四个成员变量用于保存从属性文件中读出的数据库配置信息
	private static String driver;
	private static String dburl;
	private static String user;
	private static String password;

	private static final ConnectionFactory factory = new ConnectionFactory();

	//定义Connection类型变量保持数据连接
	private Connection conn;
	// 配置信息的读取
	static{//静态代码块用于初始化类,为类的属性赋值,静态代码块只执行一次
		Properties prop = new Properties();//定义属性类,用于保存属性文件中的键值对
		try {
			InputStream in = ConnectionFactory.class.getClassLoader().
					getResourceAsStream("dbcofig.properties");// 获取属性文件中的内容
			// 首先获得当前类的类加载器,然后通过加载器中的getResourceAsStream方法读取属性文件中的内容。
			// 这个方法将属性文件中的内容读取到一个输入流中

			prop.load(in);//从输入流中读取属性列表,即属性文件中的键值对列表
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("读取配置文件错误");
		}

		//将读取到的值赋值给成员变量
		driver = prop.getProperty("driver");
		dburl = prop.getProperty("dburl");
		user = prop.getProperty("user");
		password = prop.getProperty("password");
	}

	// 定义默认的构造函数
	private ConnectionFactory(){

	}

	// 用于获取ConnectionFactory实例
	public static ConnectionFactory getInstance(){
		return factory;
	}

	// 获取数据库连接的方法
	public Connection makeConnection(){
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(dburl, user, password);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}
}

在测试类中添加如下代码:

package com.jike.test;

import java.sql.Connection;

import com.jike.jdbc.util.ConnectionFactory;

public class ConnectionFactoryTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		ConnectionFactory cf = ConnectionFactory.getInstance();
		Connection conn = cf.makeConnection();
		System.out.println(conn.getAutoCommit());

	}

}

测试结果为:true

然后创建相应的DTO

添加相应的实体类:

在IdEntity类中:

package com.jike.entity;

// 封装主键信息
public abstract class IdEntity {
	protected Long id;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

}

在User类中:

package com.jike.entity;
// 创建用户信息的实体类
public class User extends IdEntity {
	// 添加成员属性,与数据库中user表的属性一一对应
	private String name;
	private String password;
	private String email;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", password=" + password + ", email="
				+ email + ", id=" + id + "]";
	}

}

在Address类中:

package com.jike.entity;

public class Address extends IdEntity {
	private String city;
	private String country;
	private Long userId;

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}

	public Long getUserId() {
		return userId;
	}

	public void setUserId(Long userId) {
		this.userId = userId;
	}

	@Override
	public String toString() {
		return "Address [city=" + city + ", country=" + country + ", userId="
				+ userId + ", id=" + id + "]";
	}

}

这样,就完成了实体类的创建。

创建DAO

在接口UserDao中添加:

package com.jike.dao;

import java.sql.Connection;
import java.sql.SQLException;

import com.jike.entity.User;
//定义实现类的行为
public interface UserDao {
	//定义对数据库的操作
	public void save(Connection conn, User user) throws SQLException;
	public void update(Connection conn, Long id, User user) throws SQLException;
	public void delete(Connection conn, User user) throws SQLException;
}

在接口的实现类UserDaoImpl中添加

package com.jike.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.jike.dao.UserDao;
import com.jike.entity.User;

public class UserDaoImpl implements UserDao {

	/*
	 * 保存用户信息
	 */
	@Override
	public void save(Connection conn, User user) throws SQLException {
		// TODO Auto-generated method stub
		//PreparedStatement是jdbc用于执行sql查询语句的api之一,用来执行参数化的查询
		//?是占位符
		PreparedStatement ps = conn.prepareStatement
				("insert into tbl_user(name, password, email) values (?,?,?)");
		//参数设置
		ps.setString(1, user.getName());//索引从1开始
		ps.setString(2, user.getPassword());
		ps.setString(3, user.getEmail());
		ps.execute();
		//将参数传入的user对象中的相关信息保存到数据库表中
	}

	/*
	 * 根据用户id更新用户信息
	 */
	@Override
	public void update(Connection conn, Long id, User user) throws SQLException {
		// TODO Auto-generated method stub
		String updateSql = "update tbl_user set name=?, password=?, email=? where id=?";
		PreparedStatement ps = conn.prepareStatement(updateSql);

		ps.setString(1, user.getName());
		ps.setString(2, user.getPassword());
		ps.setString(3, user.getEmail());
		ps.setLong(4, id);
		ps.execute();

	}

	/*
	 * 删除指定的用户信息
	 */
	@Override
	public void delete(Connection conn, User user) throws SQLException {
		// TODO Auto-generated method stub
		PreparedStatement ps = conn.prepareStatement("delete from tbl_user where id=?");
		ps.setLong(1, user.getId());
		ps.execute();
	}

}

添加测试程序:

package com.jike.test;

import java.sql.Connection;

import com.jike.dao.UserDao;
import com.jike.dao.impl.UserDaoImpl;
import com.jike.entity.User;
import com.jike.jdbc.util.ConnectionFactory;

public class UserDaoTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Connection conn = null;
		try {
			conn = ConnectionFactory.getInstance().makeConnection();
			conn.setAutoCommit(false);
			System.out.println(conn.getAutoCommit());
			UserDao userDao = new UserDaoImpl();
			User tom = new User();
			tom.setName("Tom");
			tom.setPassword("123");
			tom.setEmail("[email protected]");

			userDao.save(conn, tom);
			conn.commit(); //提交事务

		} catch (Exception e) {
			// TODO: handle exception
			try {
				conn.rollback();
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}
	}

}

查看数据库,新加入的数据成功提交。

极客学院:http://www.jikexueyuan.com/course/566_6.html?ss=2

时间: 2024-10-07 23:15:02

JSP(3) ----JDBC编程2的相关文章

JSP (3)------JDBC编程1

JDBC API : 是一系列的编程接口,可以用来连接数据库,访问数据等. DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持. Connection:用于连接某一指定的数据库 Statement : 提供了执行sql语句,获取查询结果的方法.有两个子接口.分别是: PrepareStatement:用于执行预编译的sql语句 ResultSet : 提供了对结果集处理的方法 JDBC Driver API 是面向驱动程序开发商的接口,JDBC驱动程序主要

JavaEE之JDBC编程[详解]

1.数据库简介 数据库(DB,Data Base ) 数据库管理系统(DBMS,Data Base Management System) 关系型数据库(RDB) 关系型数据库管理系统(RDBMS) SQL语言(Structured Query Language):使用关系模型的数据库语言,用于和各类数据库的交互,提供通用的数据管理和查询功能. 常用SQL指令:(CURD) SELECT .INSERT.DELETE.UPDATE.CREATE.DROP ODBC(Open DataBase Co

优化JDBC编程-多提提意见

优化JDBC编程这是我根据MS SQL SERVER 2000 JDBC DRIVER HELP,并参考其它资料整理而成.ms的这个帮助文件实在有失大家风范,示例代码很.....有兴趣者可以去下载http://download.microsoft.com/download/SQLSVR2000/jdbc/2000/NT45XP/EN-US/setup.exe.由于本人水平有限,文中不当之处请大家批评指正.1.尽量减少对数据库元数据方法的使用同样是产生一个ResultSet对象,DatabaseM

JavaWeb-16 JDBC编程进阶(自定义数据源+开源数据源:DBCP、C3P0)

JavaWeb-16 JDBC编程进阶(自定义数据源+开源数据源:DBCP.C3P0) 一.调用存储过程 a.存储过程是什么? 将一组SQL组合在一起,类似于java代码里面的函数 现实当中SQL命令不可能一条一条调用. 目的为了打包存储调用. 放在服务器上,已经编译好. 买烟的例子(一次买一根还是买一包?) b.代码:如何操作? 这些代码可以用java代码类比. 在代码框架里可以调用多行sql语句. 在代码中可以定义结束符号. 以后接触需要输入代码的机会少,因为别人需要程序员做的就是提供给程序

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

JDBC编程总结

JDBC编程总结 JDBC的基本原理JDBC是Java操作数据库的技术规范.他实际上定义了一组标准的操作数据库的接口.为了能让Java操作数据库,必须要有实现了JDBC这些接口的类,不同的数据库厂商为了让Java语言能操作自己的数据库,都提供了对JDBC接口的实现--这些实现了JDBC接口的类打成一个jar包,就是我们平时看到的数据库驱动.由于不同的数据库操作数据的机制不一样,因此JDBC的具体实现也就千差万别,但是你作为java程序员,你只和Java JDBC的接口打交到,才不用理会他们怎么实

JDBC编程的步骤

一.进行JDBC编程的步骤大致如下: 1.      加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动.如下代码: Class.forName(dirvirClass) 上面代码中的driverClass就是数据库驱动类所对应的字符串 加载MySQL数据库时采用的代码为: Class.forName("com.mysql.jdbc.Driver"); 2.      通过DriverManager获取数据库连接. DriverManager.getConnec

JDBC编程 之 增删改查

JDBC编程之数据增加,更改,查询,删除 1 package com.good.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 public class Main { 9 //1数据库连接的方法就独立出来了 10 public static Connection getConnec

JDBC编程理论知识(1)

1.SUN公司为统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC 2.JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成. 组成JDBC的2个包: (1)java.sql.*; (2)javax.sql.*; 3.JDBC在程序中的位置: 4.JDBC的六个固定步骤 1,注册数据库驱动[利用反射] 2,取得数据库连接对象Connection 3,创建SQL对象 4,执行SQL命令,并返回结果集 5,处理结果集 6,