发表于: 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());
//获取id50的数据,返回的是一个对象,查看属性信息
System.out.println("获取id59的数据,他的信息是:");
s = get(59);
System.out.println(s.id + " " + s.name + " " + s.study_id + " " + s.qq);
//update方法更新这个对象,也是映射关系,通过更新数据库信息
System.out.println("更改名字id55name:小明");
s.name = "小明";
update(s);
//查看是否更新成功
System.out.println("查看更改后id59name为:");
s = get(59);
System.out.println(s.name);
//删除id59的数据
System.out.println("删除id59的数据");
delete(s);
//查看数据表数量
st = list();
System.out.println("删除之后的数据:" + st.size());

总结:上面那些方法,都是直接调用,从开发人员来看,这也是一种封装,这些方法都把jdbc封装起来了, 使用的时候看不到jdbc的,这也是orm的概念

 

 

3;是dao接口的编写

 

然后是dao接口的实现,这里做了一些改动,就是把上面重复的驱动加载放到构造方法里面,执行一次就ok;把获取连接connection抽象出来一个方法,被下面方法来调用;然后就是来实现了

 

 

4spring的学习应用,本来打算学习mybatis,想了一下先了解spring,然后弄template吧,好像才看懂jdbc-template是可以称之为spring-jdbc的玩意,具体后说,先学习spring。理论概念的话就不多水了,主要记住两点依赖注入和控制反转,两者基本目的相同,需要的对象,和需要的属性等依赖,都是由spring来完成。

先写了解iocdi的代码,来实际理解控制反转和依赖注入;写一个实体类(pojojavabean,都是实体类指同一个东西),最终实现用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类里面包含studentgettersetter方法;

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"/>其作用是告诉Springbean都放在big.dada.ioc2这个包下,然后下面的属性对象信息也不用了


然后,为schoolstudent类加上@Component注解,即表明此类是bean;因为属性配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了。


第一次是失败找不到bean对象,因为我的student对象和school不在一个package里,改一下配置文件的package放大一个级别,或这放到同一个package里就可以了

 


 

明日计划的事情:

mybatis的学习实践



遇到的问题及解决方法:

1;突然连接就报错了。。发现mysql断了


2;语法错误找了半天,,发现是多打了一个逗号。。。


3;仍然是语法错误,字段名写错了一个。。。。


4;数据库里的数据为空,执行删除语句会报异常


5;再说三个碍眼的下划线

 Sql语句提示

 数据库提示nodatasource

 代码重复提示


收获:

1DAO的编写学习,理解了一点orm思想

2spring应用以及注入反转理解学习


‍‍Ps;第一次真正意义上实践学习dao,spring感觉还是有点急了,基础本来就不牢靠,前期也没学,不过好像也没什么好办法了,只能按照这个节奏来了,再快就理解不了了。‍‍

 

 

 



返回列表 返回列表
评论

    分享到