Spring中JDBC操作简单总结

àì夳堔傛蜴生んèń 2022-04-12 13:15 282阅读 0赞

[b]引言[/b]
  Spring版本:4.2.5,代码编写时间:2016-03-16。
  本人原创,转载请保留本人信息:http://wallimn.iteye.com。

  简单起见,没有使用接口,整个示例仅涉及4个文件。代码逻辑很简单,基本不用解释。

[b]一、Spring配置文件applicationContext.xml[/b]

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd">
  8. <!-- 简单起见,使用Spring自带的数据源 -->
  9. <bean id="dataSource"
  10. class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  11. <property name="driverClassName" value="org.h2.Driver"></property>
  12. <property name="url" value="jdbc:h2:tcp://localhost/C:/h2-201510/jdbc"></property>
  13. <property name="username" value="sa"></property>
  14. <property name="password" value=""></property>
  15. </bean>
  16. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  17. <property name="dataSource" ref="dataSource"></property>
  18. </bean>
  19. <!--
  20. 注意:由于要使用NamedParameterJdbcTemplate,
  21. UserDaoImpl要从NamedParameterJdbcDaoSupport类派生
  22. -->
  23. <bean id="userDao" class="com.wallimn.study.UserDaoImpl">
  24. <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  25. </bean>
  26. </beans>

[b]二、用户类User.class[/b]

  1. package com.wallimn.study;
  2. public class User {
  3. private String id;
  4. private String username;
  5. private String password;
  6. public void setId(String id){
  7. this.id = id;
  8. }
  9. public String getId() {
  10. return id;
  11. }
  12. public String getUsername() {
  13. return username;
  14. }
  15. public void setUsername(String username) {
  16. this.username = username;
  17. }
  18. public String getPassword() {
  19. return password;
  20. }
  21. public void setPassword(String password) {
  22. this.password = password;
  23. }
  24. @Override
  25. public String toString() {
  26. //return super.toString();
  27. return String.format("ID:%s\t\t\t用户名:%s\t\t密码:%s", id,username,password);
  28. }
  29. }

