zoukankan      html  css  js  c++  java
  • (四)Spring超全面快速入门-Spring JDBC Template

    前言

    所谓JDBC Template就是在尽量保持代码灵活性的前提下,减少代码的书写,之前我们学JDBC的时候,需要连接驱动,创建语句,查询语句,获取查找返回值,设值等等…很不方便。
    在这里插入图片描述
    这两种其实都能达到目的,肯定使用代码少的方法呀。

    增改

    其实JDBC不过就是增删改查,我们看看JDBC Template帮我们简化了什么操作:
    可以增加一条sql语句,可以增加多条sql语句:
    增加或者说创建有两种方法,一种叫execute,但是它一般是用来创建表的,但是你想让他执行插入语句也可以,但是它底层是Statement实现的,所以并不能设置占位符,而真正适合执行插入语句的应该使用update方法,这个方法底层是PreparedStatement实现的,所以可以实现占位符插入,非常适合EE开发,我们简单介绍一下使用方法:
    第一步:
    配置applicationContext.xml:

    
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/selection_course?serverTimezone=GMT%2B8"/>
            <property name="username" value="root"/>
            <property name="password" value="12345678"/>
        </bean>
    
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    

    非常简单,这样就把jdbcTemplate注册到bean当中了,然后我们通过注解调用它:
    还是先获得Bean对象:

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    JdbcTemplate jt = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
    

    这样就获得了JdbcTemplate对象
    如果我们想要非要使用execute方法:

        public void testInsert() {
            jt.execute("insert into course values (1004,'高等数学',5)");
        }
    

    还有修改操作:

        public void testUpdate2() {
            String sql = "update course set score=? where id = ?";
            jt.update(sql,new Object[]{2,1005});
        }
    

    这样就可以了,如果想要设置占位符的方式:
    JdbcTemplate.update(String sql, Object[] obj)

        public void testUpdate() {
            String sql  = "insert into course values (?,?,?)";
            jt.update(sql,new Object[]{1005, "线性代数",3});
        }
    

    当前前面这样的开发方式不如下面这种方式, 不过他们效果是一样的:
    public int update(String sql, Object… args)
    可以添加任意条占位符:

        public void testUpdate3() {
            String sql = "update course set score = ? where id = ?";
            jt.update(sql,3,1005);
        }
    

    这样比较方便,如果想执行多条语句:
    public int[] batchUpdate(final String… sql)

        public void testBatchUpdate() {
            String[] sqls = {
                    "insert into student values(1003, '星彩', '女', '1995-06-01')",
                    "insert into student values(1004,'貂蝉','女','1996-05-04')",
                    "update student set born = '1997-01-12' where id = 1002"
            };
            jt.batchUpdate(sqls);
        }
    

    上面这种插入是针对多种不同的语句的,而且不可以设置占位符,想要设置占位符并且执行批量操作,则不可以执行多条语句:
    public int[] batchUpdate(String sql, List<Object[]> batchArgs)

        public void testBatchUpdate2() {
            String sql = "insert into selection(student, course) values(?,?)";
            List<Object[]> list = new LinkedList<>();
            list.add(new Object[]{1001,1003});
            list.add(new Object[]{1002,1001});
            jt.batchUpdate(sql,list);
        }
    

    第一个sql就是表示只能批量操作这一条sql语句,而后面的List数组表示的数要更新的多组数据

    删查

    想查询怎么办?
    public T queryForObject(String sql, Class requiredType)
    先看个最简单的查询语句:

        public void testQuery() {
            String sql = "select count(*) from course";
            Integer i = jt.queryForObject(sql, Integer.class);
            System.out.println(i);
        }
    

    第一个参数sql是你要查询的语句,第二个参数是你查询后结果的返回值是啥类型的
    查询结果为多条咋办?
    public List queryForList(String sql, Class elementType)

        public void testQueryList() {
            String sql = "select name from course where score = 5";
            List<String> list = jt.queryForList(sql, String.class);
            System.out.println(list);
        }
    

    要使用queryForList方法,将结果保存到一个List列表中

    怎么能像传统jdbc那样,将查询结果保存到实体类中呢?
    public T queryForObject(String sql, RowMapper rowMapper, @Nullable Object… args)
    第一个参数还是你要执行查询的sql语句
    第二个参数是一个接口,这个接口中有一个方法是mapRow,它的执行操作跟传统jdbc一样,请看下面的例子
    第三个参数是不定参数,里面是sql语句中的占位符

        public void testQueryEntity() {
            String sql = "select * from student where id = ?";
            Student o = jt.queryForObject(sql, new StudentRowMapper(), 1001);
            System.out.println(o);
        }
        private class StudentRowMapper implements RowMapper<Student> {
    
            @Override
            public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
                Student student = new Student();
                student.setId(rs.getInt("id"));
                student.setName(rs.getString("name"));
                student.setSex(rs.getString("sex"));
                student.setBorn(rs.getString("born"));
                return student;
            }
        }
    

    如果想查询多条结果呢?比如select * from xxx;
    public List query(String sql, RowMapper rowMapper)

        public void testQueryEntity2() {
            String sql = "select * from student";
            List<Student> list = jt.query(sql,new StudentRowMapper());
            System.out.println(list);
        }
    

    操作比传统jdbc简单吧

    JDBC实例:

    跟传统开发一样,我们先得搞一个接口:

    package com.bean.dao;
    
    import com.bean.pojo.Course;
    
    import java.util.List;
    
    public interface CourseDao {
        void insert(Course course);
        void update(Course course);
        void delete(int id);
        Course search(int id);
        List<Course> selectAll();
    }
    
    

    然后是一个实现类:

    package com.bean.dao.impl;
    
    import com.bean.dao.CourseDao;
    import com.bean.pojo.Course;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;
    
    import javax.annotation.Resource;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    @Repository
    public class CourseDaoImpl implements CourseDao {
    
        @Resource(name = "jdbcTemplate")
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public void insert(Course course) {
            String sql = "insert into course(id,name,score) values (?,?,?)";
            jdbcTemplate.update(sql,course.getId(),course.getName(),course.getScore());
        }
    
        @Override
        public void update(Course course) {
            String sql = "update course set name = ?, score = ? where id = ?";
            jdbcTemplate.update(sql,course.getName(), course.getScore(),course.getId());
        }
    
        @Override
        public void delete(int id) {
            String sql = "delete from course where id = ?";
            jdbcTemplate.update(sql,id);
        }
    
        @Override
        public Course search(int id) {
            String sql = "select * from course where id = ?";
            Course course = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), id);
            return course;
        }
    
        @Override
        public List<Course> selectAll() {
            String sql = "select * from course";
            List<Course> query = jdbcTemplate.query(sql, new StudentRowMapper());
            return query;
        }
    
        private class StudentRowMapper implements RowMapper<Course> {
    
            @Override
            public Course mapRow(ResultSet rs, int rowNum) throws SQLException {
                Course course = new Course();
                course.setId(rs.getInt("id"));
                course.setName(rs.getString("name"));
                course.setScore(rs.getInt("score"));
                return course;
            }
        }
    }
    
    

    这样Dao层就搞完了,怎么样,是不是很简单?

  • 相关阅读:
    适用于小白的 python 快速入门教程
    Centos7.x & RedHat7.x系统忘记 root 密码解决办法
    让我来教你如何免费使用RHEL小红帽系统
    10#Windows注册表的那些事儿
    9#搭建网站
    8#继承和多态
    7#Java基本语句语法
    6#day2总结
    5#关于数据数值的转换
    .NET Core开发日志——配置
  • 原文地址:https://www.cnblogs.com/taobean/p/12364247.html
Copyright © 2011-2022 走看看