Java数据库连接技术
使用mysql作为开发数据库,创建user表。创表语句如下:
create database learn;
use learn;
CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(32), age INT);
INSERT INTO user(NAME, age) VALUES('coshaho', 29);
INSERT INTO user(NAME, age) VALUES('cauchy', 29);
一、使用Java直接连接mysql
1、添加mysql驱动
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
2、连接代码如下
package com.coshaho.jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* Java连接数据库
* @author coshaho
*/
public class MysqlConnector
{
public static void main(String[] args)
{
Connection con = null;
Statement statement = null;
ResultSet rs = null;
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://132.232.35.119:3306/learn";
String user = "root";
String password = "root";
try
{
Class.forName(driver);
// 使用DriverManager获取连接
con = DriverManager.getConnection(url,user,password);
// 创建statement类对象,用来执行SQL语句!!
statement = con.createStatement();
String sql = "select * from user";
rs = statement.executeQuery(sql);
System.out.println("name" + "\t" + "age"); int age = 0;
String name = null;
while(rs.next())
{
// ResultSet获取返回值时,列名不区分大小写
name = rs.getString("nAme");
age = rs.getInt("age");
System.out.println(name + "\t" + age);
}
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
// 从内向外释放连接
try
{
if(null != rs)
{
rs.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
try
{
if(null != statement)
{
statement.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
try
{
if(null != con)
{
con.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
3、执行效果
二、使用连接池连接数据库
这里以C3p0连接池作为样例,连接池里的连接使用完后,需要主动释放。
1、maven配置如下。
<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
2、C3p0配置文件名字必须为c3p0-config.xml,并且放到classpath下。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config>
<!-- 默认C3p0配置 -->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://132.232.35.119:3306/learn</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config> <!--以name为标识的数据源 -->
<named-config name="mysql">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://132.232.35.119:3306/learn</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</named-config>
</c3p0-config>
3、测试代码
package com.coshaho.datasource; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource; /**
* C3p0连接池
* @author coshaho
*/
public class C3p0DataSource
{
private static ComboPooledDataSource ds = new ComboPooledDataSource("MySQL"); public static Connection getConnection() throws SQLException
{
return ds.getConnection();
} /**
* 需要主动释放连接,这里调用的close方法并非关闭连接,而是归还到连接池
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn,Statement st,ResultSet rs)
{
if(null != rs)
{
try
{
rs.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
if(null != st)
{
try
{
st.close();
}
catch (Exception e)
{
e.printStackTrace();
}
} if(null != conn)
{
try
{
conn.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
} public static void main(String[] args)
{
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try
{
conn = C3p0DataSource.getConnection();
String sql = "insert into user(name, age) values(?, ?)";
st = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
st.setString(1, "hkx");
st.setInt(2, 30);
st.executeUpdate();
// 获取数据库自动生成的主键
rs = st.getGeneratedKeys();
if(rs.next()){
System.out.println(rs.getInt(1));
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
C3p0DataSource.release(conn, st, rs);
}
}
}
三、Spring与C3p0整合
spring集成c3p0,实际上,就是让spring初始化c3p0实例,并用jdbcTemplate管理。这里需要注意的是,使用jdbcTemplate直接执行sql,不需要手动释放连接,jdbcTemplate已经帮你自动释放连接了。
1、spring maven配置
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.4.RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>
2、spring文件配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 引入jdbc配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 使用spring初始化DataSource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!-- 使用JdbcTemplate封装DataSource -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://132.232.35.119:3306/learn
jdbc.user=root
jdbc.password=root
3、测试代码
package com.coshaho.datasource; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate; public class SpringJdbcTest
{
private static ApplicationContext context;
public static void main(String[] args)
{
String xmlpath = "spring.xml";
context = new ClassPathXmlApplicationContext(xmlpath);
JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
jdbcTemplate.update("insert into user(name, age) values (?, ?)",
"Jack", 20);
}
}
Java数据库连接技术的更多相关文章
- Java数据库连接技术——JDBC
大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...
- 【学习笔记】JDBC数据库连接技术(Java Database Connectivity)
一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称.它可以把数据持久保存,是一种持久化机制. 1.持久化 持久化就是将程序中的数据在瞬时状态和 ...
- JDBC数据库连接技术
[学习笔记]JDBC数据库连接技术(Java Database Connectivity) 一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称 ...
- Java数据库连接池
转载过来的,最近在做一个小网站,准备使用这种方法. Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...
- Java分布式应用技术架构介绍
分布式架构的演进 系统架构演化历程-初始阶段架构
- 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写
基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作 ...
- Java数据库连接--JDBC调用存储过程,事务管理和高级应用
相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
- Java分布式应用技术架构
分布式架构的演进 系统架构演化历程-初始阶段架构初始阶段 的小型系统 应用程序.数据库.文件等所有的资源都在一台服务器上通俗称为LAMP特征:应用程序.数据库.文件等所有的资源都在一台服务器上.描述: ...
- Java数据库连接池详解
http://www.javaweb1024.com/java/JavaWebzhongji/2015/06/01/736.html 对于共享资源,有一个很著名的设计模式:资源池(Resource P ...
随机推荐
- [ java 工具类] xml字符串解析成Map(DOM解析)
package com.tencent.jungle.wechat.util; import com.google.inject.Singleton; import org.w3c.dom.Docum ...
- redis在php中的基本使用
//使用autoload加载相关库,这边重点就是为了require $file; spl_autoload_register(function($class) { $file = __DIR__.’/ ...
- gcc编译c语言程序
编译:当前源代码编译成二进制目标文件(.obj文件) 链接(link):将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件). 一个现代编译器的主要工作流程如下: 源程序 ...
- C_C++变量命名规则
变量命名规则是为了增强代码的可读性和容易维护性.以下为C++必须遵守的变量命名规则: 变量名只能是字母(A-Z,a-z)和数字(0-9)或者下划线(_)组成. 第一个字母必须是字母或者下划线开头. 不 ...
- JS开发中常用的小技巧
1.获取指定范围内的随机数 1 2 3 function getRadomNum(min,max){ return Math.floor(Math.random() * (max - min ...
- Spring Security http标签的use-expressions="true"属性
如果声明为true,那么在access属性要用hasRole()这样写: <intercept-url pattern="/secure/extreme/**" access ...
- vmare 往 virtualbox迁移
vmare实在太卡了.抓狂. 于是想迁移到virtualbox观察下. 谷歌了下方案,发现众说纷纭. 有操作超级复杂的,比如:http://stackoverflow.com/questions/69 ...
- python基础类型—数字(Number)
Python3 支持 int.float.bool.complex(复数). 在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long. 像大多数语言一样,数 ...
- Nest.js 拦截器
Docs: https://docs.nestjs.com/interceptors 该对象包含从路由处理程序返回的值 在方法执行之前/之后绑定额外的逻辑 转换函数返回的结果 转换从函数抛出的异常 / ...
- gnome-shell 扩展
application menu topicons plus dash to dock native window placement netspeed no topleft hot corner o ...