springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
百度百科:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
前面使用的是jdbcTemplate,不够方便,现在我们把他和mybatis整合
需要的jar

一个用来和spring无缝对接,一个是mybatis的核心包
首先需要增加配置文件
<!-- 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>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bbs.dao.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
这一段是固定格式的哈, dataSource是我们的数据源也就是连接数据库用的,之前设置过来的
使用mybatis一般我们需要两个文件,一个就是mapper映射接口,一个就是xml,里面写的sql
说白了就是mybaits把xml中的sql,处理后,可以通过mapper中的接口调用
注意,接口名字就是xml中的id
所以说到这也可以明白了,上面的自动扫描映射文件的xml就是我们写sql的地方
下面的就是mapper接口对应的包,它里面写的都是mapper接口
所以你要用的话,copy过去,修改一下这两个位置就好了

还有就是要知道,对照eclipse的话,创建项目后src就是这个classpath的哈
具体的请仔细学习mybaits
配置文件可以单独配置,也可以直接写道ApplicationContext,xml的,现在我们就是写在一起的
然后就是在项目里面把文件新建一下
新建一个包,com.bbs.dao.mapper 里面新建两个接口
src下面新建一个文件夹,mapper,里面新建两个配置文件
如下图所示

配置文件设置好了之后,文件也都创建好了
就是要写sql以及接口了
sql自然是要按照人家的规则来写了
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="com.bbs.dao.mapper.UserMapper">
<select id="getMatchCount" parameterType="com.bbs.domain.User"
resultType="java.lang.Integer">
SELECT count(*)
FROM
t_user
WHERE
user_name=#{userName}
and password=#{password}
</select>
<select id="findUserByUserName" parameterType="com.bbs.domain.User"
resultType="com.bbs.domain.User">
SELECT
t_user.user_id as userId,
t_user.user_name as userName,
t_user.credits as credits,
t_user.password as password,
t_user.last_ip as lastIp,
t_user.last_visit as lastVisit
FROM
t_user
WHERE
user_name=#{userName}
</select>
<update id="updateLoginInfo" parameterType="com.bbs.domain.User">
UPDATE t_user
<set>
<if test="lastVisit !=null">
last_visit = #{lastVisit},
</if>
<if test="lastIp !=null and lastIp !=''">
last_ip = #{lastIp},
</if>
<if test="credits !=null and credits !=''">
credits = #{credits},
</if>
</set>
where user_id=#{userId}
</update>
<insert id="insertUser" parameterType="com.bbs.domain.User">
insert into t_user(
user_name,
credits,
password,
last_ip,
last_visit
)
values(
#{userName},
#{credits},
#{password},
#{lastIp},
#{lastVisit}
)
</insert>
<update id="updateUserInfo" parameterType="com.bbs.domain.User">
UPDATE t_user
<set>
<if test="lastVisit !=null">
last_visit = #{lastVisit},
</if>
<if test="lastIp !=null and lastIp !=''">
last_ip = #{lastIp},
</if>
<if test="credits !=null and credits !=''">
credits = #{credits},
</if>
</set>
where user_id=#{userId}
</update>
</mapper>
LoginLogMapper.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.bbs.dao.mapper.LoginLogMapper">
<insert id="insertLoginLog" parameterType="com.bbs.domain.LoginLog">
insert into t_login_log(
user_id,
ip,
login_datetime
)
values(
#{userId},
#{ip},
#{loginDate}
)
</insert>
</mapper>
说到这,说点常见的问题
1,数据库中的字段名字和java代码中的名字,要注意,如果不一样记得select的时候要as一下为代码中的,不然人家怎么知道如何映射
2,insert,update的时候,前面的是数据库的,后面的是java代码的
3.使用if判断入参条件的时候要小心

