【JDBC开发】我的MySQL学习之路以及一些值得注意的细节问题

我自己的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、操作大数据(大文本、大的二进制数据等)不建议使用该框架

十四、使用DBUtils操作事务

十五、多表查询:一对一、一对多、多对多

十六、各种持久层框架如Hibernate

你可能感兴趣的:(【JDBC开发】我的MySQL学习之路以及一些值得注意的细节问题)