SSM项目第2讲
in 语言/工程/算法
从框架到数据库操作
搭建数据源
MyBatis就是ssm中的m,简化数据库操作的框架
首先在spring.xml引入阿里的Druid框架
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!--驱动名称--> <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="2"/> <!--最大连接池数量--> <property name="maxActive" value="40"/> <!-- 连接池最小空闲 --> <property name="minIdle" value="2"/> <!--获取连接时最大等待时间,单位毫秒。--> <property name="maxWait" value="15000"/> <!--用来检测连接是否有效的sql,要求是一个查询语句。--> <property name="validationQuery" value="select 1"/> <!--申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。--> <property name="testOnBorrow" value="false"/> <!--建议配置为true,不影响性能,并且保证安全性。--> <property name="testWhileIdle" value="true"/> <!--配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒--> <property name="timeBetweenEvictionRunsMillis" value="120000"/> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000"/> <!--对于长时间不使用的连接强制关闭 --> <property name="removeAbandoned" value="true"/> <!--超过30分钟开始关闭空闲连接(秒为单位) --> <property name="removeAbandonedTimeout" value="1800"/> <!--将当前关闭动作记录到日志--> <property name="logAbandoned" value="true"/> <!--自动提交,如果不启用事物可设置为true --> <property name="defaultAutoCommit" value="false"/> <property name="connectionInitSqls" value="set names utf8mb4;"/> </bean>
使用Navicat for MySQL快速登录服务,并且开始新建表格
==具体使用请结合实际,此文接下来都是以增删查改课程举例==
新建com->conf->db.properties,这是druid也就是阿里使用的架包的配置文件。需要改其中jdbc下的url,username和password成自己的数据库地址和管理员账号,这一步相当于db用户登录了数据库新建了一个连接。
jdbc.url=jdbc:mysql://localhost:3306/stulevelsystem? 中3306是你上一步设置的MySQL端口,stulevelsystem是上一步新建连接的端口。
jdbc.username=root 是上一步用户名
jdbc.password=123456 是上一步密码
jdbc.url=jdbc:mysql://localhost:3306/stulevelsystem?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&useSSL=false jdbc.username=root jdbc.password=123456 druid.initialSize=10 druid.maxActive=30 druid.minIdle=3 druid.maxIdle=1 druid.maxWait=60000 druid.removeAbandoned=true druid.removeAbandonedTimeout=18000 druid.timeBetweenEvictionRunsMillis=60000 druid.minEvictableIdleTimeMillis=300000 druid.validationQuery =SELECT 1 FROM DUAL druid.testWhileIdle=true druid.testOnBorrow=false druid.testOnReturn=false druid.poolPreparedStatements=true druid.maxPoolPreparedStatementPerConnectionSize=50 druid.filters=stat jdbc.driver=com.mysql.jdbc.Driver
将db.properties加入spring.xml
<!-- 引入db.properties --> <context:property-placeholder location="classpath:com/conf/db.properties" ignore-unresolvable="true" />
搭建MyBatis
首先在spring.xml引入mybatis设置
property name=”dataSource” ref=”dataSource” 中ref要指定为 bean id=”dataSource” class=”com.alibaba.druid.pool.DruidDataSource” destroy-method=”close”里的id
<!-- mybatis配置开始 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations">
<array>
<value>classpath:mapper/*.xml</value>
</array>
</property>
</bean>
配置Mapper扫描器
路径自选,按照上一讲的框架是不用动的
<!-- 配置Mapper扫描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 扫描包路径,如果需要扫描多个包中间用半角逗号隔开 --> <property name="basePackage" value="com.system.mapper"/> <!-- 这边不能使用ref="sqlSessionFactory"原因是因为上面加载配置文件导致这边引用会报错 --> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean>
==接下来的都请结合实际,此文接下来都是以增删查改课程举例==
编写数据实体类
- 在com.system.entity.pojo下新建实例类
此处有快速添加set,get的好方法
鼠标在代码窗口,鼠标右键,source->Generate Getter and Setters…
全选然后OK
package com.system.entity.pojo;
import java.io.Serializable;
/**
* 课程bean
*/
public class Course implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;//主键
private String name;//名称
private String teacher;//老师
private String period;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
public String getPeriod() {
return period;
}
public void setPeriod(String period) {
this.period = period;
}
}
编写Mapper层
- 在system中新建mapper包CourseMapper.java
package com.system.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.system.entity.pojo.Course;
/**
* 课程Mapper
*
*/
public interface CourseMapper {
public List<Course> findCourseList();
public List<Course> query(Map<String,Object> inputParam);
public int insertCourse(Course course);
public int deleteCourse(@Param("id")String id);
public int updateCourse(Course course);
public Course queryCourseById(String id);
}
在system中新建mapper包CourseMapper.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="com.system.mapper.CourseMapper">
<select id="findCourseList"
resultType="com.system.entity.pojo.Course">
select * from course
</select>
<select id="query" parameterType="java.util.Map" resultType="com.system.entity.pojo.Course">
select * from course u
<where>
<if test="name!=null and name!=''">
and u.name= #{name}
</if>
<if test="pwd!=null and pwd!=''">
and u.teacher= #{teacher}
</if>
</where>
</select>
<select id="queryCourseById" parameterType="java.lang.String" resultType="com.system.entity.pojo.Course">
select * from course where id=#{value}
</select>
<insert id="insertCourse" useGeneratedKeys="true" keyProperty="id" parameterType="com.system.entity.pojo.Course">
insert into course
(id,name,teacher,period)
values
(#{id},#{name},#{teacher},#{period});
</insert>
<update id="updateCourse" parameterType="com.system.entity.pojo.Course" >
update course set
id=#{id},name=#{name},teacher=#{teacher},period=#{period}
where
id=#{id}
</update>
<delete id="deleteCourse" parameterType="java.lang.String">
delete from course where id=#{id}
</delete>
</mapper>
代码解析
<select id="findCourseList"
resultType="com.system.entity.pojo.Course">
<select id="query" parameterType="java.util.Map" resultType="com.system.entity.pojo.Course">
......
com.system.entity.pojo.Course在Course实体类没别名的时候要申明
如果要别名:
com.mybatis.sqlMapConfig中设置类全别名
<?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>
<!-- 全局setting配置,根据需要添加 -->
<!-- 配置别名 -->
<typeAliases>
<!-- 批量扫描设置别名 -->
<package name="com.entity.pojo"/>
</typeAliases>
</configuration>
编写Server层
新建com.system.service.CourseService.java,编写业务逻辑接口。
package com.system.service; import java.util.List; import com.system.entity.pojo.Course; public interface CourseService { List<Course> getCourse(Course course); int deleteCourse(Course course); int updateCourse(Course course); int addCourse(Course course); }
新建com.system.service.impl这个package来装实现类,下面新建CourseServiceImpl.java,编写业务逻辑实现。
package com.system.service.impl; import java.util.List; import java.util.UUID; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.system.entity.pojo.Course; import com.system.mapper.CourseMapper; import com.system.service.CourseService; @Service public class CourseServiceImpl implements CourseService{ @Autowired private CourseMapper courseMapper; @Override public List<Course> getCourse(Course course) { // TODO Auto-generated method stub return courseMapper.findCourseList(); } @Override public int deleteCourse(Course course) { // TODO Auto-generated method stub return courseMapper.deleteCourse(course.getId()); } @Override public int updateCourse(Course course) { // TODO Auto-generated method stub return courseMapper.updateCourse(course); } @Override public int addCourse(Course course) { // TODO Auto-generated method stub course.setId(UUID.randomUUID().toString()); return courseMapper.insertCourse(course); } }
代码解析
@Autowired
private CourseMapper courseMapper;
@Autowired这个注解是无需new直接spring内部生成
public class CourseServiceImpl implements CourseService{
申明是CourseService实现
course.setId(UUID.randomUUID().toString());
主键
编写Controller层
新建com.system.controller.CourseController.java,去拦截请求。
package com.system.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.alibaba.fastjson.JSON; import com.system.entity.pojo.Course; import com.system.service.CourseService; @Controller @RequestMapping("visitor") public class CourseController { @Autowired private CourseService courseService; /** * 查询课程 * @param response * @throws IOException */ @RequestMapping("/getCourse") public void getCourse(Course course,HttpServletResponse response) throws IOException{ List<Course> list=courseService.getCourse(course); response.setCharacterEncoding("utf-8"); response.setContentType("text/html"); PrintWriter out=response.getWriter(); out.print(JSON.toJSONString(list)); out.close(); } /** * 新增课程 * @param response * @throws IOException */ @RequestMapping("/addCourse") public void addCourse(Course course,HttpServletResponse response) throws IOException{ int result=courseService.addCourse(course); PrintWriter out=response.getWriter(); out.print(result); out.close(); } /** * 修改课程 * @param response * @throws IOException */ @RequestMapping("/updateCourse") public void updateCourse(Course course,HttpServletResponse response) throws IOException{ int result=courseService.updateCourse(course); PrintWriter out=response.getWriter(); out.print(result); out.close(); } /** * 删除课程 * @param response * @throws IOException */ @RequestMapping("/deleteCourse") public void deleteCourse(Course course,HttpServletResponse response) throws IOException{ int result=courseService.deleteCourse(course); PrintWriter out=response.getWriter(); out.print(result); out.close(); } }
代码解析
response.setCharacterEncoding("utf-8"); response.setContentType("text/html");
转成utf-8,不然乱码
总结
本示例是从下往上编写的
- 新建数据库,使用分布式主键
- 按照新建数据库,到管理数据库的mybatis配置
- mapper中用上了xml对数据库直接处理,然后用Mapper调用
- 之后server服务层,实现层和接口层
- controller层拦截请求,和server接口层交互