学习笔记--数据库开发

//JDBC基础

JDBC URL

jdbc:mysql://<ip>:<port>/database

jdbc:oracle:thin:@<ip>:<port>:database

jdbc:microsoft:sqlserver://<ip>:<port>; 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:mysql://localhost:1234/database", 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:mysql://<ip>:<port>/database?useCursorFetch=true             //开启游标

利用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();

其他操作,增删查改:

<?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.GetUserInfo">

<select id="getUser" parameterType="int" resultType="com.netease.mybatis.practice.User">

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

</select>

<insert id="addUser" parameterType="com.netease.mybatis.practice.User" useGeneratedKeys="true" keyProperty="user_id">

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

</insert>

<update id="updateUser" parameterType="com.netease.mybatis.practice.User">

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

</update>

<delete id="deleteUser" parameterType="com.netease.mybatis.practice.User">

delete from user where user_id = #{user_id}

</delete>

</mapper>

使用实例:

//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小时

时间: 2024-08-10 23:13:52

学习笔记--数据库开发的相关文章

Cocos2dx 学习笔记整理----开发环境搭建

最近在学习cocos2dx,预备将学习过程整理成笔记. 需要的工具和环境整理一下: 使用的版本 cocos2dx目前已经出到了v3.1.1,学习和项目的话还是用2.2.3为宜,毕竟不大想做小白鼠,并且学习了几天之后才发出3.X版本的,版本内容变动比较大. 开发环境 1 jdk 1.6以上 2 python 2.7为宜(创建项目要用的) 3 NDT+Android SDK 4 Cygwin或者MinGW 开发工具 1 Eclipse + CDT + ADT 2 VS2010 3 Sublime T

[学习笔记]面向对象开发中的一些思想和原则

摘自<Java与模式>作者阎宏 面向对象的可复用设计的第一块基石:开闭原则(一个软件实体应当对扩展开放,对修改关闭) "开-闭"原则的手段和工具: 1)里氏代换原则:任何基类出现的地方,子类一定可以出现: 2)依赖倒转原则:要依赖于抽象,不要依赖于实现: 3)合成\聚合复用原则:要尽量使用合成\聚合,而不是继承关系达到复用的目的: 4)迪米特法则:一个软件实体应该与尽可能少的其它实体发生相互作用: 5)接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口

VSTO学习笔记(三) 开发Office 2010 64位COM加载项

原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(Automation Executables) 2.Office加载项(COM or Excel Add-In) 3.Office文档代码或模板(Code Behind an Office Document or Template) 4.Office 智能标签(Smart Tags) 本次我们将学习使

[java基础学习笔记]Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 主要内容: ---------------------------------------------------| 1.JDK的下载与安装                            | 2.编写第一个java程序HelloWorld     | 3.编译执行HelloWorld                      

perl学习笔记--搭建开发环境

windows下perl开发环境搭建 perl下载地址:http://www.activestate.com/developer-tools 各个插件的安装方法:(通过代理上网的方法) 方法一:padwalker的安装步骤 1. padwalker下载地址: http://www.bribes.org/perl/ppm/ 2. 解压下载的文件 4. 拷贝 blib/lib/PadWalker.pm 到 Perl/lib(你的安装路径)5. 拷贝 blib/arch/auto/PadWalker

IBatis .NET 开发学习笔记&mdash;&mdash;.NET 开发环境搭建

大家好,今天给大家带来的是web应用程序配置,至于windows应用程序或者其他类型解决方案可以相同的配置,web应用程序配置文件为web.config,windows应用程序是app.config. 通过以下步骤可以建立属于你自己的环境: 1.首先,肯定是打开Visual Studio(文章后面简称VS),如果你有其他工具开发,我也不介意,反正我用VS,VS目前最新版是2013,不过我喜欢复古,所以,我目前用安装VS2010来当作教程,不管目前是多少版本了,都可以同理得到. 2.然后,新建一个

bootstrap学习笔记(网页开发小知识)

这是我在学习Boostrap网页开发时遇到的主要知识点: 1.导航条navbar 添加.navbar-fixed-top类可以让导航条固定在顶部,固定的导航条会遮住页面上的其他内容,除非给<body>元素设置了padding. 导航条的默认高度是50px,比如设置:body{ padding-top:70px} 2.下拉菜单 注意:可以通过data属性API就能使用所有的Bootstrap插件,无需写一行JavaScript代码.这是Bootstrap中的一等API,也应该是你的首选方式. &

MVC学习之数据库开发模式:代码优先实例介绍

数据库开发模式之代码优先主要有以下几步: 1.在Models文件夹中创建需要的表所对应的类 2.创建数据上下文类 3.在webConfig文件中配置数据库连接节点 4.添加控制器和相应的视图文件 5.在控制器的动作中创建数据上下文实例,通过实例操作数据库数据 具体步骤如下所示: 1.在Models文件夹中创建所需表对应的类 namespace CodeFirst.Models { public class book { public int Id { get; set; } public str

MVC学习之数据库开发模式:三种开发模式总结:

先介绍下三种开发模式的使用方法: 1.数据库优先: 数据库开发之:数据库优先主要步骤: 1.在数据库中建立好数据库和所需要得到表 2.选中Models文件夹,添加新项目--数据--ADO.NET实体数据模型……在生成数据库页面选着从数据库中生成 在完成2之后,会在web.config里面自动生成数据库连接字符串 3.创建控制器和对应的视图页面 4.在控制器中创建数据上下文实例对象,该对象是通过连接数据库字符串的名字来创建的. 2.代码优先: 数据库开发之代码优先步骤: 1.在Models文件夹中