发表于: 2017-10-12 20:18:23

2 650


今天完成的事

再一次编写了JdbcTemplate,是的,第三次编写了,内心的无比的。。。。。emmmm。

1,首先先建好数据库对应的Model

package DAO1;

public class Student3 {
   private int id;
   private String user_name;
   private int user_qq;
   private String user_school;
   private String will;
   private int creat_at;
   private int update_at;

   public Student3(int id, String user_name, int user_qq, String user_school, String will, int creat_at, int update_at) {
       this.id = id;
       this.user_name = user_name;
       this.user_qq = user_qq;
       this.user_school = user_school;
       this.will = will;
       this.creat_at = creat_at;
       this.update_at = update_at;


   }

   public Student3() {

   }


   public int getId() {
       return id;
   }

   public void setId(int id) {
       this.id = id;
   }

   public String getUser_name() {
       return this.user_name;
   }

   public void setUser_name(String user_name) {
       this.user_name = user_name;
   }

   public int getUser_qq() {
       return user_qq;
   }

   public void setUser_qq(int user_qq) {
       this.user_qq = user_qq;
   }

   public String getUser_school() {
       return user_school;
   }

   public void setUser_school(String user_school) {
       this.user_school = user_school;
   }

   public String getWill() {
       return will;
   }

   public void setWill(String will) {
       this.will = will;
   }


   public int getUpdate_at() {
       return update_at;
   }

   public void setUpdate_at(int update_at) {
       this.update_at = update_at;
   }

   public int getCreat_at() {
       return this.creat_at;
   }

   public void setCreat_at(int creat_at) {
       this.creat_at = creat_at;
   }

   @Override
   public String toString() {
       return "Student3{" +
               "id=" + id +
               ", user_name='" + user_name + '\'' +
               ", user_qq=" + user_qq +
               ", user_school='" + user_school + '\'' +
               ", will='" + will + '\'' +
               ", creat_at=" + creat_at +
               ", update_at=" + update_at +
               '}';
   }
}

2,对数据库每一行的进行封装。(这里提到了封装,理解不是很好作为今日问题展开)

package DAO1;

import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
public  class StudentMapper implements RowMapper<Student3> {

   public Student3 mapRow(ResultSet rs,int rowNum) throws SQLException {
       Student3 student = new Student3();
       student.setId(rs.getInt("id"));
       student.setUser_name(rs.getString("user_name"));
       student.setUser_qq(rs.getInt("user_qq"));
       student.setUser_school(rs.getString("user_school"));
       student.setWill(rs.getString("will"));
       student.setCreat_at(rs.getInt("creat_at"));
       student.setUpdate_at(rs.getInt("update_at"));

       return student;

   }

}

3,编写接口类

package DAO1;

import java.util.List;

public interface Student3Dao {
   //创建数据库表结构
   public void create();

   //插入一条学生数据
   public void insert(Student3 student);

   //通过主键取得对象
   public Student3 getStudent(Integer id);

   //取得表中所有学生
   public List<Student3> liststudents();

   //通过主键删除对象
   public void delete(Integer id);

   //通过主键更改对象
   public void update(Student3 student);


}

4,实现类

package DAO1;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

@Component("Student3DaoImpl")
public class Student3DaoImpl implements Student3Dao {

   @Autowired
   private JdbcTemplate jdbcTemplate;

   @Override
   public void create() {
       System.out.println("执行建表操作");
       //jdbcTemplate.execute("DROP table IF EXISTS student3 ");
       //jdbcTemplate.execute("CREATE TABLE student (id int primary key, name varchar(100),age int,sex varchar(2))");
   }

   @Override
   public void insert(Student3 student) {
       System.out.println("================执行插入操作================");
       jdbcTemplate.update("INSERT INTO student3 VALUES('" + student.getId()
               + "', '" + student.getUser_name() + "', '" + student.getUser_qq()
               + "', '" + student.getUser_school() + "', '" + student.getWill() + "', '" + student.getCreat_at() + "', '" + student.getUpdate_at() + "')");

   }

   @Override
   public Student3 getStudent(Integer id) {
       System.out.println("================执行查询单个操作================");
       String SQL = "select * from Student3 where id = ?";
       Student3 student = jdbcTemplate.queryForObject(SQL, new Object[]{id}, new StudentMapper());
       return student;
   }

   @Override
   public List<Student3> liststudents() {
       System.out.println("================执行查询所有操作================");
       String SQL = "select * from Student3";
       List rows = jdbcTemplate.queryForList(SQL);
       Iterator it = rows.iterator();
       while (it.hasNext()) {
           Map studentMap = (Map) it.next();
           System.out.print("学生id:" + studentMap.get("id") + "; ");
           System.out.print("学生name:" + studentMap.get("user_name") + "; ");
           System.out.print("学生QQ:" + studentMap.get("user_qq") + "; ");
           System.out.print("学生毕业院校:" + studentMap.get("user_school") + "; ");
           System.out.print("宣言:" + studentMap.get("will") + "; ");
           System.out.print("创建时间:" + studentMap.get("creat_at") + "; ");
           System.out.println("更新时间:" + studentMap.get("update_at"));
       }
       return rows;

   }

