实训(java与数据库的连接)

第一阶段:在分层结构中使用JDBC访问数据库

技术要点
1、设计原则:单一职责的设计原则和接口分离设计原则
2、数据访问层
3、实体类
4、数据访问类

面向对象设计原则
单一职责设计原则:
一个类只能有一个变化点
数据访问的变化点:数据源的变化
所以对数据库中数据表的增删改查数据操作必须封装在数据访问类中
一般而言,一张表封装一个数据访问类

接口分离设计原则:
类和类之间的耦合关系越低越好
采用接口分离

标准的sql语句(一定要回的)
插入Insert into (table-name )[(column name list)] values(value list)
更新Update (table-name ) set column name=value[,…] [where condition]
删除Delete from (table-name )[where condition]
查询Select column list from(table-name )
[inner| left | right join table2 on condition […]]
[where condition]
[group by column [having condition]]
[order by column asc|desc …]

where 发生在聚合之前
having发生在聚合之后

(新学 ) 单元测试
1 新建Source Folder :test
2 在其中新建测试类,测试类的包名和目标类的包名一致
测试类名 = Test+目标类的类名
3 在测试类中编写测试方法
添加 @Test 注解 (引用Junit)

杂记

nosql 文件型数据库
MongoDb redis (一般用来做缓存)
重视逻辑
设计原则
接口分类原则
自学设计模式,基本用接口实现
引用类型默认为null,基本类型为0,这样假设在登录注册时,为避免一些漏洞,主键最好设置为引用类型,即可以用包装类。

where 发生在聚合之前
having发生在聚合之后

第二阶段:数据访问辅助类

技术要点:
传统JDBC代码的缺点
解决方案:
配置文件
数据访问辅助类

传统JDBC代码的缺点
1、频繁的创建和销毁Connection连接对象
数据库连接池:自定义数据库连接池
C3P0 Druid
2、创建连接对象时,在源代码级别“写死”驱动类类名、数据库地址、登录用户和登录密码 log4j
配置文件:xml,properties
3、在源代码级别“写死”增删改查的sql语句
Hibernate:配置文件中的映射关系(实体类《=》表),自动生成sql语句
Mybatis:配置文件中写sql语句
4、访问类中的增删改查方法中存在大量的重复性代码
数据访问父类,数据访问辅助类

配置文件
配置文件中配置驱动类类名、数据库地址、登录用户和登录密码等参数
优点:
配置文件不是JAVA源代码,修改后不需要重新测试,编译,发布等
1>配置文件一般写在src源代码文件夹下(新建config源代码文件夹)
Bin/ classpath
Web-inf/classes classpath

2>可以在properties属性窗口中点击“Add”按钮,输入 name,value
Source源代码中直接书写:name=value
3>直接使用Properties类的对象来读取内容
Load(inputstream) getProperties(“key”)


InputStream ins = DbHelper.class.getResourceAsStream("/db.properties");
		Properties prop = new Properties();
		prop.load(ins);
		
		String driver = prop.getProperty("driverClass");
		String url = prop.getProperty("url");
		String userName = prop.getProperty("userName");
		String pwd = prop.getProperty("pwd");
		//ReadProperty.class :得到类的Class对象
		// class.getClassLoader():得到类加载器对象
		// getResourceAsStream():读取文件
		//和具体的地址无关,直接到classpath文件夹找文件
		//Properties类是集合类,专用于读取properties文件中的内容

数据访问辅助类
把数据访问类中的重复性代码 抽取出来 到数据访问辅助类

public class DbHelper {
	//建立Connection对象
	public static Connection getConnection() throws Exception{
		//读取配置文件db.properties中的参数
		InputStream ins = DbHelper.class.getClassLoader().getResourceAsStream("db.properties");
		Properties prop = new Properties();
		prop.load(ins);
		
		String driver = prop.getProperty("driverClass");
		String url = prop.getProperty("url");
		String user = prop.getProperty("userName");
		String pwd = prop.getProperty("pwd");
		
		//创建连接对象
        Class.forName(driver);
        return DriverManager.getConnection(url, user, pwd);
	}
	
	public static void close(Connection con,PreparedStatement pst,ResultSet rs) throws Exception{
		if(rs!=null) rs.close();
		if(pst!=null) pst.close();
		if(con!=null) con.close();
	}
	
	//执行增删改的方法:sql语句,参数不同
	public static int execute(String sql,Object... params) throws Exception{
		Connection con = getConnection();
		PreparedStatement pst = con.prepareStatement(sql);
		if(params!=null){
			for(int i=0;i<params.length;i++){
				pst.setObject(i+1,params[i]);
			}
		}
		int rows = pst.executeUpdate();
		close(con,pst,null);
		return rows;
	}
	
	//执行查询的sql语句的方法:
	public static ResultSet query(Connection con,String sql,Object... params) throws Exception{
		PreparedStatement pst = con.prepareStatement(sql);
		if(params!=null){
			for(int i=0;i<params.length;i++){
				pst.setObject(i+1,params[i]);
			}
		}
		
		return pst.executeQuery();
	}
}

(新学 )动态参数Object… params
我的理解:Object… params作用和数组用法相似,但比数组好用,可以不传值

第三阶段数据访问父接口和父类

技术要点
三层结构中数据访问类的写法
接口分离的原则
抽取:将相同的代码实现抽取到父类中
分层结构中数据访问层的实现方式
模板工厂设计模式

接口分离的原则
接口降低类和类之间的依赖程度,解耦

第四阶段:数据库连接池

技能要点:
自定义数据库连接池
C3P0数据库连接池

自定义数据库连接池设计
1>创建连接对象Connection,加入连接池中
2>从连接池中获取连接对象
3>使用后的连接对象,不是从内存中销毁,而是归还到连接池中
重新定义close()方法的功能:

连接池类:
List pool;//保存连接对象的集合,“池”
driverClass,url,user,pwd
initCount:初始的连接对象的数量,创建连接池对象时
maxCount:最大的连接对象的数量
count:已经创建的连接对象的数量

构造方法():读取配置文件,按照初始大小创建连接对象
Private Connection create():创建连接对象
Public Connection getConnection():获取连接池中的连接对象
Size()

代理设计模式:JDK代理,接口代理,
jdbc代理

(新知识 我没搞懂)修改con对象的close方法为返回池,而不是销毁对象

Connection proxy = (Connection)Proxy.newProxyInstance(
				this.getClass().getClassLoader(), 
				new Class[]{Connection.class},
				new InvocationHandler(){
                    //定义方法的拦截器
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						Object result = null;
						
						if(method.getName().equals("close")){
							//将连接对象返回给连接池
							pool.addLast((Connection)proxy);
						}else{
							result = method.invoke(con, args);
						}
						
						return result;
					}});

老师讲到这里就结束了

C3p0连接池
下载导入连接池的jar包
配置文件
代码

第五阶段:通用数据查询子系统设计

第六、七阶段:数据装配

我的理解:因为可能存在我们需要的查询的数据不在一个表里,所以需要多表连接,但通过sql语句进行连接效率较慢,所以我们需要通过java代码把数据装配放到一起,提高效率

感想:第一次知道这么多设计模式,设计原则,还有接口的重要作用,虽然现在还不懂,但我可以学呀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值