java ee数据库_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

#

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

com.mysql.jdbc.Driver

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8

root

123456

30000

30

10

30

100

10

200

com.mysql.jdbc.Driver

jdbc:mysql://127.0.0.1:3306/xxxx

root

1234

5

20

10

40

20

5

配置后就可以直接使用,不需要像 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应用尽有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值