[b]三、数据操作类UserDaoImpl.class[/b]

  1. package com.wallimn.study;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.springframework.jdbc.core.BatchPreparedStatementSetter;
  8. import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
  9. import org.springframework.jdbc.core.RowMapper;
  10. import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
  11. import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
  12. import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
  13. import org.springframework.jdbc.core.namedparam.SqlParameterSource;
  14. import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
  15. /**
  16. * 用户管理类,演示jdbc模板使用。
  17. * 使用JdbcTemplate模板(不支持命令参数等高级特性),需继承JdbcDaoSupport,
  18. * 使用NamedParameterJdbcTemplate,需继承NamedParameterJdbcDaoSupport,
  19. * 两个模板和Dao是有对应关系的。
  20. * @author Administrator
  21. *
  22. */
  23. public class UserDaoImpl extends NamedParameterJdbcDaoSupport {
  24. /**
  25. * 创建测试用表,后面的测试以这个表为基础 <br/>
  26. * 时间:2016-3-15,作者:http://wallimn.iteye.com
  27. */
  28. public void createUserTable() {
  29. String sql = null;
  30. try {
  31. sql = "drop table user";
  32. this.getJdbcTemplate().execute(sql);
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. sql = "create table user(id varchar(32) primary key,username varchar(32),password varchar(256))";
  37. this.getJdbcTemplate().execute(sql);
  38. }
  39. /**
  40. * 使用匿名参数
  41. * <br/>
  42. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  43. * @param user
  44. */
  45. public void addUser(User user) {
  46. String sql = "insert into user values(?,?,?)";
  47. this.getJdbcTemplate().update(sql, user.getId(), user.getUsername(),
  48. user.getPassword());
  49. }
  50. /**
  51. * 使用命名参数、Bean
  52. * <br/>
  53. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  54. * @param user
  55. */
  56. public void addUserBean(User user) {
  57. String sql = "insert into user values(:id,:username,:password)";
  58. this.getNamedParameterJdbcTemplate().update(sql,
  59. new BeanPropertySqlParameterSource(user));
  60. }
  61. /**
  62. * 使用命名参数、Map
  63. * <br/>
  64. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  65. * @param user
  66. */
  67. public void addUserMap(Map<String,Object> user) {
  68. String sql = "insert into user values(:id,:username,:password)";
  69. this.getNamedParameterJdbcTemplate().update(sql,
  70. new MapSqlParameterSource(user));
  71. }
  72. /**
  73. * 批量操作,一次性增加多个用户
  74. * <br/>
  75. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  76. * @param user
  77. */
  78. public void addUser1(final List<User> users) {
  79. if(users==null || users.size()==0)return;
  80. String sql = "insert into user values(?,?,?)";
  81. //使用匿名类
  82. BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter(){
  83. @Override
  84. public int getBatchSize() {
  85. return users.size();
  86. }
  87. @Override
  88. public void setValues(PreparedStatement stat, int idx)
  89. throws SQLException {
  90. stat.setString(1, users.get(idx).getId());
  91. stat.setString(2, users.get(idx).getUsername());
  92. stat.setString(3, users.get(idx).getPassword());
  93. }
  94. };
  95. this.getJdbcTemplate().batchUpdate(sql, setter);
  96. }
  97. /**
  98. * 批量操作,一次性增加多个用户
  99. * <br/>
  100. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  101. * @param user
  102. */
  103. public void addUsers2(final List<User> users) {
  104. if(users==null || users.size()==0)return;
  105. String sql = "insert into user values(?,?,?)";
  106. //使用匿名类
  107. ParameterizedPreparedStatementSetter<User> setter = new ParameterizedPreparedStatementSetter<User>(){
  108. @Override
  109. public void setValues(PreparedStatement stat, User user)
  110. throws SQLException {
  111. stat.setString(1, user.getId());
  112. stat.setString(2, user.getUsername());
  113. stat.setString(3, user.getPassword());
  114. }
  115. };
  116. this.getJdbcTemplate().batchUpdate(sql,users,users.size(), setter);
  117. }
  118. /**
  119. * 批量操作,一次性增加多个用户
  120. * <br/>
  121. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  122. * @param user
  123. */
  124. public void addUsers3(final List<User> users) {
  125. if(users==null || users.size()==0)return;
  126. String sql = "insert into user values(:id,:username,:password)";
  127. //使用匿名类
  128. SqlParameterSource[] source = SqlParameterSourceUtils.createBatch(users.toArray());
  129. this.getNamedParameterJdbcTemplate().batchUpdate(sql, source);
  130. }
  131. /**
  132. * 删除指定ID的用户
  133. * <br/>
  134. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  135. * @param id
  136. */
  137. public void deleteUser(String id) {
  138. String sql = "delete from user where id=?";
  139. this.getJdbcTemplate().update(sql, id);
  140. }
  141. /**
  142. * 删除所有用户
  143. * <br/>
  144. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  145. */
  146. public void deleteAllUser() {
  147. String sql = "delete from user";
  148. this.getJdbcTemplate().update(sql);
  149. }
  150. /**
  151. * 修改用户信息
  152. * <br/>
  153. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  154. * @param user
  155. */
  156. public void updateUser(User user) {
  157. String sql = "update user set username=?,password=? where id=?";
  158. this.getJdbcTemplate().update(sql, user.getUsername(),
  159. user.getPassword(), user.getId());
  160. }
  161. /**
  162. * 根据ID查询用户名
  163. * <br/>
  164. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  165. * @param id
  166. * @return
  167. */
  168. public String queryUserName(String id) {// 简单查询,按照ID查询,返回字符串
  169. String sql = "select username from user where id=?";
  170. // 返回类型为String(String.class)
  171. return this.getJdbcTemplate().queryForObject(sql, String.class, id);
  172. }
  173. /**
  174. * 查询结果以List形式返回
  175. * <br/>
  176. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  177. * @return
  178. */
  179. public List<Map<String,Object>> queryForList() {
  180. String sql = "select * from user";
  181. return this.getJdbcTemplate().queryForList(sql);
  182. }
  183. /**
  184. * 查询结果不多于一条记录,以Map形式返回
  185. * <br/>
  186. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  187. * @param id
  188. * @return
  189. */
  190. public Map<String,Object> queryForMap(String id) {
  191. String sql = "select * from user where id=?";
  192. return this.getJdbcTemplate().queryForMap(sql,id);
  193. }
  194. /**
  195. * 查询结果不多于一条记录,以Map形式返回
  196. * <br/>
  197. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  198. * @param id
  199. * @return
  200. */
  201. public String queryForObject(String id) {
  202. String sql = "select username from user where id=?";
  203. return this.getJdbcTemplate().queryForObject(sql,new Object[]{id},String.class);
  204. }
  205. /**
  206. * 统计用户数量
  207. * <br/>
  208. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  209. * @return
  210. */
  211. public String queryUserCount() {
  212. String sql = "select count(*) from user";
  213. return this.getJdbcTemplate().queryForObject(sql,String.class);
  214. }
  215. /**
  216. * 查找指定ID的用户,使用RowMapper将结果转化为User类型
  217. * <br/>
  218. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  219. * @param id
  220. * @return
  221. */
  222. public User queryUser(String id) {
  223. String sql = "select * from user where id=?";
  224. return this.getJdbcTemplate().queryForObject(sql, new UserRowMapper(),
  225. id);
  226. }
  227. /**
  228. * 返回所有用户,使用RowMapper将结果转化为User类型
  229. * <br/>
  230. * 时间:2016-3-16,作者:http://wallimn.iteye.com
  231. * @return
  232. */
  233. public List<User> findAll() {// 复杂查询返回List集合
  234. String sql = "select * from user";
  235. return this.getJdbcTemplate().query(sql, new UserRowMapper());
  236. }
  237. /**
  238. * 将ResultSet转化为Bean的类。
  239. * @author Administrator
  240. *
  241. */
  242. class UserRowMapper implements RowMapper<User> {
  243. public User mapRow(ResultSet rs, int rowNum) throws SQLException {
  244. User user = new User();
  245. user.setId(rs.getString("id"));
  246. user.setUsername(rs.getString("username"));
  247. user.setPassword(rs.getString("password"));
  248. return user;
  249. }
  250. }
  251. }

[b]四、测试类UserDaoTest.java[/b]

  1. package com.wallimn.study;
  2. import java.util.HashMap;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.UUID;
  7. import org.junit.Test;
  8. import org.springframework.context.ApplicationContext;
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;
  10. public class UserDaoTest {
  11. private ApplicationContext applicationContext = null;
  12. public UserDaoTest(){
  13. applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  14. }
  15. /**
  16. * DAO,简单起见,不使用接口。
  17. */
  18. private UserDaoImpl userDao;
  19. private UserDaoImpl getUserDao(){
  20. if(userDao==null){
  21. userDao = (UserDaoImpl)applicationContext.getBean("userDao");
  22. }
  23. return userDao;
  24. }
  25. /**
  26. * 返回GUID,用作主键
  27. * <br/>
  28. * 时间:2016-3-16,作者:wallimn@sohu.com
  29. * @return
  30. */
  31. private String getUUID(){
  32. return UUID.randomUUID().toString().replace("-", "").toLowerCase();
  33. }
  34. /**
  35. * 创建测试用表
  36. * <br/>
  37. * 时间:2016-3-16,作者:wallimn@sohu.com
  38. */
  39. @Test
  40. public void testCreateTable(){
  41. this.getUserDao().createUserTable();
  42. }
  43. /**
  44. * 插入、删除用户测试
  45. * <br/>
  46. * 时间:2016-3-16,作者:wallimn@sohu.com
  47. */
  48. @Test
  49. public void testAddAndDeleteUser(){
  50. String id1 = this.getUUID();
  51. String id2 = this.getUUID();
  52. String id3 = this.getUUID();
  53. String id4 = this.getUUID();
  54. this.getUserDao().deleteAllUser();
  55. User user=new User();
  56. user.setId(id1);
  57. user.setUsername("wallimn");
  58. user.setPassword("wallimn@sohu.com");
  59. this.getUserDao().addUser(user);
  60. user.setId(id2);
  61. this.getUserDao().addUserBean(user);
  62. user.setId(id3);
  63. this.getUserDao().addUserBean(user);
  64. Map<String,Object> m = new HashMap<String,Object>();
  65. m.put("id", id4);
  66. m.put("username", "张三");
  67. m.put("password", "mypwd");
  68. this.getUserDao().addUserMap(m);
  69. System.out.println("==插入四个用户,结果如下==");
  70. this.showUsers();
  71. this.getUserDao().deleteUser(id1);
  72. System.out.println("==删除一个用户,结果如下==");
  73. this.showUsers();
  74. System.out.println("==查询测试,结果为List==");
  75. List<Map<String,Object>> list = this.getUserDao().queryForList();
  76. for(Map<String,Object> map :list){
  77. System.out.println(map.get("username"));
  78. }
  79. System.out.println("==查询测试,结果为Map==");
  80. Map<String,Object> map = this.getUserDao().queryForMap(id3);
  81. System.out.println(map.get("username"));
  82. //如果没有查到数据,会报异常
  83. //map = this.getUserDao().queryForMap("notexist");
  84. //System.out.println(map.get("username"));
  85. System.out.println("==查询测试,结果为String==");
  86. String username = this.getUserDao().queryForObject(id3);
  87. System.out.println(username);
  88. //如果没有查到数据,会报异常
  89. //username = this.getUserDao().queryForObject("notexist");
  90. //System.out.println(username);
  91. }
  92. @Test
  93. public void testBatchInsert(){
  94. this.getUserDao().deleteAllUser();
  95. List<User> users = new LinkedList<User>();
  96. for(int i=0; i <1000; i ++){
  97. User u = new User();
  98. u.setId(String.format("%04d", i));
  99. u.setUsername("姓名"+i);
  100. u.setPassword("密码"+i);
  101. users.add(u);
  102. }
  103. this.getUserDao().addUsers3(users);
  104. System.out.println("用户数量:"+this.getUserDao().queryUserCount());
  105. }
  106. /**
  107. * 显示所有用户,查看SQL执行情况。
  108. * <br/>
  109. * 时间:2016-3-16,作者:wallimn@sohu.com
  110. */
  111. private void showUsers(){
  112. List<User> users=this.getUserDao().findAll();
  113. for(User user : users){
  114. System.out.println(user);
  115. }
  116. }
  117. }

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读