发表于: 2017-10-12 20:18:23
2 649
今天完成的事
再一次编写了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&characterEncoding=utf-8&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,封装的概念
1、方法就是一个最基本封装体。
2、类其实也是一个封装体。
l 从以上两点得出结论,封装的好处:
1、提高了代码的复用性。
2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
3、提高了安全性。
在这里之所以使用interface接口,是可以把StudentDao同意访问。然后Student3DaoImpl实例化方法。
不知道理解的对不对,不对明天我再去查资料之后咨询师兄。
明天的计划
开始搭建mybatis。
评论