HNU_团队项目_数据库框架Mybatis_环境配置和样例
前言
数据库从最传统的JDBC连接方式和数据库池化技术到Hibernate的使用,再到Mybatis的快捷轻量级操作,技术迭代的速度飞快。
在了解了基础的理论和方法后,学习前沿编程框架、工具,我认为是一种必然的趋势。
再不看看外面,可能真的要落伍了~
之后,我借团队项目开发的机会,学习了Mybatis框架,和大家分享一下经验,愿意和大家共同进步!
正文
从零开始
参考:Mybatis官方文档
1. 下载Mybatis的jar包,并且导入
点击连接,选择下载Mybatis的jar包。这里有三个文件,基础使用的话,下载第一个mybatis-3.5.3.zip即可,如果需要查看源码的话,建议将Source code也下载下来,Windows使用zip,Ubuntu使用tar.gz;
Eclipse导入只要build puth即可,IDEA的话,在File->Project Structure里导入jar;(建议在项目内建一个lib文件夹,便于迁移)
只是数据库部分的话,以下两个包便足够了。
2. 新建Java Web Application,编写数据库配置文件
文件名可以自定义,我设置的是Mybatis.xml。但是要放到src的根目录下,这一点要注意。
注意:
url的配置信息中 ” & " 符号无法解析,需要变为 “ & ";
映射文件路径以 “ / ”作为文件夹,从src作为根目录进行访问;
<?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">
<!--上面一段是非常重要的,有了这一段,xml的配置就拥有了自动补全,这也是考量Mybatis包是否导入成功的一个方面;-->
<configuration>
<!-- 可以兼容多种数据库,配置多个environment,default为当前配置-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<!-- 使用数据库池化技术,详细可以看官方文档-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&serverTimezone=GMT%2B8&characterEncoding=utf-8"/>
<property name="username" value=username"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件路径,需要告诉数据库,要执行哪些操作,以及数据库实体类和字段的对应关系,接下来进行解释-->
<mappers>
<mapper resource="main/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3. 编写执行SQL语句的SqlSessionFactory
可以编写工具类或者工厂类,避免代码重复。我这里设置的是DBTools.java
package main.dao; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream; /*
Comet_Fei
2019/11/17
*/
public class DBTools
{
private static SqlSessionFactory sqlSessionFactory; static
{
try
{
//输入流读取文件 Resources Mybatis的自带加载类
InputStream config = Resources.getResourceAsStream("mybatis.xml");
//工厂设计模式
sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
}
catch (IOException e)
{
e.printStackTrace();
}
} //创建可以执行映射文件sql的sqlsession
public static SqlSession getSqlSession()
{
return sqlSessionFactory.openSession();
}
}
4. 编写表对应的实体类User.java
此处可用IDEA的pojo快捷操作,生成对应实体;
package main.pojo; public class User { private String userPhoneNumber;private String userName;private String userPassword;public User(String userPhoneNumber, String userName, String userPassword) {
this.userPhoneNumber = userPhoneNumber;
this.userName = userName;
this.userPassword = userPassword;
} public String getUserPhoneNumber() {
return userPhoneNumber;
} public void setUserPhoneNumber(String userPhoneNumber) {
this.userPhoneNumber = userPhoneNumber;
}public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
}public String getUserPassword() {
return userPassword;
} public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
} @Override
public String toString() {
return "User{" +
"userPhoneNumber='" + userPhoneNumber + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
'}';
}
}
5. 编写实体管理类映射接口UserMapper.java
UserMapper接口和Mybatis的映射xml文件相对应,便于操作和使用
package main.mapper; import main.pojo.User; import java.util.List; /*
Comet_Fei
2019/11/17
*/
public interface UserMapper
{
int addUser(User user);
User getUser(String userPhoneNumber);
int deleteUser(String userPhoneNumber);
int setPassword(User user);
List<User> listUser(); }
5. 编写映射文件UserMapper.xml
这类文件非常重要,会将数据库表和Java代码的pojo(bean)进行映射,极大的简化了操作步骤,减小代码量。
参数说明:
- resultMap是数据库表和实体的Map映射设置,在使用时,只要加入 resultMap="userResultMap" 参数即可,如select语句;
- parameterType是传入的参数类型,如果传入参数较多的话,可以使用实体类传参,但是要写明实体类全路径;(还没有学习复杂语句,所以这里只是简单介绍)
- resultType是返回值类型,但是不能和resultMap同时存在;
- 传参方式如代码所示,用 ${ } 标识参数,和接口一致;
- namespace是全路径,访问到当前对应Map的接口文件;
- 注意传参的数据类型,如果是字符型或者String,需要用单引号包含,如: '${userName}'
<?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="main.mapper.UserMapper">
<resultMap id="userResultMap" type="main.pojo.User">
<result property="userPhoneNumber" column="user_phone_number"/>
<result property="headPictureId" column="head_pictureId"/>
<result property="rolePowerId" column="role_power_id"/>
<result property="userName" column="user_name"/>
<result property="userPersonalAutograph" column="user_personal_autograph"/>
<result property="userPassword" column="user_password"/>
<result property="userSex" column="user_sex"/>
<result property="userEmail" column="user_email"/>
<result property="userAddress" column="user_address"/>
<result property="userUploadNumbers" column="user_upload_numbers"/>
</resultMap> <!-- 添加用户-->
<insert id="addUser" parameterType="main.pojo.User">
INSERT INTO user(user_phone_number, user_name, user_password)
VALUES ('${userPhoneNumber}', '${userName}', '${userPassword}');
</insert>
<!-- 删除用户-->
<delete id="deleteUser" parameterType="String">
DELETE FROM user WHERE user_phone_number = '${userPhoneNumber}';
</delete> <!-- 获得账号为user_phone_number的用户-->
<select id="getUser" resultMap="userResultMap">
SELECT * FROM user WHERE user_phone_number = '${userPhoneNumber}';
</select> <!-- 获得用户列表-->
<select id="listUser" resultType="main.pojo.User">
SELECT * FROM user;
</select> <!-- 找回密码-->
<update id="setPassword" parameterType="main.pojo.User">
UPDATE user SET user_password = ${userPassword} WHERE user_phone_number = '${userPhoneNumber}';
</update> </mapper>
6. 最后是操作层(DAO)UserDao.java
因为操作层有特定的业务,这里只是一个示意而已。java里面的main函数可以进行局部测试,便于和前端、控制器(servlet)等对接。
package main.dao; import main.mapper.UserMapper;
import main.pojo.User;
import org.apache.ibatis.session.SqlSession; import java.io.IOException; /*
Comet_Fei
2019/11/17
*/
public class UserDao {
// 定义dao内的sqlSession和映射接口mapper
private SqlSession sqlSession;
private UserMapper mapper; public UserDao()
{
// 通过工厂,初始化session;通过特有getMapper设置映射接口
sqlSession = DBTools.getSqlSession();
mapper = sqlSession.getMapper(UserMapper.class);
} //添加用户 成功1 失败0
public int addUser(String userPhoneNumber, String userPassword) throws IOException
{
//用户的 手机号,姓名(默认手机号),密码
User user = new User(userPhoneNumber,userPhoneNumber, userPassword);
int result = mapper.addUser(user);
sqlSession.commit();
System.out.println(result);
return result;
} //用户登录 短信 成功2;失败0
public int right(String userPhoneNumber)
{
int result;
User user = mapper.getUser(userPhoneNumber);
if(user != null)
{
result = 2;//登录成功
}
else
{
result = 0;//登录失败
}
sqlSession.commit();
return result;
} //用户登录 手机 密码 成功2;密码错误1;手机号错误0
public int right(String userPhoneNumber, String userPassword)
{
int result;
User user = mapper.getUser(userPhoneNumber);
if((user != null)&&(userPassword.equals(user.getUserPassword())))
{
result = 2;//登录成功
}
else if(user != null)
{
result = 1;//密码错误
}
else
{
result = 0;//此手机号未注册
}
sqlSession.commit();
return result;
} //删除用户 成功是1,不成功是0
public int deleteUser(String userPhoneNumber)
{
int result = mapper.deleteUser(userPhoneNumber);
sqlSession.commit();
return result;
} //重设密码
public int setPassword(String userPhoneNumber, String userPassword)
{
User user = new User(userPhoneNumber, userPhoneNumber, userPassword);
return mapper.setPassword(user);
}
public static void main(String[] args) throws IOException {
UserDao dao = new UserDao();
// System.out.println(dao.deleteUser("111")); //删除用户
// dao.addUser("111","111");// 添加用户
// System.out.println(dao.right("11"));//短信登录;
// System.out.println(dao.right("111","111"));//短信登录;
System.out.println(dao.setPassword("111","111"));
}
}
以上为全部内容,之后还会写一些关于IDEA操作上的快捷键,如,IDEA如何连接数据库、快速生成pojo实体类等的博客。
如果运行异常,欢迎留言交流,共同进步!
这里特别感谢博客:IDEA项目搭建四——使用Mybatis实现Dao层
HNU_团队项目_数据库框架Mybatis_环境配置和样例的更多相关文章
- HNU_团队项目_数据库设计感想_个人感想
数据库设计感想 个人的一点心得体会 最重要的放在最前面——讨论开会时的123经验 开会前对会议目的及方式要有所考虑: 不要随意无目的开会: 遵守时间,控制会议时间长度: 会议主持人要维持会议只需,有 ...
- HNU_团队项目_出现的Error总结_1
今天开始记录开发中的Error,实时更新,以10条为一个博客,会给出相应的错误截图和解决方法.数据库框架Mybatis的配置和使用,详见之后发布的相关博客. 之后会对每一个错误进行分析,单独成一篇随笔 ...
- HNU_团队项目_需求分析感想(全员)
以下为软件1701-“洋芋好想飞”的需求分析感想 PM QXS 需求分析过程中的前进与曲折令我深刻地认识到,需求分析是一个动态的过程,而非一个静态的任务结点. 比如最初我们设想可以为用户设定角色,但最 ...
- Macaca环境配置及样例执行
1.Macaca简介 macaca是由阿里巴巴公司开发的一套自动化解决方案,适用于PC端和移动端.Macaca基于Node.js开发,测试案例编写语言暂时也只支持Node.js. 2.Macaca与A ...
- Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。
前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...
- Spring boot项目maven的profile多环境配置不自动替换变量的问题解决
Spring boot项目maven的profile多环境配置不自动替换变量的问题解决 在网上找了好久,配置都很简单,可是我的程序就是不能自动替换变量,最终单独测试,发现原来是引用spring b ...
- XMPP框架下微信项目总结(1)环境配置
xmpp介绍 xmpp基于模块开发的 无须自己写请求 (登陆,注册,获取好友列表,添加/删除好友等) ------>简介 ------------------------- ----->工 ...
- SSH框架学习环境配置
1. java环境 安装 安装jdk7,根据自己的操作系统选择32位或64位安装. 配置 安装后需要配置环境变量,如下所示: 配置classpath,如下: 并在path中添加java6安装 ...
- HNU_团队项目_Android和数据库对接出现问题总结
1. 问题说明:Android发来的数据JSON格式不对,Time和Date的位置相反 出现原因:Android的JSON数据组装时顺序不对(可能) 2.问题说明:Android发来的数据无法插入到数 ...
随机推荐
- UVa400 Unix is
The computer company you work for is introducing a brand new computer line and is developing a new U ...
- select ... into outfile备份及恢复使用
select ... into outfile语句是一种逻辑备份的方法,更准确地说是导出一张表中的数据. Syntax:SELECT [ALL | DISTINCT | DISTINCTROW ...
- New!Devexpress WPF各版本支持VS和SQL Server版本对应图
点击获取DevExpress v19.2.3完整版试用下载 本文主要为大家介绍DevExpress WPF各大版本支持的VS版本和支持的.Net版本图,Devexpress WPF v19.2.3日前 ...
- Django2.1.1与xadmin0.6.0遇到的坑
Django2.1.1与xadmin0.6.0遇到的坑 BlueMiaomiao关注4人评论11188人阅读2018-09-23 12:17:56 (1)django2.0把from django.c ...
- 高并发下的Nginx优化
高并发下的Nginx优化 2014-08-08 13:30 mood Nginx 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apach ...
- robotframework 获取坐标
Get Horizontal Position 获取X轴坐标 Get Vertical Position 获取Y轴坐标 Get Element Size 获取整个图表的高 ...
- vue项目,百度地图api高亮选取区域,高亮某个地区,行政区域等
效果如下: var blist = [] ,maxZoom: });// 创建地图实例 var point = new window.BMap.Point(89.48,31.57); map.cent ...
- [PWN]fsb with stack frame
0x00: 格式化字符串漏洞出现的时间很早了,偶然在前一段时间学到了一个其他的利用姿势,通过栈桢结构去利用格式化字符串漏洞. 原文链接:http://phrack.org/issues/59/7.ht ...
- cookbook 10.1生成随机密码
任务: 随机地创造出新密码.比如,有时需要给新的用户账号分配新的密码. 解决方案: from random import choice import string def GenPasswd(leng ...
- matplotlib(一):散点图
import numpy as np import matplotlib.pyplot as plt #产生测试数据 # x,y为数组 N = 50 x = np.random.rand(N) y=n ...