我自己的MySQL学习之路,写下来,算是理一理知识点。以后工作有需要学新的数据库操作也有个地方可以看看提纲,该怎么学~
省略安装、配置等环境搭建过程。。。直接上重点。
一、排在首位的当然是,先学习命令行操作.。
二、使用JDBC操作数据库。
获取链接Connection,获取预编译PrepareStatement,写sql语句,替换sql中的“?”,执行sql语句,拿到结果集以及对结果集的处理。
一些细节:
1、加载驱动有两种方式
第一种:
DriverManager.registerDriver(new Driver()); Connection conn = DriverManager.getConnection(url, username, password);(这种方式不好,也不专业,因为会重复加载驱动,具体去看registerDriver方法的源码!)
第二种:
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password);
(这种方式比较好,也比较普遍)
2、导包的时候一定要导sql包,而不要导mysql的包。面向接口编程,提高程序拓展性。
3、url地址中是可以带上参数的:
url="jdbc:mysql://localhost:3306/工程的目录/useUnide=true&characterEncoding=UTF-8"a、若不指定编码时,因为Connection是由驱动返回的,所以mysql驱动会看数据库采用的什么编码。数据库采用哪个,就用哪个。但是显然这不是一种好的做法。
b、3306端口可以不写,默认连本机的3306端口。
c、连哪个库不要再程序中写死,要去配置文件中配置,并采用类加载器加载。
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbc1 username=root password=root
static{ InputStream in = JdbcPool.class.getClassLoader().getResourceAsStream("db.properties"); Properties prop = new Properties(); try { prop.load(in); String driver = prop.getProperty("driver"); String url = prop.getProperty("url"); String username = prop.getProperty("username"); String password = prop.getProperty("password"); Class.forName(driver); } catch (Exception e) { e.printStackTrace(); } }
4、一定要用PrepareStatement而不要用Statement,因为预编译会提高性能,而且还能防止sql注入。
三、查询大量数据时,前端要分页显示,所以后端要记得学习分页语句:select * from XXX limit ?,?
四、主键自动增长时,如何获取主键。
五、JDBC调用存储过程。
六、批处理,以及批处理命令。
for(int i=1;i<=num;i++){ ... ... PrepareStatement对象.addBatch(); PrepareStatement对象.executeBatch(); PrepareStatement对象.clearBatch(); }
这样写很不好,当num比较大时,肯定会内存溢出。所以要分组执行,例如一次批处理500条sql语句。
for(int i=1;i<+num;i++){ ...; ...; PreparedStatement.addBatch(); if(i%500==0){ PreparedStatement.executeUpdate(); PreparedStatement.clearBatch(); } } PreparedStatement.executeUpdate();
这里拓展一下我遇到的for循环的其他技巧。
1、条件判断增强。
编程中都要求数据要先检查再使用。例如当遍历一个数组时,首先检查数组是否为空。
if(arr!=null){ for(int i=0;i<arr.length;i++){...} }如果代码这样写,虽然完成了功能,但是代码质量也太垃圾了。此时不妨按照下面的格式来写。
for(int i=0;arr!=null && i<arr.length;i++){...} //这样写岂不是好多
2、外层循环条件表达式的结果可以受到内层循环的控制。
int arr[][] = new int [10][10]; boolean flag = false; for(int i=0;i<arr.length && flag;i++){ for(int j=0;j<arr[i].length;j++){ if (arr[i][j]==3) { flag = true; break; } } }
七、当向表中写入大数据或者读取表中大数据时,不要直接操作,以免造成内存溢出。而应该使用
PrepareStatement对象.setCharacterStream PrepareStatement.setBinaryStream ResultSet.getCharacterStream ResultSet.getBinaryStream
八、触发器。
九、事务的概念,以及事务的特性(ACID):原子性、一致性、隔离性、持久性。mysql的4种隔离级别;oracle的2种隔离级别。
操作事务的命令行语句以及在程序中对应该怎么写
十、数据库连接池,DataSource接口。
十一、常见的3种获取数据库连接池的方式:DBCP(开源库)、C3P0(开源库,spring框架就用的是这个)、tomcat-JNDI容器(内部也是用的DBCP)
(对于JNDI容器多说一点:它使用一张哈希表来存储对象,开发中可以使用键值-------也就是一个字符串,分别通过bind和lookup方法来绑定和获取这个对象。JNDI是以目录的形式存储对象的属性的。例如,用户通过JNDI存储一个汽车对象,那么汽车是根目录,汽车的轮子、发动机等之类的子对象就是子目录,而它的属性例如品牌、尺寸、价格、重量等算是汽车的文件。)
(注意:在使用tomcat-JNDI容器来获取数据库连接池的时候,驱动的jar文件一定要放在tomcat的lib目录下!!!)
十二、元数据:DatabaseMetaData、ParameterMetaData
十三、阿帕奇的开源框架DBUtils.
小细节:
1、QueryRunner.update(sql,params);//此时调用者不用管资源的释放,框架自动帮你完成 2、QueryRunner.update(connection,sql,params);//此时需要调用者负责资源的释放 3、QueryRunner在构造函数的参数里可以指定连接池 4、操作大数据(大文本、大的二进制数据等)不建议使用该框架
十五、多表查询:一对一、一对多、多对多
十六、各种持久层框架如Hibernate