JDBCTemplate
步骤:
- 前提:
- 要有配置文件,
- bean文件里面存放封装数据的类,满参构造,公共的get/set方法,实现序列化接口serializable
- 导包c3p0.jar 、durid.jar
- 工具类实现(注册驱动,获得连接,释放资源)
- 创建JDBCTemplate对象,传入数据源
- 调用update(),queryXXX();
增删改:(重要)
int update(String sql,object…params); //返回几行受影响
查询一条记录
封装到Map里面
queryForMap(string sql,object…params); //把列作为map集合的key把数据作为map的values
封装到javaBean对象里面(重要)
queryForObject(String sql,new BeanPropertyRowMapper<>(类型.class),object…params);
统计数量(重要)
queryForObject(String sql,Integer/Long.class);
查询多条记录封
封装到List
元数据(MetaDate)
概述:描述数据的数据
ParameterMetaData
概述: ParameterMetaData是由preparedStatement对象通过getParameterMetaData方法获取而来,ParameterMetaData可用于获取有关PreparedStatement对象和其预编译sql语句 中的一些信息. eg:参数个数,获取指定位置占位符的SQL类型
方法:
int getParameterCount(); 获得SQL语句中的参数个数 (获得?的个数)
//3. 获得参数的元数据
ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
// 获得sql语句里面参数的个数
int parameterCount = parameterMetaData.getParameterCount();
System.out.println("parameterCount="+parameterCount);
int getParameterType(int param); 获取指定参数的SQL类型,(MySQL不支持获取参数类型)
ResultSetMetaData
概述: ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,ResultSetMetaData可用于获取有关ResultSet对象中列的类型和属性的信息。(获得表的列名和列的类型)
获得:ResultSetMetaData
ResultSetMetaData resultSetMetaData = resultSet.getMetaData()
方法:
getColumnCount(); 获取结果集中列项目的个数
getColumnName(int column); 获得数据指定列的列名
getColumnTypeName(); 获取指定列的SQL类型
getColumnClassName(); 获取指定列SQL类型对应于Java的类型
//4. 获得结果的元数据对象
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
// 获得结果集里面列的数量
int columnCount = resultSetMetaData.getColumnCount();
System.out.println("columnCount="+columnCount);//4
// 获得某一列的列名 eg: 获得第二列
String columnName = resultSetMetaData.getColumnName(2);
System.out.println("columnName="+columnName);
// 获得第三列的sql类型 varchar
String columnTypeName = resultSetMetaData.getColumnTypeName(3);
System.out.println(columnTypeName);
// 获得第三列对应的java类型 String
String columnClassName = resultSetMetaData.getColumnClassName(3);
System.out.println("columnClassName="+columnClassName);
自定义JDBCTemplate
步骤
1.获得Connection
2.根据SQL,创建预编译SQL语句对象
3.获得参数元数据对象,获得?个数
4.遍历个数,给参数赋值
5.执行,处理结果
6.释放资源
public class MyJdbcTemplate {
//1. 需要传入数据源(获得连接, 使用者不需要关注连接的)
private DataSource dataSource;
public MyJdbcTemplate(DataSource dataSource) {
this.dataSource = dataSource;
}
/** 封装了JDBC操作数据库的步骤+元数据, 释放资源(使用者不需要关注释放资源了)
* 进行增,删,修改
* @param sql sql语句
* @param params 参数
* @return
* Ctrl+Alt+T
*/
public int update(String sql, Object ... params){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
//0. 非空判断
if(dataSource == null){
throw new RuntimeException("dataSource must not null...");
}
if(sql == null){
throw new RuntimeException("sql must not null...");
}
//1. 从dataSource 获得连接对象
connection = dataSource.getConnection();
//2. 创建预编译的sql语句对象 insert into user values (?,?,?,?)
preparedStatement = connection.prepareStatement(sql);
//3. 获得参数的元数据对象
ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
//4. 获得参数的个数
int parameterCount = parameterMetaData.getParameterCount();
//5. 给每一个?赋值
for(int i = 0; i < parameterCount ;i++){
preparedStatement.setObject(i+1,params[i]);
}
//6. 执行
int i = preparedStatement.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源
C3P0Utils.release(null,preparedStatement,connection);
}
return -1;
}
}
三层架构
软件中分层:按照不同功能分为不同层,通常分为三层:表现层(web层),业务层,持久(数据库)层
分层包名(公司域名倒写)表现层(web层) 注: 后续学javawebcom.lin.web业务层(service层)com.lin.service持久层(数据库访问层)com.lin.daoJavaBeancom.lin.bean工具类com.lin.utils
分层的意义:
1.解耦:降低层与层之间的耦合性
2.可维护性:提高软件的可维护性,对现有的功能进行修改和更新时不会影响原有的功能
3.可扩展性:提升软件的可扩展性,添加新的功能的时候不会影响到现有的功能
4.可重用性:不同层之间进行功能调用时,相同的功能可以重复使用
作用:
WEB层
1.获得用户的输入
2.调用业务
3.提示
业务层(Service)
1.处理业务
2.调用Dao
持久层(Dao)
1.操作数据库
优点:
1.方便维护
2.方便扩展
3.方便复用