发表于: 2018-09-10 22:02:07
1 437
今天完成
完成DAO,JDBCtemplete
inteface
package how2j_0908;
import java.util.List;
public interface DAO {
//增加
public void add(EntryForm student);
//修改
public void update(EntryForm student);
//删除
public void delete(int id);
//获取
public EntryForm get(int id);
//查询
public List<EntryForm> list();
//分页查询
public List<EntryForm> list(int start, int count);
}
表格对应的实体化对象
package how2j_0908;
public class EntryForm {
public int id;
public String name;
public int qq;
public String type;
public String graduateFrom;
@Override
public String toString(){
return name;
}
}
DAO层
package how2j_0908;
/**
* 编写DAO,分别JdbcTemplate和Mybatis连接数据库,
* 注意使用JDBCTemplate的时候分离Interface和Imple,
* 使用Mybatis的时候注意理解为什么不需要Impl,注意遵守命名规范。
*/
import org.omg.IOP.ENCODING_CDR_ENCAPS;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* 建立数据库中数据对应的对象类class EntryForm
* 编写DAO接口
* 实现DAO接口
* 把驱动初始化放在方法里
* 提供了一个getConnection方法返回连接
* <p>
* 所有的数据库操作都需要事先拿到一个数据库连接Connection,
* 以前的做法每个方法里都会写一个,如果要改动密码,那么每个地方都需要修改。
* 通过这种方式,只需要修改这一个地方就可以了。 代码变得更容易维护,而且也更加简洁。
* jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8
* jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8
*/
public class TestDAO implements DAO {
public TestDAO() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getCollcetion() throws SQLException {
return DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8", "root", "123456");
}
//获取数据总数量
public int getTotal() {
int total = 0;
try (Connection c = getCollcetion(); Statement s = c.createStatement()) {
//sql中查询总数有多种,其中之一为:select count(*) from
String sql = "select count(*) from EntryForm";
//将sql语句的执行结果,赋值给rs
ResultSet rs = s.executeQuery(sql);
//将赋值后的rs表达出来,因为是数据赋值,则表达的最好方式就是用字段表达
//如果下一行的值不为空?还是rs的值不为空?百度得:下一行不为空
while (rs.next()) {
//返回值的第一个数字
total = rs.getInt(1);
}
System.out.println("total=" + total);
} catch (SQLException e) {
e.printStackTrace();
}
return total;
}
@Override
public void add(EntryForm student) {
String sql = "insert into EntryForm values(null,?,?,?,?)";
try (Connection c = getCollcetion(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, student.name);
ps.setInt(2, student.qq);
ps.setString(3, student.type);
ps.setString(4, student.graduateFrom);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void update(EntryForm student) {
String sql = "update EntryForm set name=?,qq=?,type=?,graduateFrom=? where id =?";
try (Connection c = getCollcetion(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, student.name);
ps.setInt(2, student.qq);
ps.setString(3, student.type);
ps.setString(4, student.graduateFrom);
ps.setInt(5, student.id);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void delete(int id) {
try (Connection c = getCollcetion(); Statement s = c.createStatement();) {
String sql = "delete from entryform where id=" + id;
s.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public EntryForm get(int id) {
EntryForm student = null;
try (Connection c = getCollcetion(); Statement s = c.createStatement()) {
String sql = "select * from entryform where id=" + id;
ResultSet rs = s.executeQuery(sql);
if (rs.next()) {
student = new EntryForm();
String name = rs.getString("name");
int qq = rs.getInt(3);
String type = rs.getString(4);
String graduateFrom = rs.getString(5);
student.name = name;
student.qq = qq;
student.type = type;
student.graduateFrom = graduateFrom;
student.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
return student;
}
@Override
public List<EntryForm> list() {
return list(0, Short.MAX_VALUE);
}
@Override
/**把所有的student分页查询出来,转换为student对象后,放在一个集合中返回*/
public List<EntryForm> list(int start, int count) {
List<EntryForm> studentList = new ArrayList<>();
String sql = "select * from EntryForm order by id desc limit ?,?";
try (Connection c = getCollcetion(); PreparedStatement ps = c.prepareStatement(sql)) {
ps.setInt(1, start);
ps.setInt(2, count);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
EntryForm student = new EntryForm();
int id = rs.getInt(1);
String name = rs.getString(2);
int qq = rs.getInt(3);
String type = rs.getString(4);
String graduateFrom = rs.getString(5);
student.id = id;
student.name = name;
student.qq = qq;
student.type = type;
student.graduateFrom = graduateFrom;
studentList.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
}
return studentList;
}
public static void main(String[] args) {
//下面这两行.应该如何解读?
TestDAO dao = new TestDAO();
List<EntryForm> nf = dao.list();
System.out.println("数据库中总共有" + nf.size() + "条数据");
EntryForm student = new EntryForm();
System.out.println("删除所有数据");
for (int i = 1; i <= nf.size(); i++) {
dao.delete(i);
}
System.out.println("数据库中总共有" + nf.size() + "条数据");
System.out.println("取出id=65的数据,他的name是:");
student = dao.get(65);
System.out.println(student.name);
System.out.println("把他的名字改为张三,并更新到数据库");
student.name = "张三";
dao.update(student);
System.out.println("取出id=65的数据,他的name是:");
student = dao.get(65);
System.out.println(student.name);
}
}
什么是类对象
类对象概念: 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。
在理解类对象之前,先说我们熟悉的对象之间的区别:
garen和teemo都是Hero对象,他们的区别在于,各自有不同的名称,血量,伤害值。
然后说说类之间的区别
Hero和Item都是类,他们的区别在于有不同的方法,不同的属性。
类对象,就是用于描述这种类,都有什么属性,什么方法的
获取类对象
获取类对象有3种方式
1. Class.forName
2. Hero.class
3. new Hero().getClass()
在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
注: 准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。因为还没有引入ClassLoader概念, 所以暂时不展开了。
获取类对象的时候,会导致类属性被初始化
无论什么途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)
与传统的通过new 来获取对象的方式不同
反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”
再通过构造器对象创建一个对象
使用放射的方式创建对象的步骤
1.定义一个字符串,内容为"packageName.ClassName",例如
String className="how2j_0907.Hero";
2.创建类对象,三种方式都可以
Class pClass=Class.forName(className);
3.创建一个构造器,该构造器通过类对象获取
Constructor c=pClass.getConstructor();
4.通过构造器实例化
Class object=(Class)c.newInstance();例如
Hero h2=(Hero)c.newInstance();
通过反射修改类对象的某个对象的属性
获取Hero类名字叫name的字段,其中,h.getClass()为获取类对象
Field f1 = h.getClass().getDeclaredField("name");
修改这个字段在这个对象的值
f1.set(h,"teemo");
今天的收货
结束DAO、JDBC的学习,开始Mybatis的学习
遇到的问题
null
明的计划
完成对Mybatis的模仿练习,完成配置XML的学习
评论