zoukankan      html  css  js  c++  java
  • spring的jdbc

    spring jdbc也是持久化层的技术,和mybatis是一个级别的,帮助我们简化数据库操作的。
    一.举例:spring jdbc 实现dept表的增删改查
    第一步:创建项目,引入jar包
    jar包: spring 核心jar包 spring jdbc的jar包。spring jdbc 要使用数据源连接池,所以我们还要引入dbcp的jar包。
    数据库驱动包。
    第二步:创建spring的主配置文件
    spring jdbc 要使用数据源连接数据库,我们需要先创建数据源连接池,这里我们使用dpcp数据源连接池:
    <!--创建dbcp数据源连接池对象-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <!--驱动-->
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
    <!--url-->
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
    <!--用户名-->
    <property name="username" value="scott"></property>
    <!--密码-->
    <property name="password" value="tiger"></property>
    </bean>
    使用spring 的jdbc 一般会使用JdbcTemplate对象,我们在spring工厂中创建这个对象,这个对象有点像mybatis中
    的SqlSession
    <!--创建spring jdbc的JdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    第三步:创建实体类,dao层
    创建实体类层
    /**
    * 部门管理实体类
    */
    public class Dept {
    private Long deptno;
    private String dname;
    private String loc;
    public Long getDeptno() {
    return deptno;
    }
    public void setDeptno(Long deptno) {
    this.deptno = deptno;
    }
    public String getDname() {
    return dname;
    }
    public void setDname(String dname) {
    this.dname = dname;
    }
    public String getLoc() {
    return loc;
    }
    public void setLoc(String loc) {
    this.loc = loc;
    }
    }

    创建DeptDAO.java

    /**
    * 部门管理的dao接口
    */
    public interface DeptDao {
    /**
    * 保存部门
    * @param dept
    */
    public void save(Dept dept);
    /**
    * 删除部门
    * @param deptno
    */
    public void delete(Long deptno);
    /**
    * 修改部门
    * @param dept
    */
    public void update(Dept dept);
    /**
    * 查询所有部门
    * @return
    */
    public List<Dept> listAll();
    /**
    * 根据主键查询部门
    * @param deptno
    * @return
    */
    public Dept findByDeptno(Long deptno);
    }
    创建dao接口的实现类DeptDaoImpl.java:
    /**
    * 部门管理dao接口的实现
    */
    @Component
    public class DeptDaoImpl implements DeptDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void save(Dept dept) {
    jdbcTemplate.update("insert into dept values(?,?,?)",dept.getDeptno(),dept.getDname(),dept.getLoc());
    }
    @Override
    public void delete(Long deptno) {
    jdbcTemplate.update("delete from dept where deptno=?",deptno);
    }
    @Override
    public void update(Dept dept) {
    jdbcTemplate.update("update dept set dname=?,loc=? where
    deptno=?",dept.getDname(),dept.getLoc(),dept.getDeptno());
    }
    //直接new接口的语法叫匿名内部类
    //有的接口的实现类可能只需要使用一次,这种情况我们就不需要单独再创建一下这个接口的实现类了
    //可以直接使用匿名内容类来创建这个接口的实现类。
    private RowMapper<Dept> rowMapper = new RowMapper<Dept>(){
    //第二个参数代表取到数据的行的下标
    @Override
    public Dept mapRow(ResultSet resultSet, int i) throws SQLException {
    Dept dept = new Dept();
    dept.setDeptno(resultSet.getLong("deptno"));
    dept.setDname(resultSet.getString("dname"));
    dept.setLoc(resultSet.getString("loc"));
    return dept;
    }
    };
    @Override
    public List<Dept> listAll() {
    List<Dept> list = jdbcTemplate.query("select * from dept", rowMapper);
    return list;
    }
    @Override
    public Dept findByDeptno(Long deptno) {
    Dept dept = jdbcTemplate.queryForObject("select * from dept where deptno=?", rowMapper, deptno);
    return dept;
    }
    }
    记在spring 主配置文件中扫描dao包: 
    <!--扫描dao实现类的包-->
    <context:component-scan base-package="com.aaa.springjdbc.dao"></context:component-scan>
    第四步:测试
    /**
    * 测试spring jdbc 增删改查
    */
    public class Test01 {
    public static void main(String[] args) {
    //创建spring工厂类的对象
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    //从工厂中获取DeptDaoImpl的对象
    DeptDao deptDao = context.getBean(DeptDao.class);
    //测试保存
    Dept dept = new Dept();
    dept.setDeptno(1L);
    dept.setDname("技术部");
    dept.setLoc("郑州");
    deptDao.save(dept);
    //测试修改
    dept.setDname("销售部");
    deptDao.update(dept);
    //根据主键查询部门
    Dept result = deptDao.findByDeptno(1L);
    System.out.println("部门编号为1的部门名称为:"+result.getDname());
    //查询所有部门
    List<Dept> depts = deptDao.listAll();
    for (Dept d:
    depts) {
    System.out.println("部门编号:"+d.getDeptno());
    System.out.println("部门名称:"+d.getDname());
    System.out.println("部门位置:"+d.getLoc());
    System.out.println("===");
    }
    //删除部门
    deptDao.delete(1L);
    }
    }

    二.按名称传递参数

      刚才我们在DeptDaoImp中传递参数使用是按占位符的位置传递参数,我们也可以使用按名称的方式传递参数,如果需要按名称传递参数,我们需要使用NamedParameterJdbcTemplate这类的对象,使用之前应该先在spring工厂中创建这个类的对象: 
    <!--创建按名称传递参数需要的jdbc模板对象 这个类中注入dataSource需要使用构造注入-->
    <bean id="namedJdbcTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg index="0" ref="dataSource"></constructor-arg>
    </bean>
    增加按名称传递参数的dao的实现类对象DeptDaoMapper2.java: 
    /**
    * 部门管理dao接口的实现
    */
    @Component
    public class DeptDaoImpl2 implements DeptDao {
    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;
    @Override
    public void save(Dept dept) {
    //需要把所有需要传递的参数封装到Map中
    HashMap<String, Object> map = new HashMap<>();
    map.put("deptno",dept.getDeptno());
    map.put("dname",dept.getDname());
    map.put("loc",dept.getLoc());
    jdbcTemplate.update("insert into dept values(:deptno,:dname,:loc)",map);
    }
    @Override
    public void delete(Long deptno) {
    HashMap<String, Object> map = new HashMap<>();
    map.put("deptno",deptno);
    jdbcTemplate.update("delete from dept where deptno=:deptno",map);
    }
    @Override
    public void update(Dept dept) {
    HashMap<String, Object> map = new HashMap<>();
    map.put("deptno",dept.getDeptno());
    map.put("dname",dept.getDname());
    map.put("loc",dept.getLoc());
    jdbcTemplate.update("update dept set dname=:dname,loc=:loc where deptno=:deptno",map);
    }
    //直接new接口的语法叫匿名内部类
    //有的接口的实现类可能只需要使用一次,这种情况我们就不需要单独再创建一下这个接口的实现类了
    //可以直接使用匿名内容类来创建这个接口的实现类。
    private RowMapper<Dept> rowMapper = new RowMapper<Dept>(){
    //第二个参数代表取到数据的行的下标
    @Override
    public Dept mapRow(ResultSet resultSet, int i) throws SQLException {
    Dept dept = new Dept();
    dept.setDeptno(resultSet.getLong("deptno"));
    dept.setDname(resultSet.getString("dname"));
    dept.setLoc(resultSet.getString("loc"));
    return dept;
    }
    };
    @Override
    public List<Dept> listAll() {
    List<Dept> list = jdbcTemplate.query("select * from dept", rowMapper);
    return list;
    }
    @Override
    public Dept findByDeptno(Long deptno) {
    HashMap<String, Object> map = new HashMap<>();
    map.put("deptno",deptno);
    Dept dept = jdbcTemplate.queryForObject("select * from dept where deptno=:deptno",map,rowMapper);
    return dept;
    }
    }
  • 相关阅读:
    XUartPs_SetFifoThreshold
    函数指针 与 指针函数 的 区别
    zynq SPI 参数配置
    20199118《网络攻防实践》第三周作业
    maven项目将第三方jar包打入自己的jar中
    springboot项目简单的实现操作多数据库源
    WebSocket简单的应用
    怎么使用bat脚本更改本地受保护的hosts文件
    Spring Boot配置ssl证书启用HTTPS协议
    控制animation暂停:animation-play-state
  • 原文地址:https://www.cnblogs.com/duguangming/p/10914055.html
Copyright © 2011-2022 走看看