设计了一个学生表,实现简单的增删改查功能:
总体结构如下:
主要代码如下:
public class MyCRUD {
public static void main(String[] args) {
System.out.println("1.查询");
System.out.println("2.新增");
System.out.println("3.更新");
System.out.println("4.删除");
// System.out.println("5.关联映射");
int n;
Scanner cin = new Scanner(System.in);
n= cin.nextInt();
switch(n) {
case 1:{
System.out.println("输入学号");
int c = cin.nextInt();
SelectDao select = new SelectDao();
select.testSelect(c);
break;
}
case 2:{
System.out.println("输入姓名");
String name = cin.next();
System.out.println("输入年龄");
int age = cin.nextInt();
System.out.println("输入成绩");
int score = cin.nextInt();
Student stu = new Student(name,age,score);
SaveDao save = new SaveDao();
save.testSave(stu);
break;
}
case 3:{
System.out.println("输入学号");
int c = cin.nextInt();
System.out.println("输入新名字");
String name = cin.next();
UpdateDao update = new UpdateDao();
update.testUpdate(c, name);
break;
}
case 4:{
System.out.println("输入学号");
int c = cin.nextInt();
DeleteDao delete = new DeleteDao();
delete.testDel(c);
break;
}
default:{
System.out.println("输入错误");
}}}
主要运行界面如下:
(1)查询功能:
public class SelectDao {
//函数功能:通过id查找学生
//函数参数:要查找记录的id
//返回值:无
public void testSelect(int n_id){
Configuration configure = new Configuration().configure().addClass(Student.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configure.getProperties()).build();
SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
try{
Transaction t = session.beginTransaction();
//Student student = session.load(Student.class,n_id);
Query query = session.createQuery("select s.name, s.age, s.score from Student s where s.id=?");
query.setParameter(0, n_id);
List<Object[]> ss = query.list();
for(Object[] s: ss) {
System.out.println("姓名是:"+s[0]);
System.out.println("年龄是:"+s[1]);
System.out.println("分数是:"+s[2]);
}
t.commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().markRollbackOnly();
}finally {
session.close();
sessionFactory.close();
}}}
(2)新增功能:
public class SaveDao {
//函数功能:将一个新对象保存
//函数参数:保存的对象
//返回值:无
public void testSave(Student stu){
Configuration configure = new Configuration().configure().addClass(Student.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configure.getProperties()).build();
SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
try{
Transaction t = session.beginTransaction();
session.save(stu);//持久态
System.out.println("保存成功");
t.commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().markRollbackOnly();
}finally {
session.close();
sessionFactory.close();
}}}
(3)更新功能:
public class UpdateDao {
//函数功能:通过id修改姓名
//函数参数:arg0 要修改记录的id arg1 修改后的名字
//返回值:无
public void testUpdate(int n_id,String new_name){
Configuration configure = new Configuration().configure().addClass(Student.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configure.getProperties()).build();
SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
//Student student = new Student("Levi",18,100);//瞬时态
try{
Transaction t = session.beginTransaction();
Student student = session.get(Student.class,n_id);
student.setName(new_name);
session.saveOrUpdate(student);//保存并更新
t.commit();
System.out.println("姓名更新成功");
}catch(Exception e){
e.printStackTrace();
session.getTransaction().markRollbackOnly();
}finally {
session.close();
sessionFactory.close();
}}}
(4)删除功能:
public class DeleteDao {
//函数功能:通过对象找到数据,并删除对应id的一条记录
//函数参数:要删除的记录id
//返回值:无
public void testDel(int n_id){
Configuration configure = new Configuration().configure().addClass(Student.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configure.getProperties()).build();
SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
try{
Transaction t = session.beginTransaction();
Student student = session.get(Student.class, n_id);//持久态
session.delete(student);
t.commit();
System.out.println("删除成功");
}catch(Exception e){
e.printStackTrace();
session.getTransaction().markRollbackOnly();
}finally {
session.close();
sessionFactory.close();
}}}
总结:
通过实验的学习,不仅学到了这些session缓存,以及各种方法,包括hql和sql的使用,更是学到了这种思想,包括线程绑定session,可以避免全局资源带来的多线程访问冲突,由对象去管理数据库,而我们操作完全可以不在涉及数据库,只需要操作对象就可以,既避免了SQL语句的编写错误,又解开了程序与数据库的耦合,达到了一个令人满意的效果,在实际编程中,可以借鉴这种思想。