java8

来源:互联网 发布:北京搜索引擎优化 编辑:程序博客网 时间:2024/05/13 00:15

1.       熟悉对象化查询方式,熟悉HQL

设计DAO层,实现以下DAO:

实现根据玩家名称查询指定玩家数据的DAO

 

        public List<Player> findByName(Stringname) {

                  try {

                           List<Player> list = newArrayList<Player>();

                           String hql = "from Player where name=?";

                           Query query = session.createQuery(hql);

                           query.setString(0, name);

 

                           // 把多个实体添加到list中

                           for (int i = 0; i < query.list().size(); i++) {

                                    Player player = (Player) query.list().get(i);

                                    list.add(player);

                                    test = true;

                                    System.out.println(player.getId() +"    " +player.getName()

                                                       + "    " +player.getJob() +"    " +player.getGrade()

                                                       + "    " +player.getExp());

                           }

 

                           return list;

                  } catch (Exception e) {

                           test = false;

                           System.out.println("查询操作未完成");

                           List<Player> list1 = newArrayList<Player>();

                           return list1;

                  }

 

        }

实现统计的DAO:按升序的方式,统计显示玩家的宠物数量,结果包括:玩家ID,玩家名称,宠物数量

 

        public List<Player> findPlayer(){

 

                  List<Player> list = newArrayList<Player>();

                  String hql = "select player from Player as player inner joinplayer.pet as pet group by player.id order by count(pet.id)";

                  Query query = session.createQuery(hql);

 

                  for (int i = 0; i < query.list().size(); i++) {

 

                           Player player = (Player) query.list().get(i);

                           list.add(player);

                           test = true;

                           System.out.println(player.getId() +"   " + player.getName()

                                              + "    " +player.getPet().size());

                  }

 

                  return list;

 

        }

显示宠物等级高于主人等级的宠物数据

 

        public List<Pet> findPet() {

 

                  List<Pet> list = newArrayList<Pet>();

                  String hql = "select pet from Player as player inner joinplayer.pet as pet where pet.grade>player.grade";

                  Query query = session.createQuery(hql);

 

                  for (int i = 0; i < query.list().size(); i++) {

                           Pet pet = (Pet) query.list().get(i);

                           list.add(pet);

                           test = true;

                           System.out.println(pet.getId() +"   " + pet.getName() +"   "

                                              + pet.getExp() +"    " +pet.getGrade());

                  }

 

                  return list;

 

        }

 

分别使用Criteria、HQL、SQL,这三种方式来实现以上操作,并对比这种查询方式的区别

Criteria:

1.      Criteria crit = session.createCriteria(Player.class);
crit. add( Restrictions.like("name", "%%") );
List players = crit.list();

2.      Criteria crit = session.createCriteria(Player.class);
crit. addOrder( Order.asc("pet") );
List players = crit.list();

Hql:

1.   String hql ="from Player where name=?";

          Query query = session.createQuery(hql);

          query.setString(0, name);

或者 hql = "from Player user where user.name='yyy' ";

3.       Selectplayer.id,player.name,count(pet.id)  from Playeras player inner join player.pet  as pet group byplayer.id order by count(pet.id)

4.      Select pet  from Player as player inner joinplayer. Pet as pet where pet.grade>player.grade

 

 

Sql:

1.      select *from player where name=”test”

2.      select player.id ,player.name,count(pet_id) from player,player_petwhere player.id=player_pet.player_id group by player.id

3.      select pet.id,pet.name,pet.grade,pet.exp from player,player_pet,petwhere player.id=player_pet.player_id  and player_pet.pet_id=pet.id and  pet.grade>player.grade

 

要求先编写测试用例,测试DAO,实现测试驱动开发

package test.hibernate;

 

import static org.junit.Assert.*;

 

import java.util.ArrayList;

import java.util.List;

 

import hibernate.PlayerDaoHibernate;

import hibernate.model.*;

 

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Test;

 

public class PlayerDaoHibernateTest {

 

        @BeforeClass

        public static void setUpBeforeClass() throws Exception {

        }

 

        @AfterClass

        public static void tearDownAfterClass() throws Exception {

        }

 

        @Before

        public void setUp() throws Exception {

        }

 

        @After

        public void tearDown() throws Exception {

                  

        }

 

        @Test

        public void testFindByName() {

                  PlayerDaoHibernate test = new PlayerDaoHibernate();

                  test.doConfiguration();

                  test.openSession();

                  Player player=test.createPlayer();

                  test.saveEntity(player);

                  

                  List<Player> list =newArrayList<Player>();

                  list.add(player);

                  

                  assertEquals(list, test.findByName("test"));

                  test.closeSession();

        }

 

        @Test

        public void testFindPet() {

                  PlayerDaoHibernate test = new PlayerDaoHibernate();

                  test.doConfiguration();

                  test.openSession();

                  Player player=test.createPlayer();

                  test.saveEntity(player);

                  

                  List<Pet> list =newArrayList<Pet>();

                  list.addAll(player.getPet());

                  

                  assertEquals(list, test.findPet());

                  test.closeSession();

        }

 

 

}