发表于: 2017-10-17 20:45:28
2 700
1;昨天未完成的dao实现方法,不好理解,今天先不看接口,直接写orm的方法调用;来理解java的一个对象就是数据库的一条信息;就像昨天写的根据一个ID,来返回一条数据库的信息,所对应的对象,这样就映射起来了,这是从数据库映射到对象的方向。
2;稍微理解了orm再写一点相应的方法,巩固加深记忆理解
Add方法,传进来一个对象,转换成一条数据库的记录
public static void add(Student stu)//传进来一个对象,转换成一条数据库的记录
{。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
String sql = "insert into student (id,name,study_id,qq) values(null,?,?,?)";
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
PreparedStatement ps = c.prepareStatement(sql))
{
ps.setString(1, stu.name);
ps.setInt(2, stu.study_id);
ps.setInt(3, stu.qq);
ps.execute();
Delete方法,根据传进来的对象,id这条属性,删除数据库对应的的这条数据
public static void delete(Student stu)//根据传进来的对象,id这条属性,删除数据库对应的的这条数据。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
String sql = "delete from student where id = ?";
try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/task1?characterEncoding=UTF-8", "root", "1234");
PreparedStatement ps = c.prepareStatement(sql))
{
ps.setInt(1, stu.id);
ps.execute();
update方法,根据对象的属性值,来更新对应的这条信息
public static void update(Student stu)//根据对象的属性值,来更新对应的这条信息
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
String sql = "update student set name = ?,study_id=?,qq=? where id = ?";
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
PreparedStatement ps = c.prepareStatement(sql))
{
ps.setString(1, stu.name);
ps.setInt(2, stu.study_id);
ps.setInt(3, stu.qq);
ps.setInt(4, stu.id);
ps.execute();
list方法,返回的是一个集合,集合的每一个对象就是数据库里的每一条数据
public static List<Student> list()//返回的是一个集合,集合的每一个对象就是数据库里的每一条数据
{
List<Student> stus = new ArrayList<>();
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
String sql = "select *from student";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
Student stu = new Student();
int id = rs.getInt("id");
String name = rs.getString("name");
int study_id = rs.getInt("study_id");
int qq = rs.getInt(4);
stu.id = id;
stu.name = name;
stu.study_id = study_id;
stu.qq = qq;
stus.add(stu);
最后是main方法的调用
List<Student> st = list();//把数据库的每一条信息,转成一个st对象
System.out.println("数据库的信息总数: " + st.size());
//用add方法插入一条新数据;这是把一个对象那个映射成数据库信息,实际上插入一个对象
Student s = new Student();
s.name = "new name";
System.out.println("插入一条数据");
add(s);
st = list();//执行list也就是把数据库的记录,转换成Java的对象集合
System.out.println("插入之后的数据库数量: " + st.size());
//获取id为50的数据,返回的是一个对象,查看属性信息
System.out.println("获取id为59的数据,他的信息是:");
s = get(59);
System.out.println(s.id + " " + s.name + " " + s.study_id + " " + s.qq);
//用update方法更新这个对象,也是映射关系,通过更新数据库信息
System.out.println("更改名字id为55的name为:小明");
s.name = "小明";
update(s);
//查看是否更新成功
System.out.println("查看更改后id为59的name为:");
s = get(59);
System.out.println(s.name);
//删除id为59的数据
System.out.println("删除id为59的数据");
delete(s);
//查看数据表数量
st = list();
System.out.println("删除之后的数据:" + st.size());
总结:上面那些方法,都是直接调用,从开发人员来看,这也是一种封装,这些方法都把jdbc封装起来了, 使用的时候看不到jdbc的,这也是orm的概念
3;是dao接口的编写
然后是dao接口的实现,这里做了一些改动,就是把上面重复的驱动加载放到构造方法里面,执行一次就ok;把获取连接connection抽象出来一个方法,被下面方法来调用;然后就是来实现了
4;spring的学习应用,本来打算学习mybatis,想了一下先了解spring,然后弄template吧,好像才看懂jdbc-template是可以称之为spring-jdbc的玩意,具体后说,先学习spring。理论概念的话就不多水了,主要记住两点依赖注入和控制反转,两者基本目的相同,需要的对象,和需要的属性等依赖,都是由spring来完成。
先写了解ioc和di的代码,来实际理解控制反转和依赖注入;写一个实体类(pojo,javabean,都是实体类指同一个东西),最终实现用Spring获取一个对象,并为name注入属性”bigdudada”
然后配置Spring的核心文件applicationContext.xml,作用是通过关键字s获取student对象,该对象获取的时候,即被注入了字符串"bigdudada“到name属性中。
测试代码,通过spring获取student对象,以及该对象被注入的name属性,第一次出现小问题,配置文件里没写好bean对象
public class Spring_IOC_DI
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]
{"applicationContext.xml"});
Student s = (Student)context.getBean("s");
System.out.println(s.getName());
总结:传统的方式,通过new 关键字主动创建一个对象;IOC方式,对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 这也是IOC反转控制,就像控制权从本来在自己手里,交给了Spring。
5;上面说的是通过spring获取一个student对象并且注入一个name属性,现在实现通过创建一个school对象来注入另一个student对象。
先创建一个school类里面包含student的gettersetter方法;
public Student getStudent()
{
return student;
}
public void setStudent(Student student)
{
this.student = student;
}
然后,配置xml文件,在创建school的时候注入一个student对象(这里要使用ref来注入另一个对象
<bean name="s" class="big.dada.Student">
<property name="name" value="bigdudada"/>
</bean>
<bean name="sc" class="big.dada.ioc2.School">
<property name="name" value="peking"/>
<property name="student" ref="s"/>
</bean>
最后是测试,Spring拿到的school对象已经被注入了student对象了
6;上面配置xml来实现,现在用注解方式来<context:annotation-config/>
@Autowired注解
首先在xml文件里加上注解的标识符,然后把之前创建对象的ref注释掉
再在school下面把student的属性前加上@Autowired注解
这里@Autowired也可以放在对象的set方法上,效果一样
运行测试ok
7;@Resource注解方式,这个就不多说了,直接在对象上加上@Resource(name="....");就可以实现与上述一样的效果了。
8;上面是实现的都是对注入对象行为的注解,也就是创建一个对象的过程的注入,还有跟厉害的是直接把对象移除xml,把bean对象也进行注解配置
首先是把之前注解的表示符改一下,由<context:annotation-config/>改成
<context:component-scan base-package="big.dada.ioc2"/>其作用是告诉Spring,bean都放在big.dada.ioc2这个包下,然后下面的属性对象信息也不用了
然后,为school和student类加上@Component注解,即表明此类是bean;因为属性配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了。
第一次是失败找不到bean对象,因为我的student对象和school不在一个package里,改一下配置文件的package放大一个级别,或这放到同一个package里就可以了
明日计划的事情:
mybatis的学习实践
遇到的问题及解决方法:
1;突然连接就报错了。。发现mysql断了
2;语法错误找了半天,,发现是多打了一个逗号。。。
3;仍然是语法错误,字段名写错了一个。。。。
4;数据库里的数据为空,执行删除语句会报异常
5;再说三个碍眼的下划线
Sql语句提示
数据库提示nodatasource
代码重复提示
收获:
1;DAO的编写学习,理解了一点orm思想
2;spring应用以及注入反转理解学习
Ps;第一次真正意义上实践学习dao,spring感觉还是有点急了,基础本来就不牢靠,前期也没学,不过好像也没什么好办法了,只能按照这个节奏来了,再快就理解不了了。
评论