Spring中jdbcTemplate的用法实例(一)

转载 2016年11月11日 23:32:25


一、首先配置JdbcTemplate;

要使用Jdbctemplate 对象来完成jdbc 操作。通常情况下,有三种种方式得到JdbcTemplate 对象。 
      第一种方式:我们可以在自己定义的DAO 实现类中注入一个DataSource 引用来完 成JdbcTemplate 的实例化。也就是它是从外部“注入” DataSource 到DAO 中,然后 自己实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。 
      第二种方式: 在 Spring 的 IoC 容器中配置一个 JdbcTemplate的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。 
      第三种方式: Spring 提供了 org.springframework.jdbc.core.support.JdbcDaoSupport 类 , 这 个 类 中 定 义 了 JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创 建jdbcTemplate 的实例,所以我们自己编写的DAO 只需要继承JdbcDaoSupport 类, 然后注入DataSource 即可。提倡采用第三种方法。虽然下面的用法中采用了前两种方法

    

  配置方法有3种:

     1、

Java代码  

1.      public class UserServiceImpl implements UserService {  

2.        

3.          private JdbcTemplate jdbcTemplate;  

4.            

5.          public JdbcTemplate getJdbcTemplate() {  

6.              return jdbcTemplate;  

7.          }  

8.        

9.                      //注入方法1     

10.      public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {  

11.          this.jdbcTemplate = jdbcTemplate;  

12.      }  

13.    

14.                 //其它方法这里省略……  

15.  }  

 spring配置文件为:

Xml代码  

1.      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  

2.              <property name = "dataSource" ref="dataSource">  

3.      </bean>  

4.      <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">  

5.           <property name="jdbcTemplate" ref="jdbcTemplate"/>  

6.      </bean>  

 

   方法2、

Java代码  

1.      public class UserServiceImpl implements UserService {  

2.        

3.              private JdbcTemplate jdbcTemplate;  

4.                

5.              //注入方法2  

6.              public void setDataSource(DataSource dataSource) {  

7.                         this.jdbcTemplate = new JdbcTemplate(dataSource);  

8.              }  

9.             

10.         //其它方法省略……  

11.  }  

  

 spring配置文件为:

Xml代码  

1.      <bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">  

2.             <property name="dataSource" ref="dataSource"/>  

3.      </bean>  

 

方法3:继承JdbcDaoSupport,其内部有个JdbcTemplate ,需要注入DataSource 属性来实例化。

Java代码  

1.      public class UserDaoImpl extends JdbcDaoSupport implements UserDao {  

2.        

3.          @Override  

4.          public void save(User user) {  

5.              String sql = null;  

6.              this.getJdbcTemplate().update(sql);  

7.          }  

8.              //其它方法省略……  

9.      }  

 

spring配置文件:

 

Xml代码  

1.      <bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl">  

2.                 <property name="dataSource" ref="dataSource"/>  

3.      </bean>  

 

 

二、常用方法使用

【注意:】jdbcTemplate 中的sql均是用“?”做占位符的

domain User:

Java代码  

1.      public class User {  

2.          private int id;  

3.          private String username;  

4.          private String password;  

5.          private String sex;  

6.                    

7.                     //settergetter方法省略……  

8.      }  

   

 

UserServiceImpl :

如果采用第三种方式,则下面的用法中将方法中的 jdbcTemplate 换成 this.getJdbcTemplate()即可。

 

Java代码  

1.           /**   

2.           * 创建表  

3.           */   

4.          public void create(String tableName){ //tb_test1  

5.              jdbcTemplate.execute("create table "+tableName +" (id integer,user_name varchar2(40),password varchar2(40))");  

6.          }  

7.            

8.          //jdbcTemplate.update适合于insert updatedelete操作;  

9.          /**   

10.       * 第一个参数为执行sql   

11.       * 第二个参数为参数数据   

12.       */   

13.      public void save3(User user) {  

14.          Assert.isNull(user, "user is not null");  

15.          jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",   

16.                  new Object[]{user.getUsername(),user.getPassword()});  

17.      }  

18.        

19.      /**   

20.       * 第一个参数为执行sql   

21.       * 第二个参数为参数数据   

22.       * 第三个参数为参数类型   

23.       */   

24.      @Override  

25.      public void save(User user) {  

26.          Assert.isNull(user, "user is not null");  

27.          jdbcTemplate.update(  

28.                  "insert into tb_test1(name,password) values(?,?)",   

29.                  new Object[]{user.getUsername(),user.getPassword()},   

30.                  new int[]{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR}  

31.                  );  

32.      }  

33.    

34.      //避免sql注入  

