spring-jdbcTemplate

一、问题场景        

        如果程序员就希望使用spring框架来做项目,不使用hiberate等其他持久层框架, 那么spring框架如何处理对数据库的操作呢?

方案1.使用做项目时自已开发的JdbcUtils类方案

2.其实spring提供了一个操作数据库(表)功能强大的类JdbcTemplate。我们可以同ioc容器来配置一个jdbcTemplate对象,使用它来完成对数据库表的各种操作。

二、jdbcTemplate需要的包

1、mysql-connector-java.jar  //mysql-java连接驱动

2、c3p0.jar  //c3p0数据库连接池, 也可以使用其他连接池

3、mchange-commons-java.jar  //拓展c3p0功能的jar包

4、spring-jdbc.jar  //spring的数据库访问支持包

基本够用了

三、jdbcTemplate配置数据源

1、首先在mysql中新建数据库 tndb05 ,并新建表monster ,插入测试数据

2、在idea 的source root 下, 新建jdbc.properties数据库配置文件,配置数据库连接信息

jdbc.user=root
jdbc.pwd=
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tndb05

3、在IOC配置文件beans.xml中配置数据源

<!--    引入jdbc.properties配置文件-->
    <context:property-placeholder location="jdbc.properties"/>
<!--    配置数据源dataSource,数据库连接池还可以用其他工具-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.pwd}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="driverClass" value="${jdbc.driver}"/>
    </bean>

4、测试

    @Test
    public void test02() throws SQLException {
        DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
        System.out.println(dataSource.getConnection());
    }

四、jdbcTemplate操作数据表

1、初步使用(插入insert)

先配置xml, 只写一遍,后边不写了

<!--    引入jdbc.properties配置文件-->
    <context:property-placeholder location="jdbc.properties"/>
<!--    配置数据源dataSource 的 bean,数据库连接池还可以用其他工具-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.pwd}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="driverClass" value="${jdbc.driver}"/>
    </bean>
<!--    配置jdbc模版类的 bean,并引用数据源-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

添加一个monster

    /**
     *  1、初步使用jdbcTemplate- 添加
     */
    @Test
    public void test01 () {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        String sql ="INSERT INTO monster VALUES (400,'小妖怪','玩耍')";
        jdbcTemplate.execute(sql);
    }

2、更新(update)

 /**
     * 3、更新
     */
    @Test
    public void test03() {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        String sql ="UPDATE monster SET skill=? where id=?";
        jdbcTemplate.update(sql,"吐苦水","100");

    }

3、批量添加monster对象

可以直接批量添加对象

 /**
     * 4、批量添加两个monster对象
     */
    @Test
    public void test04() {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        String sql = "INSERT INTO monster VALUES (?,?,?)";
        List<Object[]> list = new ArrayList<Object[]>();
        list.add(new Object[]{500,"白蛇精","变美女"});
        list.add(new Object[]{600,"青蛇精","变丑女"});
        jdbcTemplate.batchUpdate(sql,list);  //注意使用的是batchUpdate()
    }

4、封装成指定对象

查询的内容可以帮我们封装到对象里 , 使用了 RowMapper接口

/**
     * 5、获取jdbcTemplate 查询一条数据,并且给我封装成指定的类型对象
     */
    @Test
    public void test05() {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        //编写sql, 需要与类的属性相匹配
        String sql = "SELECT id,name,skill from monster where id = ?";
        //创建一个RowMapper接口->帮助你将查询的结果封装到对象中
        BeanPropertyRowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class);
        Monster monster = jdbcTemplate.queryForObject(sql, rowMapper, 100);
        System.out.println(monster);
    }

5、查询id>=200的monster并封装到Monster实体对象

 /**
     * 6.查询id>=200的monster并封装到Monster实体对象
     */
    @Test
    public void test06() {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        String sql = "SELECT * FROM monster WHERE id >=?";
        BeanPropertyRowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class);
        List<Monster> monsterList = jdbcTemplate.query(sql, rowMapper, 200);
        for(Monster monster:monsterList) {
            System.out.println(monster);
        }
    }

6、.查询返回结果只有一行一列的值,

比如查询id=100的怪物名字.

 /**
     *查询返回结果只有一行一列的值,
     * 比如查询id=100的怪物名字查询返回共有多少个妖怪
     */
    @Test
    public void test07() {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        //编写sq1,这时你的SELECT语句返回的字段,需要和你的类的属性相互匹配
        String sql ="SELECT name FROM monster WHERE id=100";
        //返回一行的一列的值
        String name = jdbcTemplate.queryForObject(sql, String.class);
        System.out.println("妖怪的名字是"+ name);
    }

 比如查询一共有多少个妖怪

 /**
     * 查询一共有多少个妖怪
     */
    @Test
    public void test07() {
        JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
        //编写sq1,这时你的SELECT语句返回的字段,需要和你的类的属性相互匹配
        String sql ="SELECT count(*) FROM monster";
        //返回一行的一列的值
        Integer num = jdbcTemplate.queryForObject(sql,Integer.class);
        System.out.println("妖怪的数量是"+ num);
    }

7、namedParameterJdbcTemplate

namedParameterJdbcTemplate也有很多的quary(),excute(),update()方法

/**
     * 使用Map传入具名参数添加一个monster
     */
    @Test
    public void test08() {
        //namedParameterJdbcTemplate也有很多的quary(),excute(),update()方法
        NamedParameterJdbcTemplate namedParameterJdbcTemplate =
                (NamedParameterJdbcTemplate) applicationContext.getBean("namedParameterJdbcTemplate");
        //注意值的写法,要加上冒号, 参数名可以自定义
        String sql = "INSERT INTO monster VALUES (:id,:monster_name,:skill)";
        Map<String,Object> paramMap = new HashMap<String,Object>();
        paramMap.put("id",101);
        paramMap.put("monster_name","螃蟹精");
        paramMap.put("skill","大钳子");
        namedParameterJdbcTemplate.update(sql,paramMap);
    }

8、使用namedParameterJdbcTemplate的方式,添加monster

/**
     * 使用具名参数的方式,添加monster
     */
    @Test
    public void test09() {
        NamedParameterJdbcTemplate namedParameterJdbcTemplate =
                (NamedParameterJdbcTemplate) applicationContext.getBean("namedParameterJdbcTemplate");
        String sql = "INSERT INTO monster VALUES (:id,:name,:skill)";
        Monster monster = new Monster(111, "狐狸精", "美人计");
        BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(monster);
        namedParameterJdbcTemplate.update(sql,source);
    }

9、在Dao中使用 jdbcTemplate

  /**
     * 在Dao中使用jdbcTemplate
     */
    @Test
    public void test10() {
        MonstrController monstrController = applicationContext.getBean(MonstrController.class);
        monstrController.save();
    }
@Repository
public class MonstrDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public void save() {
        String sql = "INSERT INTO monster VALUES (999,'蝎子精','毒液')";
        jdbcTemplate.update(sql);
    }

}
@Service
public class MonstrService {
    @Autowired
    private MonstrDao monstrDao;
    public void save () {
        monstrDao.save();
    }
}
@Controller
public class MonstrController {
    @Autowired
    private MonstrService monstrService;
    public void save() {
        monstrService.save();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值