   @Override
   public void delete(Integer id) {
       System.out.println("================执行删除单个数据操作================");
       String SQL = "delete from student3 WHERE id=?";
       jdbcTemplate.update(SQL, id);
       System.out.println("删除了第" + id + "的数据");
       //下面这个return返回的是什么
       return;

   }

   @Override
   public void update(Student3 student) {
       System.out.println("================更新单个数据操作================");
       String SQL = "update student3 set user_name=?, user_qq=?, user_school=?, will=? ,creat_at=? ,update_at=? where id=?";
       jdbcTemplate.update(SQL, new Object[]{student.getUser_name(), student.getUser_qq(), student.getUser_school(), student.getWill(), student.getCreat_at(), student.getUpdate_at(), student.getId()});
   }
}

5,新建一个beans.xml,内容如下:

<?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"
      xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <!-- 配置数据源 -->
   <bean id="dataSource"
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver" />
       <property name="url" value="jdbc:mysql://localhost:3306/mysql?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false" />
       <property name="username" value="root" />
       <property name="password" value="123" />
   </bean>

   <!--配置一个JdbcTemplate实例,并将这个“共享的”,“安全的”实例注入到不同的DAO类中去 -->
   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
       <property name="dataSource" ref="dataSource" />
   </bean>

   <!-- 自动扫描注解的bean -->
   <context:component-scan base-package="DAO1" />

</beans>

6,测试类

package DAO1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {


   public static void main(String[] args) {

       ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
       Student3DaoImpl s = (Student3DaoImpl) context.getBean("Student3DaoImpl");
       //s3di.create();

       Student3 student3 = new Student3(20, "小王", 888, "山大", "baby", 1, 1);
       s.insert(student3);
       s.liststudents();
       System.out.println(s.getStudent(2));
       s.update(new Student3(2, "大王", 15, "水大", "b", 123, 2));
       System.out.println(s.getStudent(2));
       s.delete(20);
       s.liststudents();
   }
}

7,结果。

收获

列举一下,在JdbcTemplate中的几个浪费时间理解的点。

【JdbcTemplate的用处和优点】

       和师兄的交流大概我理解为: JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭。

【RowMappe的作用】

       spring 中的 RowMapper是做什么用的。

用来把数据库中的列字段和java bean中属性对应上,这样就可以赋值了。也像JDBC中的bean.setName(rs.getString("name"); Spring把这段代码抽象出来写成RowMapper。但还有一点不理解,放到问题里了。

【JdbcTemplate的方法详解】

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;
  • Student3 student = jdbcTemplate.queryForObject(SQL, new Object[]{id}, new StudentMapper());
  • 这句话我的理解是,通过调用sql语句,将查询结果通过StudentMapper里面的set方法变成Student类的属性。然后在进行查询(不知道立即的对不)
  • call方法:用于执行存储过程、函数相关语句。(没涉及到)

遇到的问题


1,码过程发现报错:@Override is not allowed when implementing interface method 

查了两个小时什么错误。。。。。。然后在一个博客上发现了IDEA设置有问题。

解决方法如下

     1、在project/module上,右键选择菜单“Open Module Settings” ;

     2、选择Modules,修改“Language Level” 为 “8-Lambdas,......”;

     3、选择Project, 修改“Project language level” 为 “SDK default”。

     4、保存,重启。

2,RowMappe的源码是这样的。

public interface RowMapper<T> {
   T mapRow(ResultSet var1, int var2) throws SQLException;
}

第一个参数我能理解是结果集,那第二个参数int是用来干嘛的,

 StudentMapper里面没用到int啊。理解不来。。师兄指点下。

3,一个愚蠢的问题。

在test测试类中。

Student3DaoImpl s = (Student3DaoImpl) context.getBean("Student3DaoImpl");

为啥不能,直接创建实体类:

Student3DaoImpl s=new Student3DaoImpl()

答。。。。是因为自己实例化出来的@Autowired不会起作用!!!!就不能用jdbcTemplate方法。

4,封装的概念

l  封装表现:

      1、方法就是一个最基本封装体。

      2、类其实也是一个封装体。

l  从以上两点得出结论,封装的好处:

        1、提高了代码的复用性。

        2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。

         3、提高了安全性。

在这里之所以使用interface接口,是可以把StudentDao同意访问。然后Student3DaoImpl实例化方法。

不知道理解的对不对,不对明天我再去查资料之后咨询师兄。


明天的计划

开始搭建mybatis。


返回列表 返回列表
评论

    分享到