Java 数据库篇
一、简易封装JDBC工具类:
package com.jackie.MyBatis.main; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class JdbcHelper { private static Connection conn = null; static {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8";
String user = "jackie";
String pass = "123456";
conn = DriverManager.getConnection(url, user, pass);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
} private void close(ResultSet rs, Statement stmt, Connection conn) {
try {
if(rs != null && !rs.isClosed()) {
rs.close();
}
if(stmt != null && !stmt.isClosed()) {
stmt.close();
}
if(conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} public Role getRole(int id) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
String sql = "select * from role where id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1, id); // 注意从1开始计数
rs = ps.executeQuery(); Role role = null;
while(rs.next()) {
int roleId = rs.getInt("id");
String name = rs.getString("name");
role = new Role(roleId, name);
}
return role;
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
this.close(rs, ps, conn);
}
}
}
实体类Role:
package com.jackie.MyBatis.main;
public class Role {
private int id;
private String name;
public Role(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "[" + id + "," + name + "]";
}
// getter and setter omitted
}
使用:
public class Test {
public static void main(String[] args) {
JdbcHelper helper = new JdbcHelper();
System.out.println(helper.getRole(1));
}
}
二、三层架构:
配置数据源 context.xml(也可以使用一些第三方的数据源库,如 c3p0):
<?xml version="1.0" encoding="UTF-8"?>
<context>
<resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="jackie"
password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8" />
</context>
Dao层:
BaseDao:
package com.jackie.MyBatis.dao; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; public class BaseDao { /**
* 查找JNDI,获得数据源对象,再获得数据库连接对象
*/
private Connection getConnection() {
Connection conn = null;
Context ctx = null;
try {
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
conn = ds.getConnection();
} catch (NamingException | SQLException e) {
e.printStackTrace();
}
if(conn == null) {
System.err.println("无法建立数据库连接");
}
return conn;
} private void closeAll(Connection conn, Statement stmt, ResultSet rs) {
try {
if(rs != null & !rs.isClosed()) {
rs.close();
}
if(stmt != null & !stmt.isClosed()) {
stmt.close();
}
if(conn != null & !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} private void closeAll(Connection conn, Statement stmt) {
closeAll(conn, stmt, null);
} public int executeUpdate(String sql, Object... params) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
if(conn != null && !conn.isClosed()) {
pstmt = conn.prepareStatement(sql);
if(params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
result = pstmt.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(conn, pstmt);
}
return result;
} public Object executeQuery(RSProcessor processor, String sql, Object... params ) {
Object result = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
if(conn != null && !conn.isClosed()) {
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
rs = pstmt.executeQuery();
result = processor.process(rs);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(conn, pstmt, rs);
}
return result;
} }
RSProcessor:
package com.jackie.MyBatis.dao; import java.sql.ResultSet;
import java.sql.SQLException; /**
* 用于将Result对象指向的数据,转换成想要的对象
*/
public interface RSProcessor {
Object process(ResultSet rs) throws SQLException;
}
数据Dao —— UserDao:
package com.jackie.MyBatis.dao;
import java.util.List;
import com.jackie.MyBatis.domain.User;
public interface UserDao {
List<User> getAllUsers();
User getUserByName(String userName);
int addUser(User user);
}
Java 数据库篇的更多相关文章
- Jdbc访问数据库篇
一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...
- 【java 理论篇 2】J2EE的13种规范
导读:看完了J2EE的视频,没有什么技术实践,现在就从理论上说明一下J2EE的13种规范,以及现在的自己对它的一个理解.可能会有偏差,但是,算是做为目前的一个记录. 一.13种规范 1.1.JDBC( ...
- (六) Java数据库
一.概述 程序开发没有数据库的参与,可以说几乎是不可能的.数据库和Java都已经有了简单的了解,现在的关键是对两者进行连接,起到这一作用的正是JDBC——Java Database Connectiv ...
- JDBC与JAVA数据库编程
一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. JDBC的主要功能 a) 创建 ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
- Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
- java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
随机推荐
- 转:Image与byte之间互转
#region<Image 与 byte之间互转> /// <summary> /// 将一个byte转换成一个Bitmap对象 /// </summary> // ...
- 底层代码创建GUI
%底层代码创建GUI hf = figure(... 'Units','Normalized',... 'Color','w',... 'Position',[0.1 0.1 0.8 0.8]); h ...
- sass中的循环判断条件语句
@if $lte7:true !default;//是否兼容ie6,7 //inline-block //ie6-7 *display: inline;*zoom:1; @mixin inline-b ...
- 利用vue写一个复选框的组件
HTML <multicheck :source=tlist :busValue='objInfo.tt' @getTt="getTtInfo"></multic ...
- Action的编写方式
四.Action 的编写方式 : 三种 第一种 创建普通类 不继承任何类,不实现任何接口 Public class HelloAction{ } 第二种 创建类,实现接口action Public ...
- makefile 变量展开
Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) value1 = 6 最终$(value2)就变成了6 := 是直接展开 ...
- java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream at org.apach ...
- 20145319 《网络渗透》免考—API拦截技术
20145319 <网络渗透>免考-API拦截技术 概述 本次实验在window环境下进行,主要通过编写hook代码和注入程序,将我们的hook代码通过dll文件的形式注入到目标中,拦截其 ...
- 20145326蔡馨熤《网络对抗》—— Web安全基础实践
20145326蔡馨熤<网络对抗>—— Web安全基础实践 1.实验后回答问题 (1)SQL注入攻击原理,如何防御. 原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程 ...
- ubuntu上解决访问github慢的方法
1.进入终端命令行模式,输入sudo vi /etc/hosts 2.输入i进入编辑命令,英文输入法输入G,vim编辑器跳到hosts文件的最后一行 3.用浏览器访问 IPAddress.com 使用 ...