比如此处的lastVisit是数据库中datetime格式的,java代码中是Date(util)类型的,使用if的时候这个lastvisit就不能跟下面lastIp似得有一个什么and lastIp!='',因为是一个时间对象嘛,比较的时候当做字符串了,你要是用了就会报错,
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
..........
就是sql嘛,注释也都没写,毕竟是简单的例子
接着是跟xml映射的接口
UserMapper.java
package com.bbs.dao.mapper;
import com.bbs.domain.User;
public interface UserMapper {
public Integer getMatchCount(User user);
public User findUserByUserName(User user);
public void updateLoginInfo(User user);
public void insertUser(User user);
public void updateUserInfo(User user);
}
LoginLogMapper.java
package com.bbs.dao.mapper;
import com.bbs.domain.LoginLog;
public interface LoginLogMapper {
public void insertLoginLog(LoginLog loginLog);
}
这样子就可以通过mapper接口执行sql了
之前的时候我们的接口写的不怎么规范,我们现在规范一下
把原来的userService.java拆分下
拆解成
UserService.java
LoginLogService.java
这两个接口
实际使用的时候,使用他们的实现类
面向接口的编程嘛,好处自行百度
UserService.java
package com.bbs.service;
import com.bbs.domain.User;
public interface UserService {
public Boolean hasMatchUser(User user);
public User findUserByUserName(User user);
public void loginSucess(User user);
public void insertUser(User user);
public void UpdateUser(User user);
}
UserServiceImpl.java
package com.bbs.service;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bbs.dao.mapper.UserMapper;
import com.bbs.domain.LoginLog;
import com.bbs.domain.User;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private LoginLogService loginLogService;
@Override
public Boolean hasMatchUser(User user) {
Integer matchCount = userMapper.getMatchCount(user);
if(matchCount > 0){
return true;
}else{
return false;
}
}
@Override
public User findUserByUserName(User user) {
return userMapper.findUserByUserName(user);
}
@Override
public void loginSucess(User user) {
user.setCredits(5+user.getCredits());
user.setLastVisit(new Date());
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginDate(new Date());
userMapper.updateLoginInfo(user);
loginLogService.insertLoginLog(loginLog);
}
@Override
public void insertUser(User user) {
userMapper.insertUser(user);
}
@Override
public void UpdateUser(User user) {
userMapper.updateUserInfo(user);
}
}
LoginLogService.java
package com.bbs.service;
import com.bbs.domain.LoginLog;
public interface LoginLogService {
public void insertLoginLog(LoginLog loginLog);
}
LoginLogServiceImpl.java
package com.bbs.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bbs.dao.mapper.LoginLogMapper;
import com.bbs.domain.LoginLog;
@Service
public class LoginLogServiceImpl implements LoginLogService {
@Autowired
private LoginLogMapper loginLogMapper;
@Override
public void insertLoginLog(LoginLog loginLog) {
loginLogMapper.insertLoginLog(loginLog);
}
}
这样子接口和他的实现类都写好了
要注意到,@service 和@Autowired哈
那么到现在为止,项目的逻辑就是这样子的了
spring+mybaits
配置文件中配置了数据库等信息,配置了需要自动扫描的一些包,要扫描包中的注解嘛,重要的还整合了mybatis
通过mybatis来操作数据库,mapper来直接调用
改造成了面向接口的编程
通过userService和LoginLogService来调用,实际上执行的还是实现类嘛
实现类通过组合调用mapper提供的接口,来操作数据库,来操作数据
项目的改造完成了
测试也要修改一下了..
package test.bbs.service;
import static org.junit.Assert.*;
import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.bbs.domain.User;
import com.bbs.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml"})
public class TestUserService {
@Autowired
private UserService userService;
@Test
public void hasMAtchUser(){
User user1 = new User();
User user2 = new User();
user1.setUserName("admin");
user1.setPassword("123456");
user2.setUserName("admin");
user2.setPassword("11111");
boolean b1 = userService.hasMatchUser(user1);
//boolean b2 = userService.hasMatchUser(user2);
assertTrue(b1);
//assertTrue(b2);
}
@Test
public void findUserByUserName(){
User user = new User();
user.setUserName("admin");
User user1 = userService.findUserByUserName(user);
System.out.println(user1.getUserName());
assertEquals(user1.getUserName(),"admin");
}
@Test
public void loginSucess(){
User user = new User();
user.setUserName("admin");
user= userService.findUserByUserName(user);
userService.loginSucess(user);
}
@Test
public void insertUser(){
User user = new User();
user.setUserName("user1");
user.setPassword("123456");
user.setCredits(0);
user.setLastIp("255.255.255.255");
user.setLastVisit(new Date(0) );
userService.insertUser(user);
}
@Test
public void updateUserInfo(){
User user = new User();
user.setUserId(2);
user.setLastVisit(new Date() );
user.setCredits(5+user.getCredits());
userService.UpdateUser(user);
}
}
目测都执行成功了哈

