Spring集成JDBC

原创
2016/11/15 12:03
阅读数 231

1、导入Spring的包和数据库的驱动包

2、选择一个数据源(DBCP和C3P0)

3、导入数据源的包:DBCP(dbcp2、pool2)

4、在beans.xml中创建dataSource数据源

    <!-- 打开Spring的Annotation支持 -->
	<context:annotation-config/>
	<!-- 设定Spring去哪些包中找Annotation -->
	<context:component-scan base-package="org.pm.spring"/>
	
	<!-- 特别注意:class="org.apache.commons.dbcp2.BasicDataSource",用的是dbcp2,
		api文档中是dbcp。 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="${jdbc.driverClassName}"/>
	    <property name="url" value="${jdbc.url}"/>
	    <property name="username" value="${jdbc.username}"/>
	    <property name="password" value="${jdbc.password}"/>
	</bean>

5、创建一个jdbc.properties文件来设置数据库的连接信息

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/spring_teach?useSSL=false
jdbc.username = root
jdbc.password = 123456

6、在beans.xml中导入相应的properties文件

	<!-- 导入src目录下的jdbc.properties -->
	<context:property-placeholder location="jdbc.properties"/>

7、写相应的DAO,并且为这个DAO创建一个JdbcTemplate对象,通过JdbcTemplate对象可以方便的完
    成对数据库的操作。

@Repository("userJdbcDao")
public class UserDao implements IUserDao {
	private JdbcTemplate jdbcTemplate;
	
	@Resource
	public void setDataSurce(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public void add(User user,int gid) {
		jdbcTemplate.update("insert into t_user (username,password,nickname,gid) value (?,?,?,?)", 
				user.getUsername(),user.getPassword(),user.getNickname(),gid);
	}

	@Override
	public void update(User user) {
		jdbcTemplate.update("update t_user set username=?,password=?,nickname=? where id=?", 
				user.getUsername(),user.getPassword(),user.getNickname(),user.getId());
	}

	@Override
	public void delete(int id) {
		jdbcTemplate.update("delete from t_user where id=?", id);
	}

	@Override
	public User load(int id) {
		String sql = "select t1.id uid,t1.*,t2.* from t_user t1 left join t_group t2 on(t1.gid=t2.id) where t1.id=?";
		/*
		 * 第一个参数是SQL语句
		 * 第二个参数是SQL语句中的参数值,需要传入一个对象数组
		 * 第三个参数是一个RowMapper,这个RowMapper可以完成一个对象和数据库字段的对应,
		 * 实现这个RowMapper的mapRow方法,在mapRow方法中有rs这个参数,通过rs可以有效
		 * 的获取数据库的字段。
		 * 如果这个方法在该DAO中会被重复使用,建议通过内部类来解决,而不要使用匿名的内部类
		 */
		User u = (User)jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserMapper());
		return u;
	}

	@Override
	public List<User> list(String sql,Object[] args) {
		String sqlCount = "select count(*) from t_user";
		//获取特定类型的数值(如:Integer,Long,Double等)
		int count = jdbcTemplate.queryForObject(sqlCount, Integer.class);
		System.out.println(count);
		String nCount = "select nickname from t_user";
		//获取String类型的列表
		List<String> ns = jdbcTemplate.queryForList(nCount, String.class);
		for(String n:ns) {
			System.out.println("----->"+n);
		}
		String tSql = "select username,nickname from t_user";
		//无法取出user
		/*List<User> us = jdbcTemplate.queryForList(tSql, User.class);
		for(User u:us) {
			System.out.println(u);
		}*/
		//对象数组也无法返回
		/*List<Object[]> os = jdbcTemplate.queryForList(tSql, Object[].class);
		for(Object[] oo:os) {
			System.out.println(oo[0]+","+oo[1]);
		}*/
		
		List<User> us = jdbcTemplate.query(tSql, new RowMapper<User>(){

			@Override
			public User mapRow(ResultSet rs, int rowNum) throws SQLException {
				User u = new User();
				u.setNickname(rs.getString("nickname"));
				u.setUsername(rs.getString("username"));
				return u;
			}
			
		});
		for(User u:us) {
			System.out.println(u);
		}
		return jdbcTemplate.query(sql, args, new UserMapper());
	}
	
	private class UserMapper implements RowMapper<User> {

		@Override
		public User mapRow(ResultSet rs, int rowNum) throws SQLException {
			Group g = new Group();
			g.setId(rs.getInt("gid"));
			g.setName(rs.getString("name"));
			User u = new User();
			u.setGroup(g);
			u.setId(rs.getInt("uid"));
			u.setNickname(rs.getString("nickname"));
			u.setPassword(rs.getString("password"));
			u.setUsername(rs.getString("username"));
			return u;
		}
		
	}
@Repository("groupJdbcDao")
public class GroupJdbcDao implements IGroupDao {
	private JdbcTemplate jdbcTemplate;
	
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public void add(final Group group) {
		/**
		 * 通过以下方法可以添加一个对象,并且获取这个对象自动递增的id
		 */
		KeyHolder keyHolder = new GeneratedKeyHolder();
		jdbcTemplate.update(new PreparedStatementCreator() {
			
			@Override
			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				String sql = "insert into t_group (name) value (?)";
				PreparedStatement ps = con.prepareStatement(sql,new String[]{"id"});
				ps.setString(1, group.getName());
				return ps;
			}
		},keyHolder);
		group.setId(keyHolder.getKey().intValue());
	}

8、为DAO注入相应的DataSource并且创建JdbcTemplate

	private JdbcTemplate jdbcTemplate;
	
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

9、完成数据对象的操作。

/**
 * 当使用了以下注释之后,就可以直接在Test中进行依赖注入
 * @author PM
 *
 */
//让Junit运行在spring的测试环境中
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/beans.xml") //加载beans.xml文件
public class TestJdbc {
	@Resource
	private IUserDao userJdbcDao;
	@Resource(name="groupJdbcDao")
	private IGroupDao groupJdbcDao;
	
	@Test
	public void testAdd() {
		Group g = new Group();
		g.setName("文章审核人员");
		groupJdbcDao.add(g);
		System.out.println(g.getId());
		User u = new User("ts","123","提示");
		userJdbcDao.add(u, 1);
	}
	
	@Test
	public void testUpdate() {
		User u = new User("lisi","456","李斯");
		u.setId(2);
		userJdbcDao.update(u);
	}
	
	@Test
	public void testDelete() {
		userJdbcDao.delete(2);
	}
	
	@Test
	public void testLoad() {
		User u = userJdbcDao.load(3);
		System.out.println(u.getNickname()+","+u.getGroup().getName());
	}
	
	@Test
	public void testList() {
		List<User> us = userJdbcDao.list("select t1.id uid,t1.*,t2.* from t_user t1 left join t_group t2 on(t1.gid=t2.id)", null);
		for(User u:us) {
			System.out.println(u);
		}
	}

 

展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部