直接以json方式返回服务器对象
案例:在welcome页面增加图书查询的功能!
1.生成数据库表,添加数据
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`ID` int(4) NOT NULL AUTO_INCREMENT,
`Name` varchar(100) DEFAULT NULL,
`Author` varchar(50) DEFAULT NULL,
`Price` decimal(10,0) DEFAULT NULL,
`Publisher` varchar(100) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES ('1', '明朝那些事儿图文增订版', '当年明月', '82', '北京联合出版公司');
INSERT INTO `book` VALUES ('2', '战争从未如此热血4:二战美日太平洋大对决:西方视角下的晚清图景', '关河五十州', '29', '民主与建设出版社');
INSERT INTO `book` VALUES ('3', '我们的征途是星辰大海', '花千芳', '20', '作家出版社');
INSERT INTO `book` VALUES ('4', '松下幸之助经营智慧书', '松下幸之助', '54', '人民文学出版社');
INSERT INTO `book` VALUES ('5', '大数据时代', '(英)迈尔-舍恩伯格', '31', '浙江人民出版社');
INSERT INTO `book` VALUES ('6', '销售就是要搞定人—一个销售总经理十六年的抢单笔记', '倪建伟', '21', '时代文艺出版社');
INSERT INTO `book` VALUES ('7', '这个男生不太冷:告诉你一个真实的陈楚生', '万俊人', '24', '海南出版社');
2.welcome.jsp 页面设计
<body>
欢迎${name}登录!<br/>
<br/>
<br/>
请输入书名进行模糊查询:<input type="text" id="pattern" >
<input type="button" id="get" value="获取图书"><br>
<table id="books">
</table>
</body>
3.引入JQuery库
拷贝jquery库文件到jslib目录下
<script type="text/javascript" src="${pageContext.request.contextPath}/jslib/jquery-1.11.1.js"></script>
<script type="text/javascript">
$(function(){
})
</script>4.编写Book实体
5.编写BookMapper接口和BookMapper映射文件
添加通过图书名称模糊查询的方法
6.编写dao方法
7.编写controller方法
8.引入jackson包(core,annotations,databind)
http://pan.baidu.com/s/1i3GoYsl
9.修改配置文件(第一个bean可以省略)
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html; charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html; charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
2, 前端接收到json后的处理
jquery的append方法
1.新建Java项目,引入jar包,mybatis的jar包和mysql的jar包src
mybatis的jar包下载
https:///mybatis/mybatis-3/releases
2.建立数据库users,建立表user(id,userName,userPwd)
3.引入mybatis的主配置文件mybatis-config.xml(名字在代码中要用到)
http://mybatis.github.io/mybatis-3/getting-started.html
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development">
<environment id="mysql">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/users" />
<property name="username" value="root" />
<property name="password" value="" />
</dataSource>
</environment>
</environments>
<!-- mapping 文件路径配置 -->
<mappers>
<!-- <mapper class="javastudy.UserMapper" /> -->
<!-- <mapper resource="userMapper.xml"/> -->
</mappers>
</configuration>
4.将数据库连接信息写入单独的properties文件
(1)主配置文件中将连接参数修改为变量
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.password}" /> (2)引入db.properties文件
<properties resource="db.properties"></properties>
(3)在src目录下添加db.properties文件
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/users
db.username=root
db.password=
5.编写实体类User
User(id,userName,userPwd)
6.在实体类所在包下,编写userMapper.xml文件
描述针对这个实体类执行的所有方法
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="javastudy.userMapper">
<select id="selectUser" parameterType="int" resultType="javastudy.User">
select * from User where id = #{id}
</select>
</mapper>
7.编写测试程序
(1)编写MyBatis的工具类
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtils {
public static SqlSession openSession() throws IOException
{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in,"mysql");
return sessionFactory.openSession();
}
}
8,
准备工作:
1.建立项目Student&Contact,拷贝mybatis主配置文件,properties文件,MyBatisUtils工具类
2.建立实体类Student和Contact
3.建立StudentMapper.xml和ContactMapper.xml映射文件模板
4.建立StudentMapper和ContactMapper接口
5.建表student和contact,设定其一对一的对应关系
9,
mybatis日志
(1)mybatis.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.javastudy=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
注意这行代码
log4j.logger.javastudy=DEBUG
10,
多对多需要建立中间表
student_course(sid,cid)
11,
primary key , 复合主键,联合主键(composite key)
让sid和cid都做主键(复合主键)
提取学生的时候,要把学生选择的所有课程也提取出来。(三个表的左连接查询,相对比较复杂)
left jion :学生即使没有选择课程,也能把学生的信息提取出来。
from student,course where (=内连接:inner join)
... 如果学生没有选择课程,学生的信息也提取不出来
12,
三)修改
关联字段一般不需要修改!!一定要修改的话,需要处理好关联关系
13,
IOC控制反转,AOP面向切面编程
14,
什么是spring mvc? spring框架中的一个产品中提供的mvc框架,实现类似 struts的功能。
主要功能:收集表单信息,处理数据,完成处理后的跳转
1.先准备mybatis环境
2.准备springmvc环境
spring mvc 基于 servlet ,需要在web.xml中配置 DispatcherServlet
相比之下,struts2基于过滤器filter,struts1基于servlet,
搭建步骤
1)spring jar下载地址
http:///release/org/springframework/spring/
7个jar包的下载地址:http://pan.baidu.com/s/1c02lQla
beans,context,aop,core,web,webmvc,expression + comms-logging
ClassNotFoundException:类找不到异常
2)配置web.xml,引入前端控制器DispatcherServlet
<!-- Spring MVC配置 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
特别注意servlet-name,这个名字要用于创建springmvc的配置文件。!!!!!!!!!!
3) WEB-INF下创建配置文件
spring-servlet.xml.(spring这个名字要求和web.xml中配置servlet-name的名字一样)
格式和spring的基础配置文件(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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>
4)springmvc可以采用xml配置或者注解配置,xml配置很少用,也比较麻烦,我们只讲解注解配置。
a)引入相关的命名空间mvc和context
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
b)设置注解驱动
<mvc:annotation-driven/>
c)设置controller扫描路径的包名,spring mvc会自动的实例化该包下的controller。
controller相当于struts中的action,用于处理数据,完成转发。
<context:component-scan base-package="javastudy"/>
15,
新建controller接收页面数据
redirect:
1)RequestMapping的设置
2) 如何接受表单数据:通过HttpServletRequest接收数据,像servlet那样操作springmvc。
3)通过对象接收数据
4)通过ModelAndView处理数据和转发
16,
springMVC
@Controller 实例化类
public class UserController {
@RequestMapping("/") 配置路径
public String check()
{
17,
设置容器外跳转return "redirect:welcome.jsp";去掉redirect编程容器内跳转,
1,引入jar包,放到src,在选中点右键Buildpath
2,
<select id="selectUser" resultType="javastudy.User">
select * from User where id = #{id}
</select>
<select id="selectall" resultType="javastudy.User">
select * from User
</select>
<insert id="insertuser" parameterType="javastudy.User" >
insert into user (userName,userPwd) values (#{userName},#{userPwd})
</insert>
<update id="updateuser" parameterType="javastudy.User">
update user set userName=#{userName},userPwd=#{userPwd} where id=#{id}
</update>
<delete id="deleuser" >
delete from user where id=#{id}
</delete>
3,sql语句可以写在
1,映射文件里也可以通过
2,注解写在接口里
3.写在专门的类中
4,
保存联系人信息的时候,指定该联系人对应的学生。
返回插入后生成的自增长属性值的办法
useGeneratedKeys="true" keyProperty="id"
加在student的映射文件里
(在有主键,主表一方加)<insert id="add"parameterType="javastudy.Student" useGeneratedKeys="true" keyProperty="id">
5,
insert into student
(
name,
sex,
pwd,
phone,
grade,
photo
)
values
(
#{name},
#{sex},
#{pwd},
#{phone},
#{grade},
#{photo}
)
sql语句最后一句不用加逗号
6,测试类
public void test() throws IOException {
SqlSession session= MybatisUtils.openSession();
StudentMapper mapper= session.getMapper(StudentMapper.class);
Student student =new Student();
student.setName("张三");
student.setSex("男");
student.setPhone("123456");
student.setGrade("二年级");
student.setPwd("1234566");
mapper.add(student);
ContactMapper mapp= session.getMapper(ContactMapper.class);
Contact contact =new Contact();
contact.setName("张三");
contact.setSex("男");
contact.setPhone("123456");
contact.setRelation("cc");
contact.setStudent(student);//添加学生
mapp.add(contact);
session.commit();
session.close();
7,
特别注意,要在主配置文件中引入Mapper接口!!
mybatis-config.xml里的<mappers>
<mappers>
<mapper class="javastudy.ContactMapper"/>
<mapper class="javastudy.StudentMapper"/>
</mappers>
8,有外键的要在映射文件配置sid,values;#{studen}
9,resultMap="student" 必须为小写
10,
<resultMap type="javastudy.Student" id="student">
<id property="id" column="sid" />
<result property="name" column="sname"/>
<result property="sex" column="ssex"/>
<result property="pwd" column="spwd"/>
<result property="phone" column="sphone"/>
<result property="grade" column="sgrade"/>
<result property="photo" column="sphoto"/>
<association property="contact" javaType="javastudy.Contact">//关联的Contact
<id property="id" column="cid" />
<result property="name" column="cname"/>
<result property="sex" column="csex"/>
<result property="relation" column="crelation"/>
<result property="phone" column="cphone"/>
</association>
</resultMap>
(property必须用name,sex,)
11,左连接 left join: 左边表中数据必须出来
select
s.id sid,
sname,
s.sex ssex,
s.pwd spwd,
s.phone sphone,
s.grade sgrade,
s.photo sphoto,
cid,
cname,
c.sex csex,
c.relation crelation,
c.phone cphone
from
student s(student的数据是一定会出来,这就是使用左连接的好处)
left join
contact c (然后是右表)
ON
c.sid=s.id
WHERE
s.id=16
1.修改从表数据
非关联字段可以随便修改,关联字段sid必须修改为student表中存在的(而且没有联系人的)
学生的id或者修改为null(前提是contact表的sid已经设置为可空)。
2.修改主表数据,非主键字段可以随便修改,
!!!!!!!主键字段不能随便修改,一般也不需要修改!!!!!!!
3, 老师单独添加
添加课程的时候,把课程对应的老师添加进去
返回插入后生成的自增长属性值的办法
useGeneratedKeys="true" keyProperty="id"
4.一对多在一方加,多对多两方都加(<collection property="courses" ofType="javastudy.Course">);
<resultMap type="javastudy.Teacher" id="teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
<result property="sex" column="tsex"/>
<result property="phone" column="tphone"/>
<collection property="courses" ofType="javastudy.Course">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<result property="type" column="ctype"/>
<result property="hours" column="chours"/>
</collection>
5. 学生 学生课程表 课程, 老师(四表)
(A) (B) (C) (D)
(A - B) - (C - D)
select
cid,cname,ctype,chours,
tid,tname,tsex,tphone,
sid,sname,ssex,spwd,sphone,sgrade,sphoto
from
(
select
cid,
cname,
c.type ctype,
c.hours chours,
tid,
tname,
t.sex tsex,
t.phone tphone
from
course c
left JOIN
teacher t
on c.tid=
) t1
left join
(
select
s.id sid,
sname,
s.sex ssex,
s.pwd spwd,
s.phone sphone,
s.grade sgrade,
s.photo sphoto,
sc.cid sccid
from
student_course sc
left join
student s
on sc.sid=s.id
) t2
on t1.cid=t2.sccid
where t1.cid=#{id}
!!(此sql语句放在course里面)!!
1,
设置controller扫描路径的包名,spring mvc会自动的实例化该包下的controller。
controller相当于struts中的action,用于处理数据,完成转发。
1,
springMVC
public class UserController {
//第一种方式(优先选用)
@RequestMapping("/")
public String check(HttpSession session,User user)
{
System.out.println("提交成功!");
String path="login.jsp";
if("zhang".equals(user.getName()))
{
session.setAttribute("name", user.getName());
path="welcome.jsp";
}
return "redirect:"+path;
} //两种方式实现跳转
@RequestMapping("/")
public ModelAndView checke1(User user,HttpSession session)
{
String path="login.jsp";
if("zhang".equals(user.getName()))
{
session.setAttribute("name", user.getName());
path="welcome.jsp";
}
ModelAndView mav =new ModelAndView(new RedirectView(path));
// mav.addObject("name", user.getName());
return mav;
}
}2,
视图,简单说就是JSP文件!
视图解析器的作用:通过视图名称,找到视图!
视图解析器有很多,常用的只有以下这种
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value= ""/>
<property name="suffix" value= ".jsp"/>
</bean>
redirect跳转的方式,视图解析器不起作用。
SSM整合参考文章(直接百度“SSM整合”)
1.需要哪些配置文件? (3个配置文件)
web.xml,springmvc的配置文件,spring和mybatis整合的配置文件
与ssh整合进行对比
1.web.xml中的配置
(1)spring的配置(加载spring的相关配置),其实就是spring和mybatis整合的配置文件
第一步:加载listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
第二步:指定spring配置文件的位置和名字(默认的方式和非默认的方式)。(一般采用默认的)!!!!
contextConfigLocation
总结:可以默认将applicationContext.xml放在web-inf目录下,也可以指定配置文件的名称和位置。
从之前的项目中复制配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
省略以后,相当于
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
(2)spring mvc的配置
(a)默认的方式:在web.xml中配置springmvc的servlet的名字xxx,默认的springmvc配置文件名为xx-servlet.xml
(b)非默认的方式:直接在web.xml中配置springmvc的servlet的时候,指定springmvc配置文件的位置和名字。
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
============================================================================
ssh整合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: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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<context:annotation-config/>
<context:component-scan base-package="net.xinqushi.dao.impl,net.xinqushi.service.impl,net.xinqushi.aop"/>
<aop:aspectj-autoproxy/>
<context:property-placeholder location="classpath:dataSource.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 初始化连接数量; -->
<property name="initialSize" value="0" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="20" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="20" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="0" />
<!-- 最大等待时长 -->
<property name="maxWait" value="60000" />
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超过时间限制多长; -->
<property name="removeAbandonedTimeout" value="180"/>
<!-- 数据源连接参数配置; -->
<property name="username" value="${db.username}"/>
<property name="url" value="${db.url}"/>
<property name="password" value="${db.password}"/>
<property name="driverClassName" value="${db.driverClassName}"/>
</bean>
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="net.xinqushi.model"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 定义切面 -->
<aop:config>
<aop:pointcut expression="execution(* net.xinqushi.service.impl.*.* (..))" id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
<!-- 声明式事务 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true" propagation="REQUIRED"/>
<tx:method name="check*" read-only="true" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
</beans>