35.      public void save2(final User user) {  

36.          Assert.isNull(user, "user is not null");  

37.            

38.          jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",   

39.                  new PreparedStatementSetter(){  

40.                

41.                      @Override  

42.                      public void setValues(PreparedStatement ps) throws SQLException {  

43.                          ps.setString(1, user.getUsername());  

44.                          ps.setString(2, user.getPassword());  

45.                      }  

46.          });  

47.            

48.      }  

49.        

50.      public void save4(User user) {  

51.          Assert.isNull(user, "user is not null");  

52.          jdbcTemplate.update("insert into tb_test1(name,password) values(?,?)",   

53.                               new Object[]{user.getUsername(),user.getPassword()});  

54.      }  

55.        

56.      //返回插入的主键  

57.      public List save5(final User user) {  

58.            

59.          KeyHolder keyHolder = new GeneratedKeyHolder();  

60.    

61.          jdbcTemplate.update(new PreparedStatementCreator() {  

62.                        

63.                                  @Override  

64.                                  public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {  

65.                                      PreparedStatement ps = connection.prepareStatement("insert into tb_test1(name,password) values(?,?)"new String[] {"id"});  

66.                                      ps.setString(1, user.getUsername());  

67.                                      ps.setString(2, user.getPassword());  

68.                                      return ps;  

69.                                  }  

70.                              },  

71.                  keyHolder);  

72.            

73.          return keyHolder.getKeyList();  

74.      }  

75.        

76.      @Override  

77.      public void update(final User user) {  

78.          jdbcTemplate.update(  

79.                  "update tb_test1 set name=,password= where id = ?",   

80.                  new PreparedStatementSetter(){  

81.                      @Override  

82.                      public void setValues(PreparedStatement ps) throws SQLException {  

83.                          ps.setString(1, user.getUsername());  

84.                          ps.setString(2, user.getPassword());  

85.                          ps.setInt(3, user.getId());  

86.                      }  

87.                  }  

88.          );  

89.      }  

90.    

91.      @Override  

92.      public void delete(User user) {  

93.          Assert.isNull(user, "user is not null");  

94.          jdbcTemplate.update(  

95.                  "delete from tb_test1 where id = ?",   

96.                  new Object[]{user.getId()},   

97.                  new int[]{java.sql.Types.INTEGER});  

98.      }  

99.    

100.       @Deprecated //因为没有查询条件,所以用处不大  

101.       public int queryForInt1(){  

102.           return jdbcTemplate.queryForInt("select count(0) from tb_test1");  

103.       }  

104.         

105.       public int queryForInt2(User user){  

106.           return jdbcTemplate.queryForInt("select count(0) from tb_test1 where username = ?" ,  

107.                   new Object[]{user.getUsername()});  

108.       }  

109.         

110.       //最全的参数3  

111.       public int queryForInt3(User user){  

112.           return jdbcTemplate.queryForInt("select count(0) from tb_test1 where username = ?" ,  

113.                   new Object[]{user.getUsername()},  

114.                   new int[]{java.sql.Types.VARCHAR});  

115.       }  

116.         

117.       //可以返回是一个基本类型的值  

118.       @Deprecated  //因为没有查询条件,所以用处不大  

119.       public String queryForObject1(User user) {  

120.           return (String) jdbcTemplate.queryForObject("select username from tb_test1 where id = 100",  

121.                                                       String.class);  

122.       }  

123.         

124.       //可以返回值是一个对象  

125.       @Deprecated //因为没有查询条件,所以用处不大  

126.       public User queryForObject2(User user) {  

127.           return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100", User.class); //class是结果数据的java类型  

128.       }  

129.         

130.       @Deprecated //因为没有查询条件,所以用处不大  

131.       public User queryForObject3(User user) {  

132.           return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = 100",   

133.                       new RowMapper(){  

134.         

135.                           @Override  

136.                           public Object mapRow(ResultSet rs, int rowNum)throws SQLException {  

137.                               User user  = new User();  

138.                               user.setId(rs.getInt("id"));  

139.                               user.setUsername(rs.getString("username"));  

140.                               user.setPassword(rs.getString("password"));  

141.                               return user;  

142.                           }  

143.                       }  

144.           );   

145.       }  

146.         

147.       public User queryForObject4(User user) {  

148.           return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = ?",   

149.                                                       new Object[]{user.getId()},  

150.                                                       User.class); //class是结果数据的java类型  实际上这里是做反射,将查询的结果和User进行对应复制  

151.       }  

152.         

