元数据:MetaData,定义数据的数据。在数据库里,指数据库、表、字段等等的定义信息
JDBC里有哪些常见的元数据对象:
DatabaseMetaData
:定义数据库的信息,名称、类型、版本等等
ParameterMetaData
:定义预编译对象的信息,包含了预编译的SQL中,参数的个数、类型等等
ResultSetMetaData
:定义结果集对象的信息,包含查询结果集里,列的个数、名称、类型等等
ParameterMetaData
怎样获取:preparedStatement.getParameterMetaData()
使用的API:
获取预编译SQL中,参数个数:getParameterCount()
获取预编译SQL中,参数类型:getParamteType(int 参数序号)
注意:并非所有数据库都可以获取SQL中参数类型,比如:MySql
ResultSetMetaData
怎样获取:resultSet.getMetadata()
使用的API:
获取结果集中,列的个数:getColumnCount()
获取结果集中,列的名称:getColumnName(int 列序号)
获取结果集中,列的类型:getColumnType(int 列序号)
JdbcTemplate:是Spring框架的一部分,封装简化了JDBC的操作,帮我们处理了资源的获取和释放。我们只要提供sql语句和参数,就可以得到执行的结果了
相关的jar包:
常用方法:
构造方法:JdbcTemplate(DataSource dataSource)
执行任意语句:execute(sql)
,此方法没有返回值
执行DML语句:update(String sql, Object... params)
,返回int,影响行数
执行DQL语句:queryxxx()
方法多,单独讲解
execute
方法(了解)方法:jdbcTemplate.execute(sql)
参数:要执行的SQL
返回值:无
方法:jdbcTemplate.update(String sql, Object... params)
参数:
sql:要执行的SQL语句。如果有参数,必须是?处理过的
params:执行SQL语句需要的参数值
返回值:
int,表示影响的行数
方法:queryForObject(String sql, Class resultType, Object... params)
参数:
sql:要执行的sql语句
resultType:想要什么类型的结果,比如:Integer.class, String.class
params:执行SQL语句需要的参数值
返回值:
一个值,类型是由参数resultType决定的
通常用于查询数量,结果是一个值,类型通常是Integer
示例:
public void queryOne(){
//Integer count = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
?
Integer count = jdbcTemplate.queryForObject("select count(*) from user where sex = ?", Integer.class, "男");
System.out.println("user表里的数量:" + count);
}
方法:queryForMap(String sql, Object... params)
参数:
sql:要执行的SQL语句
params:执行SQL语句需要的参数值
返回值:
Map<String, Object>
是Map<字段名, 字段值>
示例:
/**
* 查询姓名是 大郎 的用户信息,得到Map<字段名,字段值>
*/
方法:queryForList(String sql, Object... params)
参数:
sql:要执行的SQL语句
params:执行SQL语句需要的参数值
返回值:
List<Map<String,Object>>
:每条记录是一个Map,把所有记录的Map放到List里
示例:
/**
* 查询性别为男的所有用户,得到List
*/
方法:query(String sql, RowMapper rowMapper, Object.. params)
参数:
sql:要执行的SQL语句
rowMapper:用于设置结果集中列的数据,对应到JavaBean哪个属性上,是设置对应关系的
可以简化写成:new BeanPropertyRowMapper<>(JavaBean名称.class)
params:执行SQL语句需要的参数值
返回值:
List<JavaBean对象>
。List里每个JavaBean,是一条记录的数据封装成的对象
JavaBean:有特定结构的简单Java类。数据库里每张表,都可以有一个对应的JavaBean;表里每条记录,都对应一个JavaBean的对象。
类里要有私有属性
类里要有无参构造
每个属性要有public的get/set方法
示例:查询所有用户,得到用户集合List<User>
/**
* JavaBean:一种特殊结构的简单Java类,要求:
* 1. 类里要有private的属性
* 2. 每个属性要有public的get/set方法
* 3. 要有无参构造
* 4. 建议每个属性的类型,写成包装类,而不要写成基本数据类型
*/
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private Date birthday;
?
public Integer getId() {
return id;
}
?
public void setId(Integer id) {
this.id = id;
}
?
public String getUsername() {
return username;
}
?
public void setUsername(String username) {
this.username = username;
}
?
public String getPassword() {
return password;
}
?
public void setPassword(String password) {
this.password = password;
}
?
public String getSex() {
return sex;
}
?
public void setSex(String sex) {
this.sex = sex;
}
?
public Date getBirthday() {
return birthday;
}
?
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
?
/*
查询所有性别为的用户,得到List<User>
*/
方法:queryForObject(String sql, RowMapper rowMapper, Object.. params)
注意:如果找不到数据,方法会抛异常
EmptyResultDataAccessException
。我们认为是正常的,应该try..catch,让异常不影响后边代码的继续执行
参数:
sql:要执行的SQL语句
rowMapper:用于设置结果集中列的数据,对应到JavaBean哪个属性上,是设置对应关系的
可以简写成:new BeanPropertyRowMapper<>(JavaBean类名.class)
params:执行SQL语句需要的参数值
返回值:
List<JavaBean对象>
。List里每个JavaBean,是一条记录的数据封装成的对象
示例
/**
* 查询用户名为 大朗 的信息,得到一个User对象
*/
了解元数据
理解自定义MyJdbcTemplate的过程原理
使用JDBCTemplate执行SQL语句:
导入jar包:JDBCTemplate的5个包,c3p0连接池的包,数据库驱动包
创建JDBCTemplate对象:new JdbcTemplate(DataSource dataSource)
使用方法,执行SQL语句
execute()
:执行任意SQL语句,但是没有返回值
==update(sql, params)
:执行DML语句,返回int,表示影响行数==
==queryForObject(sql, resultType, params)
:查询一个值,比如:查询数量==
queryForMap(sql, params)
:查询一条记录,得到Map<字段名String,字段值Object>
queryForList(sql, params)
:查询多条记录,得到List<Map<String,Object>>
==query(sql, new BeanPropertyRowMapper<>(JavaBean类名.class), params)
:查询多条记录,得到JavaBean的集合==
==queryForObject(sql, new BeanPropertyRowMapper<>(JavaBean类名.class), params)
:查询一条记录,得到一个JavaBean对象==
分层开发:JSP/EL/JSTL 这天讲分层开发:JavaEE的三层架构
原文:https://www.cnblogs.com/penghuake/p/10886291.html