javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate
1.hibernate譯為“越冬”,指的是給java程序員帶來春天,因為java程序員無需再關心各種sql了;
2.hibernate通過java類生成數據庫表,通過操作對象來映射成SQL;
3.hibernate是真正意義上的ORM框架,因為他實現了對象(Object)---->關系(Relation)的映射(Mapping);
4.maven項目整體包結構(報錯是eclipse發神經,不用管)
因為hibernate可以根據類生成表,所以只需創建數據庫即可;
create database ssh;?
該案例實現了一個用戶擁有多部手機的關系
?
5.各種配置文件
(1)pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xiaog</groupId><artifactId>testssh</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><dependencies><!-- spring+springmvc頂級依賴包,包含spring-webmvc、spring-aop、spring-beans、spring-context、spring-core、spring-jcl、spring-expression、spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version></dependency><!-- spring-aop所依賴的靜態代理 ,使用aop方式管理事務,在service方法執行前開啟事務,方法執行后提交事務,方法執行失敗回滾事務--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.0</version></dependency><!-- 使用jdbcTemplate中的事務實現 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.5.RELEASE</version></dependency><!-- 數據庫方面 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!-- orm框架 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.2.2.Final</version></dependency><!-- spring對于orm框架的支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.2.4.RELEASE</version></dependency><!-- Logback --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.logback-extensions</groupId><artifactId>logback-ext-spring</artifactId><version>0.1.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.12</version></dependency><!-- jsp需要 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>3.0-alpha-1</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.1.2</version></dependency></dependencies><build><defaultGoal>compile</defaultGoal><plugins><!-- maven插件 --><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId><version>3.1</version> <configuration><source>1.8</source><target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>9999</port><path>/testssh</path><uriEncoding>UTF-8</uriEncoding><finalName>testssh</finalName><server>tomcat7</server></configuration></plugin> <!-- <plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.3.7.v20160115</version></plugin> --></plugins></build> </project> pom.xml?
(2)spring-context.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:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"default-autowire="byName" default-lazy-init="true"><description>Spring公共配置 </description><!-- 1.掃描包: @Repository @Service @Autowired @Resource --><context:component-scan base-package="com.xiaog.dao,com.xiaog.service" /><!-- 2.加載配置文件 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- 3.配置連接池 :druid連接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><!-- 初始化連接數量 --><property name="initialSize" value="5" /><!-- 最大連接數 --><property name="maxActive" value="100" /><!-- 最小連接數 --><property name="minIdle" value="5" /><!-- 配置獲取連接等待超時的時間 --><property name="maxWait" value="120000" /><!-- 超過時間限制是否回收 --><property name="removeAbandoned" value="true" /><!-- 超過時間限制多長 --><property name="removeAbandonedTimeout" value="1800" /><!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="120000" /><!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><!-- 用來檢測連接是否有效的sql,要求是一個查詢語句 --><property name="validationQuery" value="SELECT 1" /><!-- 申請連接的時候檢測 --><property name="testWhileIdle" value="true" /><!-- 申請連接時執行validationQuery檢測連接是否有效,配置為true會降低性能 --><property name="testOnBorrow" value="false" /><!-- 歸還連接時執行validationQuery檢測連接是否有效,配置為true會降低性能 --><property name="testOnReturn" value="false" /><!-- 打開PSCache,并且指定每個連接上PSCache的大小 --><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /><property name="defaultAutoCommit" value="false" /><!-- 配置監控統計攔截的filters --><property name="filters" value="stat"/></bean><!-- 4.spring集成hibernate --><!-- 配置hibernate的SessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><!-- 注入數據源 相關信息看源碼 --><property name="dataSource" ref="dataSource" /><!-- hibernate配置信息 --><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">false</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><!-- 掃描hibernate注解配置的entity --><property name="packagesToScan" value="com.xiaog.entity" /></bean><!-- 5.配置事務管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 6.配置aop --><!-- 配置通知: 定位方法 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" /></tx:attributes></tx:advice><!-- 配置切面 --><aop:config><!-- 定位具體的類:完整類名,使用通配符 --><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xiaog.service.*.*(..))" /></aop:config> </beans> spring-context.xml?
?
?
(3)spring-mvc.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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><!-- 1.啟動自動掃描 --><context:component-scan base-package="com.xiaog.controller" /><!-- 2.注冊MVC注解驅動 --><mvc:annotation-driven /><!-- 3.配置靜態資源 css js imgs --><mvc:resources location="/resources/**" mapping="/resources"/> <mvc:resources location="/webapp/static/**" mapping="/webapp/static"/> <!-- 4.附件上傳 --> <!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> --> <!-- 默認編碼 --> <!-- <property name="defaultEncoding" value="utf-8" /> --> <!-- 文件大小最大值 --> <!-- <property name="maxUploadSize" value="10485760000" /> --><!-- 內存中的最大值 --> <!-- <property name="maxInMemorySize" value="40960" /> --><!-- 啟用是為了推遲文件解析,以便捕獲文件大小異常 --><!-- <property name="resolveLazily" value="true"/> --><!-- </bean> --><!-- 5.配置視圖解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name = "prefix" value="/" /><!-- 前綴 --><property name = "suffix" value = ".jsp" /><!-- 后綴 --><property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> </bean></beans> spring-mvc.xml?
(4)logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration><!-- 控制臺輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- 日志輸出編碼 --> <!-- <Encoding>UTF-8</Encoding> --><layout class="ch.qos.logback.classic.PatternLayout"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> </appender> <!-- 日志輸出級別 --><root level="INFO"> <appender-ref ref="STDOUT" /> </root> <!-- 打印sql語句 --><logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /> ?<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /> ?<logger name="org.hibernate.SQL" level="DEBUG" /><logger name="org.hibernate.type" level="INFO" /><logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /> ?<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> </configuration> logback.xml?
(5)jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssh?useSSL=false&useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=root jdbc.properties?
(6)web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><display-name>testssh</display-name><!-- spring配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context.xml</param-value></context-param> <!-- spring監聽器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 字符編碼過濾器 spring web自動提供一個 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- spring mvc 配置 【中央控制器/前端控制器/總控】 --><servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置Spring mvc下的配置文件的位置和名稱 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!-- 可以配置擴展名,*.do --> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping><!-- 添加日志監聽器 --> <context-param> <param-name>logbackConfigLocation</param-name> <param-value>classpath:logback.xml</param-value> </context-param> <listener> <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class> </listener> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app> web.xml?
?
6.實體類User和Phone
package com.xiaog.entity;import java.util.List;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table;@Entity @Table(name="user") public class User {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String username;private String password;@OneToMany(targetEntity=Phone.class)@JoinColumn(name="user_id")private List<Phone> phones;//一個用戶擁有多部手機public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public List<Phone> getPhones() {return phones;}public void setPhones(List<Phone> phones) {this.phones = phones;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", password=" + password + ", phones=" + phones + "]";}} User?
package com.xiaog.entity;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table;@Entity @Table(name="phone") public class Phone {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;private String brand;//品牌public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}@Overridepublic String toString() {return "Phone [id=" + id + ", brand=" + brand + "]";}} Phone?
?
7.核心dao接口及其實現
package com.xiaog.core.dao;import java.util.List;public interface CoreDao<T> {int insert(T t);int delete(int id);int update(T t);T getOne(int id);List<T> getList(T t);} CoreDao package com.xiaog.core.dao.impl;import java.lang.reflect.ParameterizedType; import java.util.List;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.orm.hibernate4.support.HibernateDaoSupport;import com.xiaog.core.dao.CoreDao; import com.xiaog.entity.User;//繼承HibernateDaoSupport 可以直接使用CRUD操作 public class CoreDaoImpl<T> extends HibernateDaoSupport implements CoreDao<T> {private Class<T> clazz;private final static Logger logger = LoggerFactory.getLogger(CoreDaoImpl.class);@SuppressWarnings("unchecked")public CoreDaoImpl() {this.clazz = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];}@Overridepublic int insert(T t) {return (int) super.getHibernateTemplate().save(t);}@Overridepublic int delete(int id) {super.getHibernateTemplate().delete(new User() {{setId(id);}});return 1;}@Overridepublic int update(T t) {super.getHibernateTemplate().update(t);return 1;}@Overridepublic T getOne(int id) {return super.getHibernateTemplate().get(clazz, id);}@Overridepublic List<T> getList(T t) {//logger.info("進入CoreDaoImpl......");return super.getHibernateTemplate().findByExample(t);}} CoreDaoImpl?
?
8.模塊dao接口及其實現(只需繼承核心dao即可)
package com.xiaog.dao;import com.xiaog.core.dao.CoreDao; import com.xiaog.entity.User;public interface UserDao extends CoreDao<User> {} UserDao package com.xiaog.dao;import com.xiaog.core.dao.CoreDao; import com.xiaog.entity.Phone;public interface PhoneDao extends CoreDao<Phone> {} PhoneDao?
package com.xiaog.dao.impl;import org.springframework.stereotype.Repository;import com.xiaog.core.dao.impl.CoreDaoImpl; import com.xiaog.dao.UserDao; import com.xiaog.entity.User;@Repository public class UserDaoImpl extends CoreDaoImpl<User> implements UserDao {} UserDaoImpl package com.xiaog.dao.impl;import org.springframework.stereotype.Repository;import com.xiaog.core.dao.impl.CoreDaoImpl; import com.xiaog.dao.PhoneDao; import com.xiaog.entity.Phone;@Repository public class PhoneDaoImpl extends CoreDaoImpl<Phone> implements PhoneDao {} PhoneDaoImpl?
?
9.service接口及其實現
package com.xiaog.service;import com.xiaog.entity.User;public interface UserService {User login(User user); } UserService package com.xiaog.service.impl;import java.util.List;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.xiaog.dao.UserDao; import com.xiaog.entity.User; import com.xiaog.service.UserService;@Service public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;private final static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);@Overridepublic User login(User user) {//logger.info("進入UserServiceImpl......");List<User> users = userDao.getList(user);logger.info("users="+users);if(users!=null&&users.size()>0) {return users.get(0);}else {return null;}}} UserServiceImpl?
?
10.controller
package com.xiaog.controller;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping;import com.xiaog.entity.User; import com.xiaog.service.UserService;@Controller @RequestMapping("/user") public class UserController {@Autowiredprivate UserService userService;private final static Logger logger = LoggerFactory.getLogger(UserController.class);@RequestMapping(value = "/login",params= {"username","password","username!=","password!="})public String login(Model model,User user) {logger.info("user(request)="+user);user = userService.login(user);logger.info("user="+user);model.addAttribute("user", user);return "result";}} UserController?
?
11.jsp頁面測試登錄
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!doctype html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body><form action="user/login" method="post"><div><label>username</label><input type="text" name="username"/></div><div><label>password</label><input type="password" name="password"/></div><div><input type="submit" value="登錄"></div></form> </body> </html> index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!doctype html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body>username=${user} </body> </html> result.jsp?
?
12.項目啟動后,你會發現你的ssh數據庫中多了兩張表User和Phone,自己在插入幾條數據
user表? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?phone表
? ? ??
?
13.測試
index.jsp表單中輸入1001和123
result.jsp
?
控制臺打印
2019-06-22 09:40:24.477 [http-bio-9999-exec-9] INFO com.xiaog.controller.UserController - user(request)=User [id=null, username=1002, password=456, phones=null] 2019-06-22 09:40:24.519 [http-bio-9999-exec-9] DEBUG org.hibernate.SQL - select this_.id as id1_1_0_, this_.password as password2_1_0_, this_.username as username3_1_0_ from user this_ where (this_.password=? and this_.username=?) Hibernate: select this_.id as id1_1_0_, this_.password as password2_1_0_, this_.username as username3_1_0_ from user this_ where (this_.password=? and this_.username=?) 2019-06-22 09:40:24.520 [http-bio-9999-exec-9] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - 456 2019-06-22 09:40:24.520 [http-bio-9999-exec-9] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - 1002 2019-06-22 09:40:24.523 [http-bio-9999-exec-9] DEBUG org.hibernate.SQL - select phones0_.user_id as user3_1_1_, phones0_.id as id1_0_1_, phones0_.id as id1_0_0_, phones0_.brand as brand2_0_0_ from phone phones0_ where phones0_.user_id=? Hibernate: select phones0_.user_id as user3_1_1_, phones0_.id as id1_0_1_, phones0_.id as id1_0_0_, phones0_.brand as brand2_0_0_ from phone phones0_ where phones0_.user_id=? 2019-06-22 09:40:24.524 [http-bio-9999-exec-9] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 2 2019-06-22 09:40:24.533 [http-bio-9999-exec-9] INFO com.xiaog.service.impl.UserServiceImpl - users=[User [id=2, username=1002, password=456, phones=[Phone [id=3, brand=三星], Phone [id=4, brand=小米], Phone [id=5, brand=魅族]]]] 2019-06-22 09:40:24.557 [http-bio-9999-exec-9] INFO com.xiaog.controller.UserController - user=User [id=2, username=1002, password=456, phones=[Phone [id=3, brand=三星], Phone [id=4, brand=小米], Phone [id=5, brand=魅族]]] 2019-06-22 10:38:09.540 [http-bio-9999-exec-5] INFO com.xiaog.controller.UserController - user(request)=User [id=null, username=1001, password=123, phones=null] 2019-06-22 10:38:09.549 [http-bio-9999-exec-5] DEBUG org.hibernate.SQL - select this_.id as id1_1_0_, this_.password as password2_1_0_, this_.username as username3_1_0_ from user this_ where (this_.password=? and this_.username=?) Hibernate: select this_.id as id1_1_0_, this_.password as password2_1_0_, this_.username as username3_1_0_ from user this_ where (this_.password=? and this_.username=?) 2019-06-22 10:38:09.550 [http-bio-9999-exec-5] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - 123 2019-06-22 10:38:09.550 [http-bio-9999-exec-5] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - 1001 2019-06-22 10:38:09.554 [http-bio-9999-exec-5] DEBUG org.hibernate.SQL - select phones0_.user_id as user3_1_1_, phones0_.id as id1_0_1_, phones0_.id as id1_0_0_, phones0_.brand as brand2_0_0_ from phone phones0_ where phones0_.user_id=? Hibernate: select phones0_.user_id as user3_1_1_, phones0_.id as id1_0_1_, phones0_.id as id1_0_0_, phones0_.brand as brand2_0_0_ from phone phones0_ where phones0_.user_id=? 2019-06-22 10:38:09.556 [http-bio-9999-exec-5] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - 1 2019-06-22 10:38:09.563 [http-bio-9999-exec-5] INFO com.xiaog.service.impl.UserServiceImpl - users=[User [id=1, username=1001, password=123, phones=[Phone [id=1, brand=華為], Phone [id=2, brand=iphone]]]] 2019-06-22 10:38:09.570 [http-bio-9999-exec-5] INFO com.xiaog.controller.UserController - user=User [id=1, username=1001, password=123, phones=[Phone [id=1, brand=華為], Phone [id=2, brand=iphone]]]?
?
14.注意點:我個人覺得ssh框架坑實在是多,我在搭建的過程中出現了各種各樣的問題,不過最惡心的問題是spring和hibernate存在版本不兼容問題,一開始使用的是spring5+hibernate5,發現報錯,就將hibernate5換成4(應該沒問題了吧),結果還是報錯,折騰半天,發現雖然Pom版本雖然換成4,但是之前dao層用到的HibernateDaoSupport和spring-context.xml配置中SessionFactory還是5的版本,誒,智障問題。
?
轉載于:https://www.cnblogs.com/xiaogblog/p/11067988.html
總結
以上是生活随笔為你收集整理的javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringSecurity密码加密存储
- 下一篇: C++——CString用法大全