一. Mybatis 与 Spring
思路:
- 加载相关jar:mybtais +spring
- 数据–驱动—数据连接池
- mybatis核心–日志–连接桥梁
- spring 核心
- 配置mybatis-SqlSessionFactory组件
2. 连接池
2. 关联mybatis个性化设置
3. 关联mapper文件
4. 扫描项目中类的别名 - - 配置事务
- 配置mapper组件
- 配置srevice组件
二. springMVC 与spring
思路:
- 前端控制器
- 配置编码过滤器
- 引入spring配置文件
三.实战
- 步骤:
- 配置德鲁伊连接池
- 配置SqlSessionFactory
- ->连接池
- ->个性配置
- ->关联mapper.xml文件
- ->配置包的别名扫描
- 配置Mapper接口的代理对象
- ->配置SqlSession的来源,其实哪个SqlSessionFactory
- ->配置代理哪个接口
- 配置Service和事务(3W)
依赖jar包
DDL
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
Mapper文件
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="cn.dusk.ssm.mapper.UserMapper">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into t_user (username,password,age)
values (#{username},#{password},#{age});
</insert>
<update id="updateByPrimaryKey">
update t_user
set
username=#{username},
age=#{age}
where
id=#{id}
</update>
<delete id="deleteByPrimaryKey">
delete from t_user where id=#{id}
</delete>
<select id="selectByPrimaryKey" resultType="cn.dusk.ssm.domain.User">
select * from t_user where id=#{id};
</select>
<select id="selectAll" resultType="cn.dusk.ssm.domain.User">
select * from t_user
</select>
</mapper>
Spring配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--管理SpringMVC的配置-->
<import resource="classpath:mvc.xml"/>
<!--组件扫描器-->
<context:component-scan base-package="cn.dusk.ssm"/>
<!--自动DI解析器-->
<context:annotation-config/>
<!--配置mapper接口扫描器:作用扫描Mapper接口创建代理对象交给Spring管理-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--mapper接口在哪里-->
<property name="basePackage" value="cn.dusk.ssm.mapper"/>
</bean>
<!--引入属性占位符-->
<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>
<!--配置druid连接池:druid可以通过url自动识别驱动-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--SqlSessionFactory-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--需要连接池-->
<property name="dataSource" ref="dataSource"/>
<!--配置管理的mapper文件-->
<property name="mapperLocations" value="classpath:cn/dusk/ssm/mapper/*Mapper.xml"/>
<!--配置别名扫描-->
<property name="typeAliasesPackage" value="cn.dusk.ssm.domain"/>
<!--关联MyBatis的个性配置-->
<property name="configLocation" value="classpath:mybatis.xml"/>
</bean>
<!--AOP:3w-->
<!--what:做事务增强-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--配置管理哪个链接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
<aop:config>
<!--where:在哪里做增强-->
<aop:pointcut id="pc" expression="execution(* cn.dusk.ssm.service.*Service.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>
<!--when:什么时机做增强-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
</beans>
资源文件
db.properties
jdbc.url=jdbc:mysql:///ssm?useSSL=false
jdbc.username=root
jdbc.password=admin
mybatis文件
log4j.properties
#全局的日志配置
log4j.rootLogger=ERROR,stdout
#MyBatis的日志配置,打印哪些名称空间开头的日志
log4j.logger.cn.dusk.ssm.mapper=TRACE
#打印日志的地方
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mvc
mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置SpringMVC相关配置-->
<mvc:annotation-driven/>
<!--注册拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--
配置有效路径:
/*:表示所有一级路径
/**:表示任意路径
-->
<mvc:mapping path="/**"/>
<!--不拦截哪些内容-->
<mvc:exclude-mapping path="/login.do"/>
<bean class="cn.dusk.ssm.web.interceptor.CheckLoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/views/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
mybatis.xml
<?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>
</configuration>
登录控制器
LoginController
@Controller
public class LoginController {
@RequestMapping("login")
public String login(String username,String password,HttpSession session){
if ("admin".equals(username) && "123".equals(password)){
session.setAttribute("USER_IN_SESSION",username);
return "forward:/user/list.do";
}
return "forward:/login.jsp";
}
}
页面
UserController
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("list")
public String list(Model model){
List<User> list = userService.list();
model.addAttribute("list",list);
return "user/list";
}
@RequestMapping("input")
public String input(Long id,Model model){
if (id != null) {
User user = userService.get(id);
model.addAttribute("u",user);
}
return "user/input";
}
@RequestMapping("saveOrUpdate")
public String saveOrUpdate(User u){
if (u.getId() == null) {
userService.save(u);
}else{
userService.update(u);
}
return "redirect:/user/list.do";
}
@RequestMapping("delete")
public String delete(Long id){
if (id != null) {
userService.delete(id);
}
return "redirect:/user/list.do";
}
}
实体类User
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String password;
private Integer age;
}
UserMapper
public interface UserMapper {
void insert(User user);
void updateByPrimaryKey(User user);
void deleteByPrimaryKey(Long id);
User selectByPrimaryKey(Long id);
List<User> selectAll();
}
服务接口
IUserService
public interface IUserService {
void save(User user);
void update(User user);
void delete(Long id);
User get(Long id);
List<User> list();
}
service实现类UserServiceImpl
@Service
public class UserServiceImpl implements IUserService {
/**
* 依赖mapper
* session=factory.openSession();//先拿到sessionFactory
* userMapper=session.getMapper(UserMapper.class);//在拿到代理对象
*/
@Autowired
private UserMapper userMapper;
public void save(User user) {
userMapper.insert(user);
}
public void update(User user) {
userMapper.updateByPrimaryKey(user);
}
public void delete(Long id) {
userMapper.deleteByPrimaryKey(id);
}
public User get(Long id) {
User user = userMapper.selectByPrimaryKey(id);
return user;
}
public List<User> list() {
List<User> list = userMapper.selectAll();
return list;
}
}
控制器CheckLoginInterceptor
public class CheckLoginInterceptor extends HandlerInterceptorAdapter{
/*在controller方法值前做拦截,返回true表示放行*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,Object handler) throws IOException {
//从session中获取当前登录成功的对象
Object user = request.getSession().getAttribute("USER_IN_SESSION");
//判断是否为null
if (user == null) {
//没有登录,返回到登录界面
response.sendRedirect("/login.jsp");
return false;
}
return true;//放行
}
}
测试类
App
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class App {
@Autowired
private IUserService userService;
@Test
public void testSave(){
User u = new User(null, "Dusk", "1234", 28);
userService.save(u);
}
@Test
public void testUpdate(){
User u = new User(2L, "Dusk.Decade", "123123", 259);
userService.update(u);
}
@Test
public void testDelete(){
userService.delete(1L);
}
@Test
public void testGet(){
User user = userService.get(1L);
System.out.println(user);
}
@Test
public void testList(){
List<User> list = userService.list();
for (User user : list) {
System.out.println(user);
}
}
}
添加或编辑列表
input.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<form action="/user/saveOrUpdate.do" method="post">
<input type="hidden" name="id" value="${u.id}"><br>
姓名:<input type="text" name="username" value="${u.username}"><br>
密码:<input type="password" name="password" value=""><br>
年龄:<input type="text" name="age" value="${u.age}"><br>
<input type="submit" value="提交"><br>
</form>
</body>
</html>
信息列表
list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>信息列表</title>
</head>
<body>
<a href="/user/input.do">新增</a><br>
编号---> 姓名---> 密码--->年龄---->操作<br>
<c:forEach var="u" items="${list}">
<p>
${u.id} ---> ${u.username} ---> ${u.password} ---> ${u.age}
<a href="/user/input.do?id=${u.id}">编辑</a>
<a href="/user/delete.do?id=${u.id}">删除</a>
</p>
</c:forEach>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置SpringMVC的前端控制器-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="/login.do" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>