学习笔记 -- 数据库开发

本贴最后更新于 2966 天前,其中的信息可能已经时移世异

//JDBC 基础

JDBC URL

jdbc:

jdbc:oracle:thin:@::database

jdbc:microsoft::; DatabaseName=database

常用方法:

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("select userName from user“);

ResultSet 常用方法:

.next();

.previous();

.absolute();

.beforeFirst();

.afterLast();

.getString(ColumnName/Index);

.getInt(ColumnName/Index);

.getObject(ColumnName/Index);

构建步骤:

1. 装载驱动程序

Class.forName("com.mysql.jdbc.Driver");

2. 建立数据库连接

Connection conn = DriverManager.getConnection("jdbc:, user, password);

3. 执行 SQL 语句

Statement stmt = conn.createStatement(); //java.sql 包

ResultSet rs = stmt.executeQuery("select userName from user");

4. 获取执行结果

while (rs.next()) {

System.out.println("Hello " + rs.getString("userName"));

}

5. 清理环境

conn.close(); //一般需判断不为 null,需要放在异常处理的 finally 中

stmt.close();

rs.close();

//JDBC 进阶

游标提供一种客户端读取部分服务器端结果集的机制

DB_URL = jdbc: //开启游标

利用 PreparedStatement

.setFetchSize(1);

对于大对象的读取,采用流方式

ResultSet.getBinaryStream("columnName")

一次性往数据库中插入大量数据,采用批处理

Statement

.addBatch()

.executeBatch()

.clearBatch()

字符集编码

mysql 语句:

show variables like '%character%'; //显示字符集编码信息,优先级别:column>table>database>server

show create table user;

JDBC 设置:

DB_URL = DB_URL + characterEncoding=utf8

//数据库连接池

DBCP 连接池,Tomcat 的连接池组件,由三个 jar 包组成:

commons-dbcp.jar

commons-pool.jar

commons-logging.jar

创建 BasicDataSource 对象:

public static BasicDataSource ds = null; ds = new BasicDataSource(); ds.setUrl(DB_URL); ds.setDriverClassName(JDBC_DRIVER); ds.setUsername(USER); ds.setPassword(PASSWORD);

创建连接:

conn = ds.getConnection(); ...同JDBC基础

DBCP 高级配置

BasicDataSource

.setInitialSize() //设置初始连接数

.setMaxTotal() //设置最大连接数

.setMaxWaitMillis() //设置最大等待时间

.setMaxIdle() //设置最大空闲连接数

.setMinIdle() //设置最小空闲连接数,一般设置与最大空闲相同

DBCP 定期检查

BasicDataSource

.setTestWhiteIdle(true) //开启检查线程是否为有效的功能

.setMinEvictableIdleTimeMillis() //设置关闭数据库连接的空闲时间阈值

.setTimeBetweenEvictionRunMillis() //设置检查运行时间的间隔,一般小于默认最小空闲连接时间 8 小时

//SQL 注入与防范

SQL 注入例子:

在 SQL 语句拼接中,userName = "zhangsan';#",欺骗服务器

SQL 注入防范:

使用 PreparedStatement:

PreparedStatement ptmt = null; ptmt = conn.prepareStatement("select * from user where userName = ? and password = ?"); ptmt.setString(1, userName); ptmt.setString(2, password); rs = ptmt.executeQuery();

//事务

JDBC 事务控制

Connection

.setAutoCommit(false) //开启事务,默认为 true 即未开启事务,设置为 false 为开启事务

.commit() //提交事务

.rollback() //回滚事务

检查点

Savepoint sp = conn.setSavepoint(); //设置检查点

conn.rollback(sp); //回滚到检查点状态

脏读,不可重复读,幻读

事务并发执行

事务隔离级别:

读未提交(read uncommitted)

读提交 (read committed)

重复读(repeatable read)

串行化(serializable)

默认级别为重复读,级别越高,数据库性能越差

设置隔离级别:

Connection

.getTransactionIsolation()

.setTransactionIsolation()

死锁

死锁的必要条件:

互斥,请求和保持,不剥夺,环路等待

外部加锁:

共享锁(S):select * from table lock in share mode

排他锁(X):select * from table for update

内部加锁:

数据库系统为实现 ACID 特性自动添加

快照读:支持不加锁,select * from table 为快照读

当前读:可能加锁

解决死锁方法:强制回滚代价小的事务

分析死锁方法:show engine innodb status

//Mybatis

ORM 框架

SqlSessionFactory 配置,xml 文件内容:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="jdbc" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="qiyao.luo" /> </dataSource> </environment> </environments> </configuration>

创建 Java 对象与 SQL 语句映射关系配置文件,xml 文件内容:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.micro.profession.mybatis.GetUserInfo"> <!-- 在select标签中编写查询的SQL语句,设置select标签的id属性为getUser, resultType="MyBatisTest.User"就表示将查询结果封装成一个User类 --> <!-- 根据id查询得到一个user对象 --> <select id="getUser" parameterType="int" resultType="com.micro.profession.mybatis.User"> select id, userName, corp from user where id =#{id} </select> </mapper>

注册配置文件

在 SqlSessionFactory 的配置文件中加入

<mappers> <mapper resource="com/micro/profession/mybatis/userMapper.xml" /> </mappers>

Mybatis 使用步骤:

//1. 声明配置文件的目录 String resource = "conf.xml"; //2. 加载应用配置文件 InputStream is = HelloMybatis.class.getClassLoader().getResourceAsStream(resource); //3. 创建SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //4. 获取session SqlSession session = sessionFactory.openSession(); //5. 获取操作类 GetUserInfo getUserInfo = session.getMapper(GetUserInfo.class); User user = getUserInfo.getUser(2); System.out.println(user.getId() + " " + user.getUserName() + " " + user.getPassword()); session.close();

采用注解的方法进行映射:

@Select("select * from user where user_id = #{id}") public User getUser(int id);

使用方法:

在原来使用步骤基础上插入:

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); Configuration conf = sessionFactory.getConfiguration(); conf.addMapper(GetUserInfoAnnotation.class); SqlSession session = sessionFactory.openSession();

其他操作,增删查改:

select user_id, userName, password from user where user_id =#{user_id}

insert into user (userName, password) values(#{userName}, #{password})

update user set userName = #{userName}, password = #{password} where user_id = #{user_id}

delete from user where user_id = #{user_id}

使用实例:

//1. 声明配置文件的目录 String resource = "conf.xml"; //2. 加载应用配置文件 InputStream is = HelloMybatis.class.getClassLoader().getResourceAsStream(resource); //3. 创建SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //4. 获取session SqlSession session = sessionFactory.openSession(true); //5. 获取操作类 GetUserInfo getUserInfo = session.getMapper(GetUserInfo.class); //插入用户 User user = new User("xiaoming", "123456"); getUserInfo.addUser(user); System.out.println(user.getId()); //查询用户 user = getUserInfo.getUser(user.getId()); System.out.println(user.getId() + " " + user.getUserName() + " " + user.getPassword()); //更改用户 user.setUserName("LiMing"); getUserInfo.updateUser(user); //删除用户 getUserInfo.deleteUser(user); //关闭session session.close();

Mybatis 传递多个参数的方法

DAO 层函数

Public User selectUser(@param(“userName”)String name,@param(“userArea”)String area);

对应 Mapper

<select id=" selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR} </select>

复杂查询,使用 ResultMap,实现复杂查询结果到复杂对象关联关系的转化

Constructor

类在实例化时,用来注入结果到构造方法中

idArg —— ID 参数;标记结果作为 ID 可以帮助提高整体性能

arg —— 注入到构造方法的一个普通结果

Collection

实现一对多的关联

id —— 一个 ID 结果;标记结果作为 ID 可以帮助提高整体性能

result —— 注入到字段或 JavaBean 属性的普通结果

Mapper 的 xml 文件内容:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.netease.mybatis.practice.UserOp"> <select id="getUser" parameterType="int" resultMap="UserMap"> select u.user_id as user_id, userName, password, c.id as courseId, courseName from user u left join UserCourse uc on u.user_id = uc.user_id left join course c on c.id = uc.course_id where u.user_id =#{user_id} </select> <resultMap id="UserMap" type="com.netease.mybatis.practice.User"> <constructor> <idArg column="user_id" javaType="int" /> <arg column="userName" javaType="String" /> <arg column="password" javaType="String" /> </constructor> <collection property="courses" ofType="com.netease.mybatis.practice.Course"> <id property="courseId" column="courseId" /> <result property="courseName" column="courseName" /> </collection> </resultMap> </mapper>

collection 项若为 Integer,String 等类型,可设为

<collection property="list" column="productname" ofType="java.lang.String"> <result column="productname" /> </collection>

Association,实现复杂类型之间的关联

id —— 一个 ID 结果;标记结果作为 ID 可以帮助提高整体性能

result —— 注入到字段或 JavaBean 属性的普通结果

xml 文件内容中增加 association 项,修改为:

<collection property="courses" ofType="com.netease.mybatis.practice.Course"> <id property="courseId" column="courseId" /> <result property="courseName" column="courseName" /> <association property="teacher" column="teacherId" javaType="com.netease.mybatis.practice.Teacher"> <id property="teacherId" column="teacherId" /> <result property="teacherName" column="teacherName" /> </association> </collection>

Mybatis 自带连接池

连接池常用配置选项

poolMaximumActiveConnections:

数据库最大活跃连接数,不宜设置过大

poolMaximumIdleConnections:

最大空闲连接数,一般设置与 poolMaximum 相同即可

poolMaximumCheckoutTime:

获取连接时如果没有 idleConnection 同时 activeConnection 达到最大值,则从 activeConnection 列表第一个连接开始检查,如果超过此时间,则使其失效,返回该连接,建议设置为预期最大 SQL 执行时间

poolTimeToWait:

获取服务器连接的超时时间,如果超时,打印日志重新获取连接。默认为 20s

poolPingEnabled:

启用连接侦测,检查连接池中的连接是否为有效连接,默认为关闭,建议开启

poolPingQuery:

侦测 SQL,建议使用 select 1,开销小

poolPingConnectionsNotUsedFor:

侦测时间,建议小于服务器端超时时间,MySQL 默认超时 8 小时

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 754 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 2 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 156 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖 • 2 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 58 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 829 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • Access
    1 引用 • 3 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 10 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 2 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 2 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    311 引用 • 794 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 26 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 107 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 344 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 642 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 765 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 2 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 17 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注