43、使用JdbcTemplate工具类简化对象查询
(1)new RowMapper就是实现一个行映射器,就是对ResultSet的处理,那么内部是一个借口我们在传递参数的时候,可以用
匿名类的方式实现,因为sql是我们自己写的,所以ResultSet如何映射有你自己处理
static JdbcTemplate jdbc = new JdbcTemplate(JdbcUtils.getDataSource());
static User findUser1(String name) {
String sql = "select id, name, money, birthday from user where name=?";
Object[] args = new Object[] { name };
Object user = jdbc.queryForObject(sql, args, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setMoney(rs.getFloat("money"));
user.setBirthday(rs.getDate("birthday"));
return user;
}
});
return (User) user;
}
(2)new BeanPropertyRowMapper在创建这个对象的时候需要传递一个.class文件,JdbcTemplete会通过反射技术
把ResultSet中的值取出来封装成一个对象返回回去。
static User findUser(String name) {
String sql = "select id, name, money, birthday from user where name=?";
Object[] args = new Object[] { name };
Object user = jdbc.queryForObject(sql, args, new BeanPropertyRowMapper(
User.class));
return (User) user;
}
44、JdbcTemplate类中的其他各个查询方法
在这一小节中展示了JdbcTemplete中提供的各种方法,下面列举了几个都是前面我们自己写jdbc程序的时候能实现的
只不过jdbcTemplete更进一步的做了更好的封装:
//得到Map类型的结果
static Map getData(int id) {
String sql = "select id as userId, name, money, birthday from user where id="
+ id;
return jdbc.queryForMap(sql);
}
//得到Object类型的结果
static String getUserName(int id) {
String sql = "select name from user where id=" + id;
Object name = jdbc.queryForObject(sql, String.class);
return (String) name;
}
//得到int类型的结果
static int getUserCount() {
String sql = "select count(*) from user";
return jdbc.queryForInt(sql);
}
45、使用JdbcTemplate完成数据库修改和其他功能
介绍在JdbcTemplete中update许多方法的使用,其实和其他的都是一样的,就是传递参数、sql语句之类的,在前面的示例中
我们做过一个例子就是在保存一个对象之后呢,得到这个对象保存后在数据库的key值,那么在JdbcTemplete中也为我们提供
了相应的方法可以实现这一需求:
static int addUser(final User user) {
//调用execute方法,传递参数的时候也是使用一个匿名类然后要实现一个doInConnection的方法,在这个方法中
//他会把Connection对象创建好了之后交给你来处理,所以这也就很灵活。
jdbc.execute(new ConnectionCallback() {
public Object doInConnection(Connection con) throws SQLException,
DataAccessException {
String sql = "insert into user(name,birthday, money) values (?,?,?) ";
PreparedStatement ps = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
ps.setString(1, user.getName());
ps.setDate(2, new java.sql.Date(user.getBirthday().getTime()));
ps.setFloat(3, user.getMoney());
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next())
user.setId(rs.getInt(1));
return null;
}
});
return 0;
}
46、使用支持命名参数的JdbcTemplate
这个支持命名参数的Jdbctemplete其实就是在JdbcTemplete的基础上对参数又进行了一系列的包装,让我们在对
sql语句中的参数进行传值的时候更加的方便和好用:
public class NamedJdbcTemplate {
//new一个支持命名参数的JdbcTemplete对象
static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate(
JdbcUtils.getDataSource());
public static void main(String[] args) {
User user = new User();
user.setMoney(10);
user.setId(2);
System.out.println(findUser1(user));
}
static void addUser(User user) {
//构建sql语句,把需要传递的参数用名称的方法表示出来 需要注意的是 :如果用这种方式添加一个对象
//你的values()括号中的代表参数的值必须与User类中的属性是一致的才可以
String sql = "insert into user(name,birthday, money) values (:name,:birthday,:money) ";
//直接把方法参数传递过来的User对象给他,他会通过反射的方式找到sql语句中需要设置值的属性
//然后给他赋值,这就是为什么要求命名参数要与Javabean中的属性名称一致
SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
//new keyHodler对象,他可以把添加这条记录后在数据库生成的id返回回来
KeyHolder keyHolder = new GeneratedKeyHolder();
//调用NamedParameterJdbcTemplate 的update方法
named.update(sql, ps, keyHolder);
//如果主键是int型 则返回一个int值
int id = keyHolder.getKey().intValue();
user.setId(id);
//如果主键是String或者是联合主键我们可以让它返回一个Map对象,然后遍历得到相应的数据
Map map = keyHolder.getKeys();
}
//这个方法演示的是把sql语句中需要传递的参数按照名称放到Map中调用方法的时候,直接把Map对象传递进去就可以给sql
//赋值了,这和针对"?"赋值来说不容易出错因为如果采用?作为占位符然后赋值 顺序必须要正确否则就会出错。
static User findUser(User user) {
String sql = "select id, name, money, birthday from user "
+ "where money > :m and id < :id";
Map params = new HashMap();
// params.put("n", user.getName());
params.put("m", user.getMoney());
params.put("id", user.getId());
Object u = named.queryForObject(sql, params, new BeanPropertyRowMapper(
User.class));
return (User) u;
}
//这个方法与findUser方法中所使用的方式基本是一样的
static User findUser1(User user) {
//构建sql语句,用相应的名称作为占位符:注意与Javabean中属性名称一样
String sql = "select id, name, money, birthday from user "
+ "where money > :money and id < :id";
//直接把User对象传递给他,他会自动找到sql中需要赋值的参数并且赋值
SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
//调用方法执行sql new BeanPropertyRowMapper我们把相应的.class文件传递进去,他会把sql语句执行的
//结果封装成相应的对象
Object u = named.queryForObject(sql, ps, new BeanPropertyRowMapper(
User.class));
return (User) u;
}
}
47、使用SimpleJdbcTemplate和泛型技术简化代码
如果说NamedParameterJdbcTemplate是对Jdbctemplete的一层封装,那么SimpleJdbcTemplate是对NamedParameterJdbcTemplate的
有一层的封装,在这里类必须在jdk1.5以上才可以使用,因为他用到了可变参数泛型的相关知识。
public class SimpleJdbcTemplateTest {
//new 一个 SimpleJdbcTemplate 的对象
static SimpleJdbcTemplate simple = new SimpleJdbcTemplate(JdbcUtils
.getDataSource());
//可以把需要转换成的类型作为参数传递进去(泛型)
//static <T>T find(String name, Class<T> clazz);
static User find(String name) {
//构建sql语句
String sql = "select id, name, money, birthday from user where name=? and money > ?";
//调用queryForObject()方法,第一个参数传递sql ,第二个参数和我们上面的用法一样,就是将执行的结果封装
//成为一个相应类型的对象 那么第三个参数就是传递sql语句中需要传递的参数。在这个方法中他是一个可变参数
//Object... args
User user = simple.queryForObject(sql,
ParameterizedBeanPropertyRowMapper.newInstance(User.class),
name, 100f);
return user;
}
}
现在我们有一个SimpleJdbcTemplate对象,但是如果我想用NamedParameterJdbcTemplate中的相应的方法怎么办呢?虽然SimpleJdbcTemplate
是对NamedParameterJdbcTemplate的封装,但是有些方法并没有:
(1)在SimpleJdbcTemplate对象中使用NamedParameterJdbcTemplate对象:simple.getNamedParameterJdbcOprations().相应的方法
(2)在SimpleJdbcTemplate对象中使用Jdbctemplete对象:simple.getJdbcOprations().相应的方法
48、使用JdbcTemplate实现DAO和用工厂灵活切换实现
用我们前面学习过的Jdbctemplete来从新实现前面例子中写的Userdao这个接口,代码会简洁很多。
public class UserDaoSpringImpl implements UserDao {
private SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(
JdbcUtils.getDataSource());
public void addUser(User user) {
String sql = "insert into user (name, money, birthday) values (:name, :money, :birthday)";
SqlParameterSource param = new BeanPropertySqlParameterSource(user);
KeyHolder keyHolder = new GeneratedKeyHolder();
this.simpleJdbcTemplate.getNamedParameterJdbcOperations().update(sql,
param, keyHolder);
user.setId(keyHolder.getKey().intValue());
}
public void delete(User user) {
String sql = "delete from user where id=?";
this.simpleJdbcTemplate.update(sql, user.getId());
}
public User findUser(String loginName, String password) {
String sql = "select id, name, money, birthday from user where name=?";
return this.simpleJdbcTemplate.queryForObject(sql,
ParameterizedBeanPropertyRowMapper.newInstance(User.class),
loginName);
}
public User getUser(int userId) {
String sql = "select id, name, money, birthday from user where id=?";
return this.simpleJdbcTemplate.queryForObject(sql,
ParameterizedBeanPropertyRowMapper.newInstance(User.class),
userId);
}
public void update(User user) {
String sql = "update user set name=?, birthday=?, money=? where id=? ";
this.simpleJdbcTemplate.update(sql, user.getName(), user.getBirthday(),
user.getMoney(), user.getId());
sql = "update user set name=:name, birthday=:birthday, money=:money where id=:id ";
this.simpleJdbcTemplate.update(sql, new BeanPropertySqlParameterSource(
user));
}
}
分享到:
相关推荐
【标题】"传智播客 李勇老师 JDBC代码全部和ppt" 提供的是一个关于JDBC编程的全面学习资源,由知名教育机构传智播客的讲师李勇主讲。JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的...
传智播客-Jdbc-李勇.ppt 传智播客-Jdbc-李勇.ppt 传智播客-Jdbc-李勇.ppt
传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...
【传智播客李勇hibernate PPT】是一份由知名教育机构传智播客推出的关于Hibernate框架的培训资料,由讲师李勇精心制作。这份PPT详细讲解了Hibernate在实际开发中的应用,旨在帮助学员深入理解并掌握这一强大的Java...
传智播客_hibernate李勇笔记是在学习李勇老师讲的hibernate3.2.5后整理的笔记
hibernate_传智播客_李勇
【传智播客李勇hibernate】课程详解了ORM框架Hibernate的核心概念和技术,适合初学者和想要深入了解Hibernate的开发者。以下是对课程内容的详细解析: 1. **引入ORM框架**: - 阻抗不匹配:由于Java是面向对象的...
传智播客hibernate讲解视频配套ppt,李勇
【传智播客 李勇 Hibernate 讲解】 在IT领域,ORM(Object-Relational Mapping,对象关系映射)框架是将面向对象的模型与关系数据库之间进行映射的关键技术,有效地解决了“模型不匹配”(也称为“阻抗不匹配”)的...
本资源“传智播客JDBC_所有源码与ppt”是针对JDBC学习的一个综合包,包含了源代码和相关的教学演示PPT,非常适合初学者或希望深入理解JDBC的开发者使用。传智播客是一家知名的教育机构,其课程内容通常具有系统性和...
传智播客 hibernate PPT 很经典
**JDBC笔记 李勇** JDBC(Java Database Connectivity)是Java编程语言中用来规范应用程序如何访问数据库的应用程序编程接口,提供了诸如连接数据库、发送SQL语句、处理结果集等功能。李勇老师的JDBC学习笔记主要...
- **传智播客李勇hibernate**:李勇老师的Hibernate课程可能包括了Hibernate的基本原理、实体类与表的映射、CRUD操作、查询语言(HQL)、Criteria查询、级联操作、缓存策略等。他可能强调了如何优雅地处理数据库操作...
在IT行业中,SSH三大框架是Java Web开发领域中不可或缺的一部分...这些PPT资源,如"传智播客李勇hibernate.ppt"、"spring.ppt"、"struts2.ppt",提供了详细的讲解和示例,对学习SSH框架的开发者来说是一份宝贵的资料。
本Java培训资料集合了多位知名讲师的精华内容,包括比向东、方力勋、黎活明、张孝祥、杨忠科、李勇、韩顺平等,覆盖了Java的基础到高级知识点,旨在帮助学习者全面掌握Java编程。 1. **Java基础** - **语法基础**...