JDBC 와 데이터베이스 연결 탱크 에 대해 얼마나 알 고 있 습 니까?
JAVA 데이터베이스 연결 자바 데이터베이스 연결
SUN 회사 가 제공 하 는 데이터베이스 접근 규칙, 규범 은 데이터베이스 종류 가 비교적 많 고 자바 언어 사용 이 광범 위 하기 때문에 sun 회 사 는 규범 을 제공 하여 다른 데이터 베이스 공급 업 체 로 하여 금 기본 적 인 방문 규칙 을 실현 하 게 한다.우리 자바 프로그램 은 sun 회사 가 제공 하 는 jdbc 드라이브 만 사용 하면 됩 니 다.
1.1 JDBC 를 사용 하 는 기본 절차
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//
DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=root");
// : + , : , : 。
//
conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");
// statement, ,
st = conn.createStatement();
// ,
String sql = "select * from stu";
rs = st.executeQuery(sql);
//
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("id=" + id + "==name==" + name + "==age==" + age);
}
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) { } // ignore
rs = null;
}
...
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// Driver , , 。 。
// ---> , 。 java.sql.DriverManager.registerDriver(new Driver());
// 。
Class.forName("com.mysql.jdbc.Driver");
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
// JDBC
public class JDBCUtil {
static String driverClass = null;
static String url = null;
static String name = null;
static String password= null;
static {
try {
//1.
Properties properties = new Properties();
InputStream is = new FileInputStream("jdbc.properties");
// , src
// InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 。
properties.load(is);
//
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* @return
*/
public static Connection getConn() {
Connection conn = null;
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(url, name, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
*
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs = null;
}
}
private static void closeSt(Statement st) {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
st = null;
}
}
private static void closeConn(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
1.3 데이터베이스 의 CRUD
INSERT INTO t_stu (name, age) VALUES ('wangqiang', 28);
INSERT INTO t_stu VALUES (NULL, 'wangqiang2', 28);
// 1.
conn = JDBCUtil.getConn();
// 2. , statement
st = conn.createStatement();
// 3.
String sql = "insert into t_stu values(null , 'aobama' , 59)";
// , 0 ,
int result = st.executeUpdate(sql);
if (result > 0) {
System.out.println(" ");
} else {
System.out.println(" ");
}
DELETE FROM t_stu WHERE id = 6;
// 1.
conn = JDBCUtil.getConn();
// 2. , statement
st = conn.createStatement();
// 3.
String sql = "delete from t_stu where name='aobama'";
// , 0 ,
int result = st.executeUpdate(sql);
if (result > 0) {
System.out.println(" ");
} else {
System.out.println(" ");
}
SELECT * FROM t_stu;
// 1.
conn = JDBCUtil.getConn();
// 2. , statement
st = conn.createStatement();
// 3. sql , ResultSet
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
// 4.
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + " " + age);
}
UPDATE t_stu SET age = 38 WHERE id = 1;
// 1.
conn = JDBCUtil.getConn();
// 2. , statement
st = conn.createStatement();
// 3.
String sql = "update t_stu set age = 26 where name ='qyq'";
// , 0 ,
int result = st.executeUpdate(sql);
if (result > 0) {
System.out.println(" ");
} else {
System.out.println(" ");
}
1.4 Dao 모드
Data Access 개체 데이터 액세스 대상
/**
*
*/
public interface UserDao {
/**
*
*/
void findAll();
}
public class UserDaoImpl implements UserDao{
@Override
public void findAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1.
conn = JDBCUtil.getConn();
//2. statement
st = conn.createStatement();
String sql = "select * from t_user";
rs = st.executeQuery(sql);
while(rs.next()){
String userName = rs.getString("username");
String password = rs.getString("password");
System.out.println(userName+"="+password);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
}
@Test
public void testFindAll(){
UserDao dao = new UserDaoImpl();
dao.findAll();
}
String sql = "select * from t_user where username='"+ username +"' and password='"+ password +"'";
UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88' or '1=1"); //
// SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1'
// sql , , 。 。
rs = st.executeQuery(sql);
1.6 PrepareStatement
이 대상 은 앞의 statement 대상 을 교체 하 는 것 입 니 다.
String sql = "insert into t_user values(null , ? , ?)";
ps = conn.prepareStatement(sql);
// ,1 , 1 。
ps.setString(1, userName);
ps.setString(2, password);
2 데이터베이스 연결 풀
2.1 사용자 정의 데이터베이스 연결 풀
/*
* 1. 10 。
* 2. getConnection
* 3. , addBack 。
* 4. 。
*/
public class MyDataSource implements DataSource {
List <Connection> list = new ArrayList<Connection>();
public MyDataSource() {
for (int i = 0; i < 10; i++) {
Connection conn = JDBCUtil.getConn();
list.add(conn);
}
}
//
@Override
public Connection getConnection() throws SQLException {
// , , 。
if(list.size() == 0 ){
for (int i = 0; i < 5; i++) {
Connection conn = JDBCUtil.getConn();
list.add(conn);
}
}
//remove(0) ---> 。 。
Connection conn = list.remove(0);
return conn;
}
/**
* , 。
* @param conn
*/
public void addBack(Connection conn){
list.add(conn);
}
......
}
UserDao dao = new UserDaoImpl();
dao.insert();
DataSource dataSource = new MyDataSource();
// addBack 。
2.2 사용자 정의 데이터베이스 연결 탱크 에 발생 하 는 문 제 를 해결한다.
addBack 방법 이 하나 더 생 겼 기 때문에 이 연결 탱크 를 사용 하 는 곳 은 이 방법 을 추가 로 기억 해 야 하 며 인터페이스 프로 그래 밍 을 할 수 없습니다.
우 리 는 인터페이스 에 있 는 그 close 방법 을 수정 할 계획 이다.원래 의 Connection 대상 의 close 방법 은 정말 연결 을 닫 는 것 입 니 다.이 close 방법 을 수정 하려 고 합 니 다. 나중에 close 를 호출 하려 고 합 니 다. 실제 닫 는 것 이 아니 라 연결 대상 을 돌려 주 는 것 입 니 다.
2.3 어떤 방법 을 어떻게 확장 합 니까?
원래 있 는 방법의 논 리 는 우리 가 원 하 는 것 이 아니다.자기 논 리 를 고치 고 싶 어 요.
3. 오픈 소스 연결 풀
3.1 DBCP
public void testDBCP01() {
Connection conn = null;
PreparedStatement ps = null;
try {
// 1.
BasicDataSource dataSource = new BasicDataSource();
// , , , 。。
// jdbc:mysql://localhost/bank : :// /
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost/bank");
dataSource.setUsername("root");
dataSource.setPassword("root");
// 2.
conn = dataSource.getConnection();
String sql = "insert into account values(null , ? , ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "admin");
ps.setInt(2, 1000);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
}
#
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bank
username=root
password=root
#
initialSize=10
#
maxActive=50
#
maxIdle=20
#
minIdle=5
#
maxWait=60000
#JDBC :[ =property;]
# :"user" "password" , 。
connectionProperties=useUnicode=true;characterEncoding=gbk
# (auto-commit) 。
defaultAutoCommit=true
#driver default (TransactionIsolation)。
# :( javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
Connection conn = null;
PreparedStatement ps = null;
try {
BasicDataSourceFactory factory = new BasicDataSourceFactory();
Properties properties = new Properties();
InputStream is = new FileInputStream("src//dbcpconfig.properties");
properties.load(is);
DataSource dataSource = factory.createDataSource(properties);
//2.
conn = dataSource.getConnection();
String sql = "insert into account values(null, ? , ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "liangchaowei");
ps.setInt(2, 100);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
3.2 C3P0
Connection conn = null;
PreparedStatement ps = null;
try {
// 1. datasource
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 2.
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
dataSource.setUser("root");
dataSource.setPassword("root");
// 2.
conn = dataSource.getConnection();
String sql = "insert into account values(null , ? , ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "admi234n");
ps.setInt(2, 103200);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps);
}
// xml default-config 。
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 1.
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
dataSource.setUser("root");
dataSource.setPassword("root");
// 2.
conn = dataSource.getConnection();
String sql = "insert into account values(null , ? , ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "admi234n");
ps.setInt(2, 103200);
3.3.1 첨삭
//dbutils CRUD , 。
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
//
queryRunner.update("insert into account values (null , ? , ? )", "aa" ,1000);
//
queryRunner.update("delete from account where id = ?", 5);
//
queryRunner.update("update account set money = ? where id = ?", 10000000 , 6);
3.3.2 조회
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
Account account = queryRunner.query("select * from account where id = ?", new ResultSetHandler<Account>(){
@Override
public Account handle(ResultSet rs) throws SQLException {
Account account = new Account();
while(rs.next()){
String name = rs.getString("name");
int money = rs.getInt("money");
account.setName(name);
account.setMoney(money);
}
return account;
}
}, 6);
System.out.println(account.toString());
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
//
Account account = queryRunner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), 8);
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
List<Account> list = queryRunner.query("select * from account ",new BeanListHandler<Account>(Account.class));
//
BeanHandler, //
BeanListHandler, // List
// -------------------------------------------------
ArrayHandler, //
ArrayListHandler, // , 。
MapHandler, // map
MapListHandler, // , map。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.