153.       public User queryForObject5(User user) {  

154.           return (User) jdbcTemplate.queryForObject(  

155.                   "select * from tb_test1 where id = ?",   

156.                   new Object[]{user.getId()},  

157.                   new RowMapper(){  

158.     

159.                       @Override  

160.                       public Object mapRow(ResultSet rs,int rowNum)throws SQLException {  

161.                           User user  = new User();  

162.                           user.setId(rs.getInt("id"));  

163.                           user.setUsername(rs.getString("username"));  

164.                           user.setPassword(rs.getString("password"));  

165.                           return user;  

166.                       }  

167.                 

168.           }); //class是结果数据的java类型  

169.       }  

170.         

171.       @Override  

172.       public User queryForObject(User user) {  

173.           //方法有返回值  

174.           return (User) jdbcTemplate.queryForObject("select * from tb_test1 where id = ?",  

175.                   new Object[]{user.getId()},  

176.                   new int[]{java.sql.Types.INTEGER},   

177.                   new RowMapper() {  

178.                 

179.                       @Override  

180.                       public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  

181.                           User user  = new User();  

182.                           user.setId(rs.getInt("id"));  

183.                           user.setUsername(rs.getString("username"));  

184.                           user.setPassword(rs.getString("password"));  

185.                           return user;  

186.                       }  

187.                   }  

188.           );  

189.       }  

190.     

191.       @SuppressWarnings("unchecked")  

192.       public List<User> queryForList1(User user) {  

193.           return (List<User>) jdbcTemplate.queryForList("select * from tb_test1 where username = ?",   

194.                               new Object[]{user.getUsername()},  

195.                               User.class);  

196.       }  

197.     

198.       @SuppressWarnings("unchecked")  

199.       public List<String> queryForList2(User user) {  

200.           return (List<String>) jdbcTemplate.queryForList("select username from tb_test1 where sex = ?",   

201.                               new Object[]{user.getSex()},  

202.                               String.class);  

203.       }  

204.         

205.       @SuppressWarnings("unchecked")  

206.       //最全的参数查询  

207.       public List<User> queryForList3(User user) {  

208.           return (List<User>) jdbcTemplate.queryForList("select * from tb_test1 where username = ?",  

209.                               new Object[]{user.getUsername()},  

210.                               new int[]{java.sql.Types.VARCHAR},  

211.                               User.class);  

212.       }  

213.     

214.       //通过RowCallbackHandlerSelect语句得到的每行记录进行解析,并为其创建一个User数据对象。实现了手动的OR映射。  

215.       public User queryUserById4(String id){  

216.           final User user  = new User();  

217.             

218.           //该方法返回值为void  

219.           this.jdbcTemplate.query("select * from tb_test1 where id = ?",   

220.                   new Object[] { id },   

221.                   new RowCallbackHandler() {     

222.                 

223.                       @Override    

224.                       public void processRow(ResultSet rs) throws SQLException {     

225.                           User user  = new User();  

226.               user.setId(rs.getInt("id"));  

227.               user.setUsername(rs.getString("username"));  

228.               user.setPassword(rs.getString("password"));    

229.                       }     

230.           });   

231.             

232.           return user;     

233.       }  

234.         

235.       @SuppressWarnings("unchecked")  

236.       @Override  

237.       public List<User> list(User user) {  

238.           return jdbcTemplate.query("select * from tb_test1 where username like '%?%'",   

239.                   new Object[]{user.getUsername()},   

240.                   new int[]{java.sql.Types.VARCHAR},   

241.                   new RowMapper(){  

242.                 

243.                       @Override  

244.                       public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  

245.                           User user  = new User();  

246.                           user.setId(rs.getInt("id"));  

247.                           user.setUsername(rs.getString("username"));  

248.                           user.setPassword(rs.getString("password"));  

249.                           return user;  

250.                       }  

251.           });  

252.       }  

253.     

254.       //批量操作    适合于增、删、改操作  

255.       public int[] batchUpdate(final List users) {  

256.             

257.           int[] updateCounts = jdbcTemplate.batchUpdate(  

258.                   "update tb_test1 set username = ?, password = ? where id = ?",  

259.                   new BatchPreparedStatementSetter() {  

260.                         

261.                           @Override  

262.                           public void setValues(PreparedStatement ps, int i) throws SQLException {  

263.                               ps.setString(1, ((User)users.get(i)).getUsername());  

264.                               ps.setString(2, ((User)users.get(i)).getPassword());  

265.                               ps.setLong(3, ((User)users.get(i)).getId());  

266.                           }  

267.                             

268.                           @Override  

269.                           public int getBatchSize() {  

270.                               return users.size();  

271.                           }  

272.                   }   

273.           );  

274.             

275.           return updateCounts;  

276.       }  

277.         

278.       //调用存储过程  

