java web项目操作mysql数据库的数据封装
2014-05-02 16:30
441 查看
在开发中, 我们常常会用到mysql数据库, 对操作mysql数据库的数据进入封装, 减少不必要代码的编写, 提高程序的逻辑性, 在开发项目时可以达到事关功倍的效果.
1. 在eclipse中, 新建一个动态web项目, File——>New——>Dynamic Web Project
2. 在src右键新建一个工具包util, 形如com.xxx.yyy.util, com表示商业性的, 也可是org(组织), 或cn(中国), xxx表示公司或组织或学校的简写,yyy表示项目应用的简写, 然后新建一个类, 名为ConnectionUtil.java
拷贝以下代码到ConnectionUtil.java里:
import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; public class ConnectionUtil { private static DataSource ds = null; static{ try{ Context initCtx = new InitialContext(); Context envCtx = (Context)initCtx.lookup("java:comp/env"); ds = (DataSource)envCtx.lookup("jdbc/WroxTC6"); } catch(Exception ex) { throw new RuntimeException(ex); } } public static Connection getConnection() throws SQLException { Connection conn = ds.getConnection(); return conn; } public static void returnConnection(Connection conn) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
在项目的.../WebContent/META-INF/下新建一个context.xml文件, 拷贝以下代码进context.xml里:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <Context> <Resource name="jdbc/WroxTC6" auth="Container" type="javax.sql.DataSource" maxActive="50" maxIdle="100" maxWait="10000" username="root" password="admin" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/b2cmall?useUnicode=true&characterEncoding=UTF-8" /> </Context>
其中上面有三处要进入修改, username 填写你的mysql用户名, 默认是root, password 填写你的mysql用户对应的密码, 最后替换b2cmall为你要连接的数据库名称。
除了上面ConnectionUtil.java和context.xml文件外, 还要有连接mysql数据库的驱动包JDBC:mysql-connector-java-5.1.30-bin.jar,其中5.1.30是mysql-connector-java驱动包的版本号, mysql-connector-java驱动包官方下载
将mysql-connector-java-5.1.30-bin.jar拷贝进.../WebContent/WEB-INF/lib/下即可。(ps:lib文件夹用来存在web项目需要使用的架包, 即类库)
3. ConnectionUtil.java、 context.xml、mysql-connector-java-5.1.30都准备后好, 开始编写DAO层
核心代码:
private Connection conn = null; private PreparedStatement pstmt = null; private ResultSet rs = null; try{ conn = ConnectionUtil.getConnection(); //对mysql数据库进入操作 ...... }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(rs != null) rs.close(); if(pstmt != null) pstmt.close(); if(conn != null) conn.close(); }catch(Exception ex){ ex.printStackTrace(); } }
下面是一个简单的例子:
MemberDao.java代码(ps:此处暂时不考虑sql注入等问题, 所以暂时不过滤sql不安全字符):
package com.b2c.model;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com.b2c.common.Member;import com.b2c.util.ConnectionUtil;//数据库访问层--会员public class MemberDao {private Connection conn = null;private PreparedStatement pstmt = null;private ResultSet rs = null;/*** 注册,注意积分和级别的确定;密码需要通过加密算法处理后保存。* @param member* @return*/public int add(Member member){int val = 0;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "INSERT INTO member(email,nick,password,credit,layerid,rDatetime,lastlogintime,lastloginip) VALUES(?,?,?,?,?,?,?,?)";pstmt = conn.prepareStatement(sql);pstmt.setString(1, member.getEmail());pstmt.setString(2, member.getNick());pstmt.setString(3, member.getPassword());pstmt.setInt(4, member.getCredit());pstmt.setInt(5, member.getLayerid());pstmt.setString(6, member.getrDatetime());pstmt.setString(7, member.getLastLoginTime());pstmt.setString(8, member.getLastLoginIp());val = pstmt.executeUpdate();}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return val;}/*** 会员信息修改* @param member* @return*/public int update(Member member){int val = 0;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "UPDATE member SET email=?, nick=?, password=?, credit=?, layerid=?, rDatetime=?, lastlogintime=?, lastloginip=? WHERE id=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, member.getEmail());pstmt.setString(2, member.getNick());pstmt.setString(3, member.getPassword());pstmt.setInt(4, member.getCredit());pstmt.setInt(5, member.getLayerid());pstmt.setString(6, member.getrDatetime());pstmt.setString(7, member.getLastLoginTime());pstmt.setString(8, member.getLastLoginIp());pstmt.setInt(9, member.getId());val = pstmt.executeUpdate();}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return val;}/*** 根据id删除会员* @param id* @return*/public int delete(Integer id){int val = 0;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "DELETE FROM member WHERE id=" + id;pstmt = conn.prepareStatement(sql);val = pstmt.executeUpdate();}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return val;}/*** 登录,验证用户的合法性。同时注意密码需要通过加密算法处理然后匹配。* @param username* @param pasword* @return*/public boolean validate(String username, String pasword){boolean flag = false;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "SELECT * FROM member WHERE email=? AND password=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, username);pstmt.setString(2, pasword);rs = pstmt.executeQuery();if(rs.next())flag = true;}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return flag;}/*** 重置密码,将某个用户的密码重置为新密码* @param username* @param password* @return*/public int resetPassword(String email, String password){int val = 0;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "UPDATE member set password=? WHERE email=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, password);pstmt.setString(2, email);val = pstmt.executeUpdate();}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return val;}/*** 根据id查询会员* @param id* @return*/public Member findById(Integer id){Member memb = null;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "SELECT * FROM member WHERE id=" + id;pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();if(rs.next()){memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));}}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return memb;}/*** 根据邮箱email查询会员* @param email* @return*/public Member findByEmail(String email){Member memb = null;String sql = "";try{conn = ConnectionUtil.getConnection();sql = "SELECT * FROM member WHERE email=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, email);rs = pstmt.executeQuery();if(rs.next()){memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));}}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return memb;}/*** 根据查询条件分布查询会员* @param sqlCause* @param startindex* @param size* @return*/public List<Member> findList(String sqlCause, int startindex, int size){List<Member> list = null;Member memb = null;String sql = "";try{list = new ArrayList<Member>();conn = ConnectionUtil.getConnection();sql = "SELECT * FROM member ";if(!sqlCause.equals(""))sql += "WHERE " + sqlCause;sql += " LIMIT ?,?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, startindex);pstmt.setInt(2, size);rs = pstmt.executeQuery();while(rs.next()){memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));list.add(memb);}}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return list;}/*** 查找所有会员* @return*/public List<Member> findList(){List<Member> list = null;Member memb = null;String sql = "";try{list = new ArrayList<Member>();conn = ConnectionUtil.getConnection();sql = "SELECT * FROM member";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while(rs.next()){memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));list.add(memb);}}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return list;}/*** 根据查询条件获取记录数* @param sqlCause* @return*/public int findCount(String sqlCause){int count = 0;String sqlQuery = "";try{conn = ConnectionUtil.getConnection();sqlQuery = "SELECT count(*) FROM member ";if(!sqlCause.equals(""))sqlQuery += "WHERE " + sqlCause;pstmt = conn.prepareStatement(sqlQuery);rs = pstmt.executeQuery();rs.next();count = rs.getInt(1);}catch(Exception e){e.printStackTrace();}finally{try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}}return count;}}
4. 本人打包了struts2所需架包及上面的提及到的ConnectionUtil.java、 context.xml、mysql-connector-java-5.1.30, 点击下载
5. 以上的代码还不能更好地体验数据的封装, 比如上面不断重复以下代码:
try{if(rs != null)rs.close();if(pstmt != null)pstmt.close();if(conn != null)conn.close();}catch(Exception ex){ex.printStackTrace();}
对于重复的代码, 我们应该合并为一个方法即可。下面在此进行进一步优化...结构如下:
上面DBConnectionUtil.java和db.properties两个文件是关键, db.properties封装mysql的用户名、密码、jdbc驱动包、数据库源,文件后缀名一定要为.properties.
db.properties代码内容如下:
user=rooturl=jdbc\:mysql\://localhost\:3306/b2cmall?useUnicode=true&characterEncoding=UTF-8password=admindriver=com.mysql.jdbc.Driver
DBConnectionUtil.java封装了连接mysql数据库的驱动管理实例, 代码如下:
import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Properties;public class DBConnectionUtil {private static String user;private static String password;private static String url;private static String driver;static {try {ClassLoader classLoader = DBConnectionUtil.class.getClassLoader();InputStream is = classLoader.getResourceAsStream("config/props/db.properties");Properties props = new Properties();props.load(is);url = props.getProperty("url");user = props.getProperty("user");password = props.getProperty("password");driver = props.getProperty("driver");// 注册驱动Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();throw new RuntimeException("找不到驱动");} catch (IOException e) {e.printStackTrace();throw new RuntimeException("加载properties文件错误");}}/*** 获取连接* @return* @throws Exception*/public static Connection getConnection() throws Exception {return DriverManager.getConnection(url, user, password);}/*** 关闭连接* @param conn* @param pstmt* @param rs* @throws Exception*/public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) throws Exception {if (rs != null)rs.close();if (pstmt != null)pstmt.close();if (conn != null)conn.close();}}
将上面的DBConnectionUtil.java、db.properties、和mysql-connector-java-5.1.30-bin.jar驱动包放置到各自相应的位置即可, 使用示例如下:
MemberDao.java代码内容(增强版):
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com.gditc.b2cmall.common.Member;import com.gditc.b2cmall.util.DBConnectionUtil;//数据库访问层--会员public class MemberDao {private Connection conn = null;private PreparedStatement pstmt = null;private ResultSet rs = null;/*** 注册,注意积分和级别的确定;密码需要通过加密算法处理后保存。* @param member* @return* @throws Exception*/public int add(Member member) throws Exception{int val = 0;String sql = "";try{conn = DBConnectionUtil.getConnection();sql = "INSERT INTO member(email,nick,password,credit,layerid,rDatetime,lastlogintime,lastloginip) VALUES(?,?,?,?,?,?,?,?)";pstmt = conn.prepareStatement(sql);pstmt.setString(1, member.getEmail());pstmt.setString(2, member.getNick());pstmt.setString(3, member.getPassword());pstmt.setInt(4, member.getCredit());pstmt.setInt(5, member.getLayerid());pstmt.setString(6, member.getrDatetime());pstmt.setString(7, member.getLastLoginTime());pstmt.setString(8, member.getLastLoginIp());val = pstmt.executeUpdate();}catch(Exception e){e.printStackTrace();}finally{DBConnectionUtil.close(conn, pstmt, rs);}return val;}/*** 会员信息修改* @param member* @return* @throws Exception*/public int update(Member member) throws Exception {int val = 0;String sql = "";try {conn = DBConnectionUtil.getConnection();sql = "UPDATE member SET email=?, nick=?, password=?, credit=?, layerid=?, rDatetime=?, lastlogintime=?, lastloginip=? WHERE id=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, member.getEmail());pstmt.setString(2, member.getNick());pstmt.setString(3, member.getPassword());pstmt.setInt(4, member.getCredit());pstmt.setInt(5, member.getLayerid());pstmt.setString(6, member.getrDatetime());pstmt.setString(7, member.getLastLoginTime());pstmt.setString(8, member.getLastLoginIp());pstmt.setInt(9, member.getId());val = pstmt.executeUpdate();} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return val;}/*** 根据id删除会员* @param id* @return* @throws Exception*/public int delete(Integer id) throws Exception {int val = 0;String sql = "";try {conn = DBConnectionUtil.getConnection();sql = "DELETE FROM member WHERE id=" + id;pstmt = conn.prepareStatement(sql);val = pstmt.executeUpdate();} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return val;}/*** 登录,验证用户的合法性。同时注意密码需要通过加密算法处理然后匹配。* @param username* @param pasword* @return* @throws Exception*/public boolean validate(String username, String pasword) throws Exception {boolean flag = false;String sql = "";try {conn = DBConnectionUtil.getConnection();sql = "SELECT * FROM member WHERE email=? AND password=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, username);pstmt.setString(2, pasword);rs = pstmt.executeQuery();if(rs.next())flag = true;} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return flag;}/*** 重置密码,将某个用户的密码重置为新密码* @param username* @param password* @return* @throws Exception*/public int resetPassword(String email, String password) throws Exception {int val = 0;String sql = "";try {conn = DBConnectionUtil.getConnection();sql = "UPDATE member set password=? WHERE email=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, password);pstmt.setString(2, email);val = pstmt.executeUpdate();} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return val;}/*** 根据id查询会员* @param id* @return* @throws Exception*/public Member findById(Integer id) throws Exception {Member memb = null;String sql = "";try{conn = DBConnectionUtil.getConnection();sql = "SELECT * FROM member WHERE id=" + id;pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();if(rs.next()){memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));}} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return memb;}/*** 根据邮箱email查询会员* @param email* @return* @throws Exception*/public Member findByEmail(String email) throws Exception {Member memb = null;String sql = "";try {conn = DBConnectionUtil.getConnection();sql = "SELECT * FROM member WHERE email=?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, email);rs = pstmt.executeQuery();if(rs.next()){memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));}} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return memb;}/*** 根据查询条件分布查询会员* @param sqlCause* @param startindex* @param size* @return* @throws Exception*/public List<Member> findList(String sqlCause, int startindex, int size) throws Exception {List<Member> list = null;Member memb = null;String sql = "";try {list = new ArrayList<Member>();conn = DBConnectionUtil.getConnection();sql = "SELECT * FROM member ";if(!sqlCause.equals(""))sql += "WHERE " + sqlCause;sql += " LIMIT ?,?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, startindex);pstmt.setInt(2, size);rs = pstmt.executeQuery();while(rs.next()) {memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));list.add(memb);}} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return list;}/*** 查找所有会员* @return* @throws Exception*/public List<Member> findList() throws Exception {List<Member> list = null;Member memb = null;String sql = "";try{list = new ArrayList<Member>();conn = DBConnectionUtil.getConnection();sql = "SELECT * FROM member";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while(rs.next()) {memb = new Member();memb.setId(rs.getInt("id"));memb.setEmail(rs.getString("email"));memb.setNick(rs.getString("nick"));memb.setPassword(rs.getString("password"));memb.setCredit(rs.getInt("credit"));memb.setLayerid(rs.getInt("layerid"));memb.setrDatetime(rs.getString("rDatetime"));memb.setLastLoginTime(rs.getString("lastlogintime"));memb.setLastLoginIp(rs.getString("lastloginip"));list.add(memb);}} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return list;}/*** 根据查询条件获取记录数* @param sqlCause* @return* @throws Exception*/public int findCount(String sqlCause) throws Exception {int count = 0;String sqlQuery = "";try {conn = DBConnectionUtil.getConnection();sqlQuery = "SELECT count(*) FROM member ";if(!sqlCause.equals(""))sqlQuery += "WHERE " + sqlCause;pstmt = conn.prepareStatement(sqlQuery);rs = pstmt.executeQuery();rs.next();count = rs.getInt(1);} catch(Exception e) {e.printStackTrace();} finally {DBConnectionUtil.close(conn, pstmt, rs);}return count;}}
至此, 我们减少了更多重复代码的编写,逻辑性也更加良好, 更好地体验到数据封装的理念...
6. OK. Enjoy it!!!
相关文章推荐
- 酒店管理系统_02-Servlet版本-mysql数据库(使用方法封装自动创建数据表)
- 项目经验之:利用Jquery+HTML静态模版实现数据的展示及无刷新增加,修改,删除,分页操作!!!
- python对MySQL数据库的操作表单的创建,数据的插入,读取,更新,删除操作
- python-mysql数据库操作封装
- 以MyBatis+SpringMVC3.0实现的,借鉴了Hibernate设计思想,采用封装、抽象、继承的设计思想,做到了数据与相应的操作的高内聚低耦合的实现
- 队列的基本操作应用---舞伴问题(数据结构实验项目三)
- 数据和操作的封装
- 项目实战:JSON数据封装与解析及常见问题(文末小彩蛋)
- MySQL数据库操作3-数据表操作1-创建,约束
- Eclipse java web项目 ,导入IntelliJ IDEA 完整操作步骤
- 页面foreach遍历显示数据时,当要操作某个具体项目时,项目id只能从遍历项目体里传递出来。---循环体里的,动态的页面条目,比较抽象【很容易忘!牢记思路】
- 第八周实践项目2-用对象数据操作长方柱类
- 一个电商项目的Web服务化改造6:单元测试4步走,构造数据、执行操作、断言、回滚
- mysql数据库数据表的相关操作
- java web从网页表单输入数据存储到MySQL数据库
- 使用JDBC连接MySQL数据库--典型案例分析(一)---员工数据读取与操作
- 两个做项目最常用功能操作的封装类 (1)
- C#(.NET)数据访问连接、查询、插入等操作的封装类
- mysql数据库中命令行下常用命令的操作(增、删、改、查)和数据类型
- 一个项目配置多个数据源进行数据操作,简单方便。