以上就是spring+mybatis的一个基本项目(后台)
spring原理 实践解析-简单的helloworld
spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包
spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途
spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例
springmvc整合mybatis完整项目示例
springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试
springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用
springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置
springmvc 项目完整示例08 前台页面以及知识点总结
maven项目整合springmvc整合mybatis
eclipse 创建maven 项目 动态web工程完整示例
eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合
springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用的更多相关文章
- springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用
log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n ---internationalization 不就是i和n之间有18个字母... http://logging.a ...
- springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置
前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...
- springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...
- springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...
- springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试
包结构 所需要的jar包直接拷贝到lib目录下 然后选定 build path 之后开始写项目代码 配置文件 ApplicationContext.xml <?xml version=" ...
- springmvc 项目完整示例03 小结
利用spring 创建一个web项目 大致原理 利用spring的ioc 原理,例子中也就是体现在了配置文件中 设置了自动扫描注解 配置了数据库信息等 一般一个项目,主要有domain,dao,ser ...
- springmvc 项目完整示例08 前台页面以及知识点总结
至此已经基本测试成功了,我们稍作完善,让它成为一个更加完整的项目 我们现在重新规划下逻辑 两个页面 一个登录页面 一个欢迎页面 登陆页面输入账号密码,登陆成功的话,跳转登陆成功 欢迎页面 并且,更新用 ...
- springmvc 项目完整示例09 maven项目创建
需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...
- eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合mybatis
接上一篇: eclipse 创建maven 项目 动态web工程完整示例 eclipse maven工程自动添加依赖设置 maven工程可以在线搜索依赖的jar包,还是非常方便的 但是有的时候可能还需 ...
随机推荐
- [POJ1961]Period (KMP)
题意 求字符串s的最小循环元长度和循环次数 思路 s[1~i]满足循环元要len能整除i并且s[len+1~i]=s[1~i-len] 代码 #include<cstdio> #inclu ...
- 思科与华为RIP配置区别
华为配置图如下: 思科配置图如下: 配置原理一样,除了配置命令有点区别:华为进入RIP的命令为:rip 1 思科进入RIP的命令为:router rip
- sql server创建登录出发器后导致登录失败--解决方案
1.选择sql server配置管理器---sql server服务--右键属性--启动参数--添加-f.-m两个参数并重启sql server服务 2.重新启动sql server以windos身份 ...
- 4.21Linux(2)
2019-4-21 22:46:55 今天买了阿里云服务器1年的 116大洋!!! 但是有个服务器感觉很爽!!!!Linux系统还是很有意思的!!!! 直接贴上笔记! 越努力,越幸运!永远不要高估自己 ...
- ueditorUE 去掉本地保存成功的提示框!
网上修改什么JS的太麻烦,这样比较暴力,仅供参考 这里直接修改的样式: ue.ready(function () { $(".edui-editor-mess ...
- 算法与数据结构(八) AOV网的关键路径(Swift版)
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- Kubernetes — 我的第一个容器化应用
而在这篇文章中,我们就来扮演一个应用开发者的角色,使用这个 Kubernetes 集群发布第一个容器化应用. 在开始实践之前,我先给你讲解一下 Kubernetes 里面与开发者关系最密切的几个概念. ...
- 【RL-TCPnet网络教程】第5章 PHY芯片和STM32的MAC基础知识
第5章 PHY芯片和STM32的MAC基础知识 本章节为大家讲解STM32自带的MAC和PHY芯片的基础知识,为下一章底层驱动的讲解做一个铺垫. 5.1 初学者重要提示 5.2 ...
- Python 安装和 Pycharm 环境配置
一.Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它 ...
- 解决Xftp连接不上Linux虚拟机问题。
首先 打开cmd窗口 ping一下 虚拟机的ip 这样证明是可以连接的,如果不可以就是你ip地址这块的问题. 可以之后打开Xftp新建 ,把默认的FTP改成SFTP.