003-Spring整合JdbcTemplate及Mybatis

1、jdbcTemplate

1.1、概述

它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多的操作模板类。

操作关系型数据的:

JdbcTemplate

HibernateTemplate

操作 nosql 数据库的:

RedisTemplate

操作消息队列的:

JmsTemplate

我们今天的主角在 spring-jdbc.jar 中,我们在导包的时候,除了要导入这个 jar 包 外,还需要导入一个 spring-tx.jar(它是和事务相关的)。

1.2、jdbcTemplate对象创建

我们可以参考它的源码,来一探究竟:

public JdbcTemplate() { } public JdbcTemplate(DataSource dataSource) { setDataSource(dataSource); afterPropertiesSet(); } public JdbcTemplate(DataSource dataSource, boolean lazyInit) { setDataSource(dataSource); setLazyInit(lazyInit); afterPropertiesSet(); }

除了默认构造函数之外,都需要提供一个数据源。既然有set方法,依据我们之前学过的依赖注入,我们可以在配置文件中配置这些对象

1.3、配置数据源

1.3.1、环境搭建

1.3.2、配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">   </beans>

1.3.3、配置DBCP数据源

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean>

Spring 框架也提供了一个内置数据源,我们也可以使用 spring 的内置数据源,它就在spring-jdbc.jar中

 <!-- 配置数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>         <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property>         <property name="username" value="root"></property>         <property name="password" value="root"></property> </bean>

以上这两种都可以使用,任意选一种即可。

1.4、增删改查

1.4.1、配置jdbcTemplate

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd">     <!-- 配置一个数据库的操作模板:JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>   <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> </beans>

1.4.2、基本用法

public static void main(String[] args) { DriverManagerDataSource ds = new DriverManagerDataSource(); ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/ssm"); ds.setUsername("root"); ds.setPassword("root"); //1.创建JdbcTemplate对象 JdbcTemplate jt = new JdbcTemplate(); //给jt设置数据源 jt.setDataSource(ds); //2.执行操作 jt.execute("insert into t_user(username,password)values('ccc','aaa')"); }

1.4.2、Spring整合后的基本用法

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate"); //jdbcTemplate.execute("insert into t_user(username,password)values('张美玲','888')"); // 查询所有 List<User> accounts = jt.query("select * from t_user",new UserRowMapper()); for (User account : accounts) { System.out.println(account); } System.out.println("--------"); User user = jt.queryForObject("select * from t_user where id = ?",new BeanPropertyRowMapper<User>(User.class),1); System.out.println(user); System.out.println("--------"); //返id大于3的总条数 Integer count = jt.queryForObject("select count(*) from t_user where id > ?", Integer.class, 3); System.out.println(count); //多条件查询 、模糊查询 List<User> ulist = jt.query("select * from t_user where t_user.username like ? and nickname like ? ",new UserRowMapper(),new Object[]{"%a%","%a%"}); System.out.println(ulist.size()); for (User user1 : ulist) { System.out.println(user1); }

定义User的封装策略

public class UserRowMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int i) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setUsername(rs.getString("username")); return u; } }

1.5、Dao中添加JdbcTemplate

1.5.1、实体类

public class User { private Integer id; private String username; 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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; } }

1.5.2、定义IUserDao接口

public interface IUserDao { //添加一条用户信息 void add(User user); //根据id删除一条数据 void delete(Integer id); //修改一条数据 void update(User user); //根据条件查询用户信息列表 List<User> getUserList(User user); //根据id查询一条数据 User getUserById(Integer id); //获取总条数 Integer getListCount(); }

1.5.3、在UserDaoImpl实现类中添加jdbcTemplate

public class UserDaoImpl implements IUserDao { private JdbcTemplate jdbcTemplate; @Override public void add(User user) { String sql = " insert into t_user(username) values('"+user.getUsername()+"') "; jdbcTemplate.execute(sql); } @Override public void delete(Integer id) { String sql = "delete from t_user where id = "+id+""; jdbcTemplate.execute(sql); } @Override public void update(User user) { String sql = "update t_user set username = '"+user.getUsername()+"' where id = "+user.getId()+""; jdbcTemplate.execute(sql); } @Override public List<User> getUserList(User user) { String sql = " select * from t_user where 1=1 "; if(user.getUsername()!=null){ sql += "and username like '%"+user.getUsername()+"%'"; } return jdbcTemplate.query(sql,new UserRowMapper()); } @Override public User getUserById(Integer id) { String sql = " select * from t_user where id = "+id+" "; return jdbcTemplate.queryForObject(sql,new UserRowMapper()); } @Override public Integer getListCount() { String sql = "select count(*) from t_user where username like '%美%'"; return jdbcTemplate.queryForObject(sql,Integer.class); } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } }

