一、没法实例化问题
检查一下数据库是否正常链接。我使用的是IDEA,能够用它直接链接数据库试试,若是它都链接失败了,那确定出问题。java
二、空指针问题
运行后报空指针的错误,后来打断点发现就是在session处出问题,后来检查各类注解,把
@Autowired
public SessionFactory sessionFactory;
public Session getCurrentSession() {
return this.sessionFactory.openSession();}
单独写在一个dao层的类里面,别的类继承这个类便可。把数据库操做语句改为hql,我原来使用的是原生sql语句,最后不报错了,至因而哪一点引发的错误还须要后续慢慢找缘由。web
三、运行没有报错,可是除了“添加”,别的数据库操做都没有起做用
在网上搜了一下,说是事务方面出了问题,原来的代码以下:sql
@Transactional(readOnly = false)
public void editCard(UpdateCardBo b){
Session session=getCurrentSession();
session.update(b);
}
我猜测是注解出了问题,本身写事务后以下:数据库
public void editCard(UpdateCardBo b){
Session session=getCurrentSession();
Transaction tx = null;
tx = session.beginTransaction();
session.update(b);
tx.commit();
session.close();
}
运行后数据库被正常操做。至于注解为何没起做用,应该是配置文件的问题。session
四、找不到xxx类型的bean
网上说这个不会影响程序运行,可是我运行时候会报错,没有办法,只能本身new一个对象了。不知道是否是配置文件出了问题,可是同一个类里面的别的@Autowired
注解都没问题。
五、总结ide
逻辑必定要清晰,操做一个数据库,用一个 SessionFactory 就好了,而每操做一次数据库都须要一个Session,新建Session的方式是sessionFactory.openSession()
每调用一次openSession()
都会新建一个Session。svg
更新和删除操做须要获取特定的行,获取特定的行People p = (People) session.get(People.class, id); //id为主键
有些写法是在dao层里写更新和删除方法时传入id参数,可是这种写法缺少灵活性,对删除操做没有影响,可是对于更新操做:ui
private void updatePeople(String name,int id){
Session session = factory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
//id为表的主键
People p = (People) session.get(People.class, id);
p.setName(name);
session.update(p);
tx.commit();
session.close();
}
这种写法会把要更新的属性固定,若是要更新别的字段,就必须写别的更新操做。比较实用的方法是在Service层增长一个新的方法:this
@Override
public UpdateCardBo getId(int id){
return (UpdateCardBo)up.getCurrentSession().get(UpdateCardBo.class,id);
}
使用这个方法能够返回特定 id 的记录信息,在Controller层使用实例以下:spa
UpdateCardBo b=updateCardServiceImpl.getId(1);//updateCardServiceImpl是Service实例
b.setName("yyyyyyy");
b.setUsername("ggggg");
b.setCertUuid("11111111111111111");
b.setIdcard("2222222222222222222222");
updateCardServiceImpl.editCard(b);
能够对不一样字段进行更新。