zoukankan      html  css  js  c++  java
  • Java——JDBC Template

    1.JDBC Template概念

    为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件。
    传统操作方式:

    使用JDBC Template操作方式: 

    JDBC Template提供统一的模板方法,在保留代码灵活性的基础上,尽量减少持久化代码。

    基于JDBC的API的开发案例:

    String sql = "select * from user";
    Statement stmt = conn.createStatement();
    ResultSet resultSet = stmt.executeQuery(sql);
    while (resultSet.next()){
        int uid = resultSet.getInt("uid");
        String name = resultSet.getString("name");
        String mobile = resultSet.getString("mobile");
        String addr = resultSet.getString("addr");
        System.out.println(uid+"  "+name+"  "+mobile+"  "+addr);
    }

    基于JDBC Template的开发案例:
    Integer count = jt.queryForObject("select * from user",Integer.class);

    2.环境依赖

    (1)依赖导入

    <properties>
        <spring.version>4.2.4.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

    (2)bean配置

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://148.70.251.10:3306/selection_course?useUnicode=yes&amp;characterEncoding=utf8"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </bean>
    
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    </beans>

    3.简单使用

    1)execute方法——一般用来执行DDL语句,与表操作相关

    @org.junit.Test
    public void testExecute(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
        jdbcTemplate.execute("create table test(id int,name varchar(32))");
    }

    2)update与batchUpdate方法——对数据进行增删改

    将jdbcTemplate提取出来,方便后面多次利用。

    private JdbcTemplate jdbcTemplate;
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
    }

    (1)update:对数据进行增删改操作

      int update(String sql, Object[] args)
      int update(String sql, Object... args)

    @org.junit.Test
    public void testExecute(){
        jdbcTemplate.execute("create table test(id int,name varchar(32))");
    }
    
    @org.junit.Test
    public void testUpdate(){
        String sql = "insert into student(name,sex) values(?,?)";
        jdbcTemplate.update(sql,new Object[]{"ming","boy"});
    }

    (2)batchUpdate方法:批量增删改操作

      int[] batchUpdate(String[] sql)
      int[] batchUpdate(String sql, List<Object[]>)

    @org.junit.Test
    public void testBatchUpdate(){
        String[] sqls = {
                "insert into student(name,sex) values('kebi','boy')",
                "insert into student(name,sex) values('maoxian','boy')",
                "insert into student(name,sex) values('jiaqi','girl')",
                "insert into student(name,sex) values('xue','girl')",
                "update student set name='xuejiaqi' where name='xue'"
        };
        int[] ret = jdbcTemplate.batchUpdate(sqls);
        System.out.println(ret);
    }
    
    @org.junit.Test
    public void testBatchUpdate2(){
        String sql = "insert into selection(student,course) values(?,?)";
        List<Object[]> list =  new ArrayList<Object[]>();
        list.add(new Object[]{2001,1001});
        list.add(new Object[]{2002,1003});
        int[] ret = jdbcTemplate.batchUpdate(sql, list);
        for (int r: ret){
            System.out.println(r);  //返回值1表示成功
        }
    }

    3)query与queryXXX方法——对数据进行查询操作

    查询简单数据项
    (1)获取一个
      T queryForObject(String sql, Class<T> type)
      T queryForObject(String sql, Class[] args, Class<T> type)
      T queryForObject(String sql, Class<T> type, Object... args)

    (2)获取多个
      List<T> queryForList(String sql, Class<T> type)
      List<T> queryForList(String sql, Object[] args, Class<T> type)
      LIst<T> queryForList(String sql, Class<T> type, Object... args)

    简单示例:

        //查询单个数据
        @org.junit.Test
        public void testQuerySimple(){
            String sql = "select count(*) from student";
            int count = jdbcTemplate.queryForObject(sql, Integer.class);
            System.out.println(count);  //4
        }
    
        //查询多个数据
        @org.junit.Test
        public void testQuerySimple2(){
            String sql = "select NAME from student";
            List<String> names = jdbcTemplate.queryForList(sql,String.class);
            System.out.println(names);
        }
    
        //查询一个对象
        @org.junit.Test
        public void testQueryMap(){
            String sql = "select * from student where id = ?";
            Map<String,Object> s =jdbcTemplate.queryForMap(sql,2001);
            System.out.println(s);  //{id=2001, name=ming_test, sex=boy, born=null}
        }
    
        //查询多个对象
        @org.junit.Test
        public void testQueryMap2(){
            String sql = "select * from student";
            List<Map<String,Object>> s =jdbcTemplate.queryForList(sql);
            System.out.println(s);
    //        [{id=2001, name=ming_test, sex=boy, born=null},
    //        {id=2002, name=kebi, sex=boy, born=null},
    //        {id=2003, name=maoxian, sex=boy, born=null},
    //        {id=2005, name=xuejiaqi, sex=girl, born=null}]
    
        }

    如果将查询结果进行映射了?这样方面后期的数据处理。
    封装一条数据:

    public void testQueryEntity(){
        String sql = "select * from student where id = ?";
        Student stu = jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student stu = new Student();
                stu.setId(resultSet.getInt("id"));
                stu.setName(resultSet.getString("name"));
                stu.setSex(resultSet.getString("sex"));
                stu.setBorn(resultSet.getDate("born"));
                return stu;
            }
        }, 2001);
        System.out.println(stu);  //Student{2001,ming_test,boy,null}
    }

    封装多条数据:

    @org.junit.Test
    public void testQueryEntity2(){
        String sql = "select * from student";
        List<Student> list = jdbcTemplate.query(sql, new RowMapper<Student>() {
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student stu = new Student();
                stu.setId(resultSet.getInt("id"));
                stu.setName(resultSet.getString("name"));
                stu.setSex(resultSet.getString("sex"));
                stu.setBorn(resultSet.getDate("born"));
                return stu;
            }
        });
        System.out.println(list);
    }

    可以将rowmapper封装成一个对象:

    @org.junit.Test
    public void testQueryEntity(){
        String sql = "select * from student where id = ?";
        Student stu = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), 2001);
        System.out.println(stu);  //Student{2001,ming_test,boy,null}
    }
    
    @org.junit.Test
    public void testQueryEntity2(){
        String sql = "select * from student";
        List<Student> list = jdbcTemplate.query(sql, new StudentRowMapper());
        System.out.println(list);
    }
    private class StudentRowMapper implements RowMapper<Student>{
        public Student mapRow(ResultSet resultSet, int i) throws SQLException {
            Student stu = new Student();
            stu.setId(resultSet.getInt("id"));
            stu.setName(resultSet.getString("name"));
            stu.setSex(resultSet.getString("sex"));
            stu.setBorn(resultSet.getDate("born"));
            return stu;
        }
    }

    4.JDBC Template持久层示例

    (1)接口类

    //定义student查询接口
    public interface StudentDao {
        void insert(Student stu);
        void update(Student stu);
        void delete(int id);
        Student select(int id);
        List<Student> selectAll();
    }
    
    
    public class Student {
        private int id;
        private String name;
        private String sex;
        private Date born;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Date getBorn() {
            return born;
        }
    
        public void setBorn(Date born) {
            this.born = born;
        }
    
        @Override
        public String toString() {
            return "Student{" +id+","+name+","+sex+","+born +"}";
        }
    }

    (2)持久层代码开发,之后都可以调用这里面的接口

    @Repository  //声明持久化对象
    public class StudentDaoImpl implements StudentDao {
    
        @Autowired  //自动注入
        private JdbcTemplate jdbcTemplate;
    
        public void insert(Student stu) {
            String sql = "insert into student(name,sex,born) values(?,?,?)";
            jdbcTemplate.update(sql,stu.getName(),stu.getSex(),stu.getBorn());
        }
    
        public void update(Student stu) {
            String sql = "update student set name=?,sex=?,born=? where id=?";
            jdbcTemplate.update(sql,stu.getName(),stu.getSex(),stu.getBorn(),stu.getId());
        }
    
        public void delete(int id) {
            String sql = "delete from student where id=?";
            jdbcTemplate.update(sql,id);
        }
    
        public Student select(int id) {
            String sql = "select * from student where id=?";
            return jdbcTemplate.queryForObject(sql,new StudentRowMapper(),id);
        }
    
        public List<Student> selectAll() {
            String sql = "select * from student";
            return jdbcTemplate.query(sql,new StudentRowMapper());
        }
    
        private class StudentRowMapper implements RowMapper<Student> {
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student stu = new Student();
                stu.setId(resultSet.getInt("id"));
                stu.setName(resultSet.getString("name"));
                stu.setSex(resultSet.getString("sex"));
                stu.setBorn(resultSet.getDate("born"));
                return stu;
            }
        }
    }
  • 相关阅读:
    Java并发--线程间协作的两种方式:wait、notify、notifyAll和Condition
    Java并发--Java线程面试题 Top 50
    Java并发--Timer和TimerTask
    Spring配置--Aop配置详情
    Spring配置--tx事务配置方式
    java并发--Callable、Future和FutureTask
    java并发--CountDownLatch、CyclicBarrier和Semaphore
    精通Matlab数字图像处理与识别
    油砂资源状况与储量评估方法
    家庭自制药蛋
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12521048.html
Copyright © 2011-2022 走看看