1.5.4、在配置文件中给UserDaoImpl注入jdbcTemplate

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd">   <!-- 配置账户的持久层 --> <bean id="accountDao" class="com.tledu.dao.impl.UserDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean>   <!-- 配置一个数据库的操作模板:JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>   <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> </beans>

1.5.5、测试

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); JdbcTemplate jt = (JdbcTemplate) context.getBean("jdbcTemplate"); //jdbcTemplate.execute("insert into t_user(username,password)values('张美玲','888')"); // 查询所有 List<User> accounts = jt.query("select * from t_user",new UserRowMapper()); for (User account : accounts) { System.out.println(account); } System.out.println("--------"); //根据id查询一条数据 User user = jt.queryForObject("select * from t_user where id = ?",new BeanPropertyRowMapper<User>(User.class),1); System.out.println(user); System.out.println("--------"); //返id大于3的总条数 Integer count = jt.queryForObject("select count(*) from t_user where id > ?", Integer.class, 3); System.out.println(count); //多条件查询 、模糊查询 List<User> ulist = jt.query("select * from t_user where t_user.username like ? and nickname like ? ",new UserRowMapper(),new Object[]{"%a%","%a%"}); System.out.println(ulist.size()); for (User user1 : ulist) { System.out.println(user1); }

1.5.6、思考:

此种方式有什么问题吗?

答案:

有个小问题。就是我们的 dao 有很多时,每个 dao 都有一些重复性的代码。下面就是重复代码:

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

能不能把它抽取出来呢?请看下一小节。

1.5.7、继承JdbcDaoSupport

JdbcDaoSupport 是 spring 框架为我们提供的一个类,该类中定义了一个 JdbcTemplate 对象,我们可以直接获取使用,但是要想创建该对象,需要为其提供一个数据源:

具体源码如下:   public abstract class JdbcDaoSupport extends DaoSupport { //定义对象 private JdbcTemplate jdbcTemplate; //set 方法注入数据源,判断是否注入了,注入了就创建 JdbcTemplate public final void setDataSource(DataSource dataSource) { if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) { //如果提供了数据源就创建 JdbcTemplate this.jdbcTemplate = createJdbcTemplate(dataSource); initTemplateConfig(); } } //使用数据源创建 JdcbTemplate protected JdbcTemplate createJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } //当然,我们也可以通过注入 JdbcTemplate 对象 public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; initTemplateConfig(); } //使用 getJdbcTmeplate 方法获取操作模板对象 public final JdbcTemplate getJdbcTemplate() { return this.jdbcTemplate; }

1.5.8、UserDaoImpl实现类继承JdbcDaoSupport

public class UserDaoImpl2 extends JdbcDaoSupport implements IUserDao { //private JdbcTemplate jdbcTemplate; @Override public void add(User user) { String sql = " insert into t_user(username) values('"+user.getUsername()+"') "; super.getJdbcTemplate().execute(sql); } @Override public void delete(Integer id) { String sql = "delete from t_user where id = "+id+""; super.getJdbcTemplate().execute(sql); }

1.5.9、在applicationContext.xml中给UserDaoImpl注入dataSource

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> <bean id="userDao" class="com.tledu.dao.impl.UserDaoImpl2"> <!--<property name="jdbcTemplate" ref="jdbcTemplate"></property>--> <property name="dataSource" ref="dataSource"></property> </bean>

1.5.10、测试

public class UserDaoImplTest2 { private ApplicationContext context; @Before public void before(){ context = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void add(){ IUserDao userDao = context.getBean(UserDaoImpl2.class); User user = new User(); user.setUsername("乔森"); userDao.add(user); } @Test public void delete(){ IUserDao userDao = context.getBean(UserDaoImpl2.class); userDao.delete(26); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值