java EE学习之数据库操作
jdbc开发流程
- 注册驱动
- 建立连接(Connection)
- 创建运行SQL的语句(Statement)
- 运行语句
- 处理运行结果(ResultSet)
- 释放资源
注冊驱动有三种方式:
Class.forName("com.mysql.jdbc.Driver"); // 推荐
DriverManager.registerDriver(com.mysql.jdbc.Driver);
System.setProperty(“jdbc.drivers”, “driver1:driver2”);
获取mysql链接对象
DriverManager.getConnection(url,数据库用户名,数据库密码);
设置编码
url后面加上?useUnicode=true&characterEncoding=utf8
插入数据写法
String sql = "insert into category(cid,cname) values(?,?)";
st = coon.prepareStatement(sql);
st.setString(1,"c1003");
st.setString(2,"鞋子");
executeUpdate和executeQuery
executeUpdate(String sql) 返回的是影响的行数,int类型数据,增加、删除、修改使用executeUpdate
executeQuery(String sql) 返回ResultSet对象,查询时使用,遍历使用rs.next()
execute(String sql) 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。
T2.java
public class T2 {
@Test
public void f1() {
Connection coon;
PreparedStatement st;
ResultSet rs = null;
try {
coon = JdbcUtil.getConnection();
String sql = "insert into category(cid,cname) values(?,?)";
st = coon.prepareStatement(sql);
st.setString(1,"c1003");
st.setString(2,"鞋子");
int i = st.executeUpdate();
if(i != 0) {
System.out.print("添加成功");
}
JdbcUtil.closeResource(coon, st, rs);
} catch (Exception e) {
e.printStackTrace();
}
}
}
JdbcUtil.java
public class JdbcUtil {
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8","root","123456");
}
public static void closeResource(Connection coon,PreparedStatement st,ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(coon != null) {
try {
coon.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
coon = null;
st = null;
rs = null;
}
}
通过配置 properties 文件设置数据库连接信息
获取 properties 文件对象可以使用 ResourceBundle 工具类。
- 获取 ResourceBundle 对象——>getBundle("不带后缀的文件名称")
- 通过 ResourceBundle 获取配置信息——>getString(String key)
快捷键
通过调用方法快速生命类的对象 ——> ctrl+2 松手后按l
竖向选择 ——> alt+shift+a
快速定位问题 ——> ctrl+1
变大写 ——> ctrl+shift+x
变小写 ——> ctrl+shift+y
向上复制一行 ——> alt+ctrl+方向上键
向下复制一行 ——> ctrl+shift+方向下键
向上添加空行 ——> ctrl+shift+enter
删除一行 ——> ctrl+D
向下移动一行 ——> ctrl+方向下键
向上移动一行 ——> ctrl+方向上键
jdbc.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username=root
password=123456
JdbcUtil.java 下的 getConnection 方法修改为
public class JdbcUtil2 {
static final String DRIVERCLASS;
static final String URL;
static final String USERNAME;
static final String PASSWORD;
static {
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
DRIVERCLASS = bundle.getString("driverClass");
URL = bundle.getString("url");
USERNAME = bundle.getString("username");
PASSWORD = bundle.getString("password");
}
static {
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws Exception {
return DriverManager.getConnection(URL,USERNAME,PASSWORD);
}
}
通过连接池优化数据库操作
以前每一次操作都需要创建连接,用完后释放连接,用了连接池就不需要这样,想象一下,如果10000人访问站点,每一个人访问我都建立一次连接,对性能是一种负担。
连接池的原理是,在初始化的时候创建一定数量的连接,用的时候通过方法获取,不用的时候归还连接。
所有的连接池必须实现 javax.sql.Datasource 接口
获取连接池的方法:Connection getConnection()
常用的连接池:
- dbcp
- c3p0
dbcp
- 硬编码方式
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8");
ds.setUsername("root");
ds.setPassword("123456");
Connection conn = ds.getConnection();
- 配置文件的方式(properties文件)
Properties prop = new Properties();
prop.load(new FileInputStream("src/dbcp.properties"));;
DataSource ds = BasicDataSourceFactory.createDataSource(prop);
Connection conn = ds.getConnection();
dbcp.properties文件
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username=root
password=123456
#<!--扩展配置 了解-->
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
c3p0
- 硬编码
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8");
ds.setUser("root");
ds.setPassword("123456");
Connection conn = ds.getConnection();
- 配置文件方式
- 使用properties文件方式——c3p0.properties
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
c3p0.user=root
c3p0.password=123456
配置后就可以直接使用,不需要像 dbcp 那样导入 properties 文件
ComboPooledDataSource ds = new ComboPooledDataSource();
Connection conn = ds.getConnection();
- c3p0-config.xml
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--扩展配置-->
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置 -->
<named-config name="itcast">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/xxxx</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
配置后就可以直接使用,不需要像 dbcp 那样导入 properties 文件
ComboPooledDataSource ds = new ComboPooledDataSource();
Connection conn = ds.getConnection();
当然 c3p0 支持导入配置,ComboPooledDataSource(configName),configName 对应 c3p0-config.xml 下的命名配置的 name(named-config 标签对应的 name 值),比如我们分多个环境时 就可以传入 configName 加载对应环境的配置。 如果传入的 configName 不存在或者 configName 不传,则使用默认配置
c3p0 和 dbcp 区别
dbcp 没有自动回收空闲链接的功能
c3p0 有主动回收空闲链接的功能,c3p0使用广,hibernate 和 spring 都有使用 c3p0
使用 dbutils
dbutils 是 apache 组织的一个工具类
步骤:
- 导入包(commons-dbutils-1.4.jar)
- 创建 queryrunner 类:new queryRunner(DataSource ds)
- 编写sql
- 执行sql,r使用 query() ,cud使用 update()
insert 操作
QueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());
String sql = "insert into category(cid,cname) values(?,?)";
queryRunner.update(sql,"c1013","电器");
核心类
QueryRunner 类,主要用于操作 sql 语句
常用方法- query
- update
DbUtils 类,主要用于释放资源,控制事务
常用方法- closeQuietly() 内部处理了异常
- commitAndClose() 提交事务并释放连接
ResultSetHandler接口,主要用于封装结果集
- 9个实现类——ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
- ArrayHandler, 将查询结果的第一条记录封装成数组,返回
- ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
- ★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
- ★★BeanListHandler,将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
- ColumnListHandler, 将查询结果的指定一列放入list中返回
- MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
- ★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
- ★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值
- 使用方式几乎都一样,这里以 ArrayHandler 举例
QueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());
String sql = "insert into category(cid,cname) values(?,?)";
object[] query = queryRunner.query(sql,new ArrayHandler());
- 特别介绍下 bean
QueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());
String sql = "insert into category(cid,cname) values(?,?)";
// bean.class 表示 声明的 bean,其字段和数据库字段对应
object[] query = queryRunner.query(sql,new BeanHandler<>(bean.class));
欢迎大家关注我的个人公众号,互联网码农,专注互联网编程技术分享,关注公众号,回复关键字,可以领取系列编程学习视频哦,前端、java、ios、安卓、c++、python应用尽有。
java EE学习之数据库操作的更多相关文章
- Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库
参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...
- Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Jav ...
- Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...
- Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring
参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...
- Java EE 学习(5):IDEA + maven + spring 搭建 web(1)
参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...
- Java EE 学习(4):IDEA + maven 搭建 web(2)
参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接Java EE 学习(3):IDEA + maven 搭建 web ...
- Java EE学习——Quartz的Cron表达式
经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...
- PHP学习之-数据库操作
PHP学习之-数据库操作 1.PHP支持那些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Sybase,Db2,Or ...
- Java Web----Java Web的数据库操作(三)
Java Web的数据库操作 前面介绍了JDBC技术和JDBC API及API的使用示例,下面详细介绍JDBC在Web中的应用. Java Web----Java Web的数据库操作(一) Java ...
随机推荐
- face-morpher过程函数分析
01 dlib.get_frontal_face_detector #功能:人脸检测画框#参数:无#返回值:默认的人脸检测器 02 points1.astype 转换数组的数据类型 03 np.mea ...
- AndoridSQLite数据库开发基础教程(7)
AndoridSQLite数据库开发基础教程(7) 为空表添加数据 开发者可以单击Data按钮,看到Students表中是没有数据的,创建好的Students表是一个空表.如图1.15所示.如果开发者 ...
- Typescript中的可索引接口 类类型接口
/* 5.typeScript中的接口 可索引接口 类类型接口 */ /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用 ...
- nginx奔溃自动重启Shell脚本
# vi /usr/local/nginx/sbin/nginx_restart.sh 贴入一下代码: #!/bin/bash #www.xmsolink.com #Monitor nginx ser ...
- 123457123456#0#----com.ppGame.ChengYu43--前拼后广--成语caicaicai_pp
com.ppGame.ChengYu43--前拼后广--成语caicaicai_pp
- Redis概述与基本操作
redis教程 概述 redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(strin ...
- WIN10桌面无创建文件夹选项,无法创建文件
在桌面或其他磁盘,右键没有新建选项,无法新建文件夹或文档. 右键桌面左下角开始按钮,点击:命令提示符(管理员) 弹出,Windows命令处理程序对话框,点击是 粘贴内容: cmd /k r ...
- use selenium+chromedriver to taobao automatically
原理 利用chromedriver来驱动chrome进行各种模拟各种行为操作, 然后利用selenium提供的接口来操作chromedriver. 安装ChromeDriver 当然这个的默认前提是你 ...
- java 基础 HashMap 并发扩容问题
存入的数据过多的时候,尤其是需要扩容的时候,在并发情况下是很容易出现问题. resize函数: void resize(int newCapacity) { Entry[] oldTable = ta ...
- [WCF] - 使用 bat 批处理文件将 WCF 服务部署为 Windows Service
1. 添加 Windows Service 项目 2. 添加 WCF 项目引用 3. 更新 App.config 配置文件(可以从 WCF的 Web.config 拷贝过来),设置服务地址. 4. 配 ...