279.       public void callProcedure(int id){  

280.           this.jdbcTemplate.update("call SUPPORT.REFRESH_USERS_SUMMARY(?)"new Object[]{Long.valueOf(id)});  

281.   }  

 

其中,batchUpdate适合于批量增、删、改操作;

        update(…):使用于增、删、改操作;

        execute():执行一个独立的sql语句,包括ddl语句;

         queryForInt:查询出一个整数值

         

 

queryForInt, queryForMap,queryForObject返回0行会抛异常的

Spring 中的 RowMapper

2012年11月17日 ⁄ 综合 ⁄ 共 724字 ⁄ 字号 ⁄ 评论关闭

Sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类.

我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中大部分返回的都是自定义的类)则需要包装,如果是Java自定义的类型,如:String则不需要.

如果sping与hibernate 相结合了,基本上是用不到,大多数都是在spring单独使用时用到.

可以通过建立内部类实现RowMapper接口,RowMapper中有一个mapRow方法,所以实现RowMapper接口一定要实现mapRow方法,而对自定义类的包装就在mapRow方法中实现.

这里只是一个简单的例子:

public class TestDao { private JdbcTemplate jt; public void setJt(JdbcTemplate jt) {    this.jt = jt; } public List<TNpc> getAll(){     String sql = "select * from t_npc";    //使用    List list = jt.query(sql, new NpcRowMapper());    return list; } /** * 定义内部类实现RowMapper接口 */ public class NpcRowMapper implements RowMapper{       //实现mapRow方法      public Object mapRow(ResultSet rs, int num) throws SQLException {         //对类进行封装       TNpc npc = new TNpc();       npc.setId(rs.getLong("id"));       npc.setName(rs.getString("name"));       return npc;    }      } }

 

 

try
{
   messagebox.show("true");
}
catch
{
   messagebox.show("false");
}
finally
{
   messagebox.show("finally");
}
try 
{ 
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 
} 
catch 
{ 
//除非try里面执行代码发生了异常,否则这里的代码不会执行 
} 
finally 
{ 
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally 
} 

 

Spring-jdbc:JdbcTemplate使用简介

为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架. 作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的...

JDBC Spring 之JdbcTemplate 增删改查操作

之前简单介绍了JDBC CRUD的操作,接下来我为大家来讲解一下JDBC 使用Spring框架来进行CURD(增删改查操作)使用Spring中的JdbcTemplate之前应该给一个数据源来获得连接。...

两种使用Spring JdbcTemplate实现update或insert操作

第一种方式,重载PreparedStatementCreator jdbcTemplate.update(new PreparedStatementCreator()...{    public Pr...
  • daryl715
  • daryl715
  • 2007年10月15日 13:47
  • 17197

Spring JdbcTemplate之五类方法总结

最近写了几个同步数据的统计任务,使用到了JDBCTemplate的批处理,顺手将JDBCTemplate的用法大概总结了一下。 JDBCTemplate主要提供了五类方法: execute()方法:...
  • lmb55
  • lmb55
  • 2017年01月04日 20:45
  • 1276

JdbcTemplate查询

使用JdbcTemplate进行查询时,可以使用queryForXXX()等方法,例如使用queryForInt()方法传回user表格中的数据数目: jdbcTemplate.quertForInt...
  • daryl715
  • daryl715
  • 2007年10月15日 15:04
  • 11904

Spring中的JDBCTemplate使用(非常详细的配置过程)

Spring中的JDBCTemplate使用 数据库准备: 创建数据库 创建表: Java代码: 1、创建web 工程  springJdbcTemplate 2、添加...

jdbcTemplate

JdbcTemplate简介   Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。   Jdbc...
  • sx_ygl
  • sx_ygl
  • 2017年01月04日 13:33
  • 1972

从模板模式到JdbcTemplate

模板模式初探  关于模板模式,大家可以参阅 模板方法模式深度解析(一) http://blog.csdn.net/lovelion/article/details/8299794 原始的jdbc ...

Spring JdbcTemplate框架(一)——基本原理

JDBC已经能够满足大部分用户擦欧洲哦数据库的需求,但是在使用JDBC时,应用必须自己来管理数据库资源。spring对数据库操作需求提供了很好的支持,并在原始JDBC基础上,构建了一个抽象层,提供了许...

Spring框架学习第六讲(JDBCTemplate实现CRUD操作)

一、 Spring 中的JDBCTemplate对JDBC进行了封装1.1 添加相关的JAR包spring-jdbc,spring-tx(事务),mysql驱动包1.2 创建对象,设置数据库信息Dri...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring中jdbcTemplate的用法实例(一)
举报原因:
原因补充:

(最多只允许输入30个字)