100分SSH框架+ORACLE,连接数据库异常(不提是错误)
package com.dao.imp;
/**
* 用户操作实现类
*/
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.dao.imp.UserDao;
import com.entity.User;
public class UserDaoImpl implements UserDao {
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//登录
public User doLogin(String U_Name, String U_Password) {
User user=null;
Session session = sessionFactory.openSession();
Transaction tx =null;
try {
String hql = "from Users as user where user.U_Name=‘"+U_Name+"’ and user.U_Password='"+U_Password+"'";
tx = session.beginTransaction();
Query query = session.createQuery(hql);
tx.commit();
Iterator it=query.list().iterator();
if(it.hasNext()){
user=(User)it.next();
}
} catch (HibernateException e) {
//如果代码出现异常,则回滚事务
if (tx != null){
tx.rollback();
return user;
}
e.printStackTrace();
}finally {
//关闭Session,释放资源
session.close();
}
return user;
}
public Boolean doAboutName(String oldName, String newName) {
// TODO Auto-generated method stub
return null;
}
public Boolean doAdd(User user) {
// TODO Auto-generated method stub
return null;
}
public List<User> doSelect() {
// TODO Auto-generated method stub
return null;
}
public User doUpdate(User user) {
// TODO Auto-generated method stub
return null;
}
}
红色代码的地方出现异常,直接跳到catch (HibernateException e)处,不知道为什么。求高手指教!!!
[最优解释]
第一中文单引号问题、不能用中文单引号、必须换成英文!!!
‘"+U_Name+"’
[其他解释]
你用createQuery,那么你的整条sql语句都应该是你hibernate里面配置对应数据库里的字段,也就是说就是跟你实体类里面对应的字段。
你的查询的条件U_NAME一看就是数据库里的,你用的是你hibernate里面与之匹配的字段。
<property name="uName" type="java.lang.String">
<column name="U_NAME" />
</property>
查询的时候你的createQuery执行的sql语句要用uName。
[其他解释]
一楼我自己来了
[其他解释]
第二、注意一下user.U_Name跟user.U_Password的时候、尽量使用Users类里面的属性名称!不要使用数据库字段名称、虽然好像可以用、好久没写hql了、不知道呢、LZ试试!
[其他解释]
谢谢啊,我数据库的字段和Users类里面的字段名字一样都是U_Name和U_Password。
引号改掉了,但是还是那里异常
[其他解释]
什么异常、能贴异常信息出来不?
[其他解释]
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:orcl2</value>
</property>
<property name="username">
<value>sqy</value>
</property>
<property name="password">
<value>sqy</value>
</property>
</bean>
<!-- 注入SessionFactory,完成Hibernate与Spring的整合 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">
false
</prop>
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/entity/User.hbm.xml</value>
</list>
</property>
</bean>
<bean id="userDao" class="com.dao.imp.UserDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="userAction" class="com.action.UserAction" >
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
<display-name>Struts Blank</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.objectFactory" value="spring"/>
<include file="struts-default.xml"></include>
<constant name="struts.multipart.maxSize" value="10000000"/>
<package name="myoa" extends="struts-default">
<!-- 使用通配符 -->
<action name="*User" class="userAction" method="{1}">
<result name="login_success">/index.jsp</result>
<result name="login_error">/login.jsp</result>
</action>
</package>
</struts>
UserAction.java
package com.action;
/**
* 用户操作action
*/
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.dao.imp.UserDao;
import com.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private String tip;
private User user;
private UserDao userDao;
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* 用户登录
*/
public String login(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
User u=userDao.doLogin(user.getU_Name(), user.getU_Password());
if(null!=u){
session.setAttribute("user", u);
return "login_success";
}else{
setTip("用户名或密码错误!");
return "login_error";
}
}
public String execute() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
UserDao.java
package com.dao.imp;
/**
* 用户操作接口类
*/
import java.util.List;
import com.entity.User;
public interface UserDao {
public User doLogin(String name, String password);
public Boolean doAdd(User user);
public User doUpdate(User user);
public List<User> doSelect();
public Boolean doAboutName(String oldName,String newName);
}
UserDaoImpl.java
package com.dao.imp;
/**
* 用户操作实现类
*/
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.dao.imp.UserDao;
import com.entity.User;
public class UserDaoImpl implements UserDao {
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//登录
public User doLogin(String name, String password) {
User user=null;
Session session = sessionFactory.openSession();
Transaction tx =null;
try {
String hql = "from User as user where user.U_Name="+name+" and user.userPassword='"+password+"'";
tx = session.beginTransaction();
Query query = session.createQuery(hql);
tx.commit();
Iterator it=query.list().iterator();
if(it.hasNext()){
user=(User)it.next();
}
} catch (HibernateException e) {
//如果代码出现异常,则回滚事务
if (tx != null){
tx.rollback();
return user;
}
e.printStackTrace();
}finally {
//关闭Session,释放资源
session.close();
}
return user;
}
public Boolean doAboutName(String oldName, String newName) {
// TODO Auto-generated method stub
return null;
}
public Boolean doAdd(User user) {
// TODO Auto-generated method stub
return null;
}
public List<User> doSelect() {
// TODO Auto-generated method stub
return null;
}
public User doUpdate(User user) {
// TODO Auto-generated method stub
return null;
}
}
User.java
package com.entity;
public class User {
private int U_Id;
private String U_Name;
private String U_Password;
public int getU_Id() {
return U_Id;
}
public void setU_Id(int U_Id) {
this.U_Id = U_Id;
}
public String getU_Name() {
return U_Name;
}
public void setU_Name(String U_Name) {
this.U_Name = U_Name;
}
public String getU_Password() {
return U_Password;
}
public void setU_Password(String U_Password) {
this.U_Password = U_Password;
}
}
User.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.entity.User" table="USERS" dynamic-insert="true">
<id name="userId" type="java.lang.Integer">
<column name="USERID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<property name="userName" type="java.lang.String">
<column name="USERNAME" length="50" />
</property>
<property name="userPassword" type="java.lang.String">
<column name="USERPASSWORD" length="50" />
</property>
</class>
</hibernate-mapping>
[其他解释]
Query query = session.createQuery(hql);
Query query = session.createSQLQuery(hql);
先区分这个。
你执行的是hql语句,不是sql,你的语句里有sql语句的写法。
[其他解释]
运行登录网页,输入正确的帐号密码,显示帐号密码不正确。
调试的时候,在Query query = session.createQuery(hql); 这行代码初,直接跳到catch (HibernateException e)处,没有任何提示。然后就if (tx != null)判断成功。
调试从Query query = session.createQuery(hql);开始出的问题。
[其他解释]
用Query query = session.createSQLQuery(hql);出现500错误。应该是Query query = session.createSQLQuery(sql)吧
[其他解释]
catch (HibernateException e) {
e.printStackTrace();
//如果代码出现异常,则回滚事务
if (tx != null){
tx.rollback();
return user;
}
把异常信息打印出来、或者直接调试看看是什么异常!!!
要不会找死人的!
还有='"+name+"'加上单引号、刚刚不是说不加单引号是说不能加上中文字符的单引号!!!
[其他解释]
+1
[其他解释]
像实体类的字段,最好遵循驼峰命名法
[其他解释]
主要的问题应该出在你的HQL语句上 你好好的看看 query执行HQL语句的时候报的错。
------其他解决方案--------------------
applicationContext.xml没有读取到实体类映射文件
[其他解释]
不能把异常信息打印出来看下吗?
[其他解释]
运行
catch (HibernateException e) {
e.printStackTrace();
//如果代码出现异常,则回滚事务
if (tx != null){
tx.rollback();
return user;
}
出现了它
org.hibernate.hql.ast.QuerySyntaxException: Users is not mapped [from Users as user where user.U_Name='sang' and user.U_Password='sang']
[其他解释]
异常信息是啥?,是控制台输出的吗?
是这个吗↓
2012-11-15 14:47:52 org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin;D:\apache-tomcat-6.0.20\bin
2012-11-15 14:47:52 org.apache.coyote.http11.Http11Protocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2012-11-15 14:47:52 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 568 ms
2012-11-15 14:47:52 org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2012-11-15 14:47:52 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/6.0.20
2012-11-15 14:47:52 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
2012-11-15 14:47:52 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()
2012-11-15 14:47:52 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: validateJarFile(D:\apache-tomcat-6.0.20\webapps\HR\WEB-INF\lib\javaee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2012-11-15 14:47:53 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
2012-11-15 14:47:58 org.apache.catalina.loader.WebappClassLoader validateJarFile
信息: validateJarFile(D:\apache-tomcat-6.0.20\webapps\SangOA\WEB-INF\lib\javaee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2012-11-15 14:47:59 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
2012-11-15 14:48:03 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2012-11-15 14:48:03 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2012-11-15 14:48:03 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/32 config=null
2012-11-15 14:48:03 org.apache.catalina.startup.Catalina start
信息: Server startup in 11396 ms
[其他解释]
又是你 ! from Users as user where user.U_Name='sang' and user.U_Password='sang' 改成
from User as user where user.U_Name='sang' and user.U_Password='sang'
[其他解释]
运行
catch (HibernateException e) {
e.printStackTrace();
//如果代码出现异常,则回滚事务
if (tx != null){
tx.rollback();
return user;
}
出现了它
org.hibernate.hql.ast.QuerySyntaxException: Users is not mapped [from Users as user where user.U_Name='sang' and user.U_Password='sang']
[其他解释]
下次发帖的时候、记得贴上异常信息哦亲!
就是:org.hibernate.hql.ast.QuerySyntaxException: Users is not mapped [from Users as user where user.U_Name='sang' and user.U_Password='sang']
这样大家才能更好的给你解决问题哦亲!
记得结贴给分、给好评哦亲!
[其他解释]
Users is not mapped :找不到Users的映射、的确没有、因为你映射的是User类!
20楼的兄弟指出了你的一个错误、就是Users!
你更改过后、还是会继续错误!
因为你的配置有问题、看一下你的User类、几个属性名称、跟hbm配置的属性名称不对应!
private int U_Id;
private String U_Name;
private String U_Password;
<id name="userId" type="java.lang.Integer">
<column name="USERID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<property name="userName" type="java.lang.String">
<column name="USERNAME" length="50" />
</property>
<property name="userPassword" type="java.lang.String">
<column name="USERPASSWORD" length="50" />
</property>
可做如下修改(按照我的习惯来改):
private int uid;
private String uame;
private String upassWord;
<id name="uid" type="java.lang.Integer">
<column name="USERID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<property name="uame" type="java.lang.String">
<column name="USERNAME" length="50" />
</property>
<property name="upassWord" type="java.lang.String">
<column name="USERPASSWORD" length="50" />
</property>
hql修改如下:
String hql = " from User as user where user.uame='"+name+"' and user.upassWord='"+password+"'";
前提是你的表名跟字段名与你提供的映射文件中的相同
<class name="com.entity.User" table="USERS" dynamic-insert="true"> com.entity.User对应你java中类的名称(全路径) table="USERS"对应数据库表名
<property name="uame" type="java.lang.String"> 对应的是java中User类的属性名称
<column name="USERNAME" length="50" /> 对应的是数据库中Users表中的USERNAME字段
记住要对应哦亲!!!
[其他解释]
[quote=引用:]
出现了它
org.hibernate.hql.ast.QuerySyntaxException: Users is not mapped [from Users as user where user.U_Name='sang' and user.U_Password='sang'] quote]
这个就是异常信息,会在控制台输出显示的。
错误都是依据这个来进行处理的。
entity:
public class User {
//属性名大写开头?是谁教你的? private int u_id; ok?
private int U_Id;
private String U_Name;private String U_Password;
public int getU_Id() {
return U_Id;
}
public void setU_Id(int U_Id) {
this.U_Id = U_Id;
}
public String getU_Name() {
return U_Name;
}
public void setU_Name(String U_Name) {
this.U_Name = U_Name;
}public String getU_Password() {
return U_Password;
}
public void setU_Password(String U_Password) {
this.U_Password = U_Password;
}
}
entity.hbm.xml:
<hibernate-mapping>
<class name="com.entity.User" table="USERS" dynamic-insert="true">
<id name="userId" type="java.lang.Integer">
<!--数据库里面的字段名称是不区分大小写的-->
<column name="USERID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<property name="userName" type="java.lang.String">
<column name="USERNAME" length="50" />
</property>
<property name="userPassword" type="java.lang.String">
<column name="USERPASSWORD" length="50" />
</property>
</class>
</hibernate-mapping>
一般来讲,entity中的属性名和entity.hbm.xml中的column列名是一样的,为了便于修改和管理。
平时多注意代码的规范,如果不知道什么是规范,就把代码发上来,让大家帮你看看。