前言

数据库从最传统的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&amp;serverTimezone=GMT%2B8&amp;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_环境配置和样例的更多相关文章

  1. HNU_团队项目_数据库设计感想_个人感想

    数据库设计感想  个人的一点心得体会 最重要的放在最前面——讨论开会时的123经验 开会前对会议目的及方式要有所考虑: 不要随意无目的开会: 遵守时间,控制会议时间长度: 会议主持人要维持会议只需,有 ...

  2. HNU_团队项目_出现的Error总结_1

    今天开始记录开发中的Error,实时更新,以10条为一个博客,会给出相应的错误截图和解决方法.数据库框架Mybatis的配置和使用,详见之后发布的相关博客. 之后会对每一个错误进行分析,单独成一篇随笔 ...

  3. HNU_团队项目_需求分析感想(全员)

    以下为软件1701-“洋芋好想飞”的需求分析感想 PM QXS 需求分析过程中的前进与曲折令我深刻地认识到,需求分析是一个动态的过程,而非一个静态的任务结点. 比如最初我们设想可以为用户设定角色,但最 ...

  4. Macaca环境配置及样例执行

    1.Macaca简介 macaca是由阿里巴巴公司开发的一套自动化解决方案,适用于PC端和移动端.Macaca基于Node.js开发,测试案例编写语言暂时也只支持Node.js. 2.Macaca与A ...

  5. Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。

    前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...

  6. Spring boot项目maven的profile多环境配置不自动替换变量的问题解决

    Spring boot项目maven的profile多环境配置不自动替换变量的问题解决   在网上找了好久,配置都很简单,可是我的程序就是不能自动替换变量,最终单独测试,发现原来是引用spring b ...

  7. XMPP框架下微信项目总结(1)环境配置

    xmpp介绍 xmpp基于模块开发的 无须自己写请求 (登陆,注册,获取好友列表,添加/删除好友等) ------>简介 ------------------------- ----->工 ...

  8. SSH框架学习环境配置

    1.      java环境 安装 安装jdk7,根据自己的操作系统选择32位或64位安装. 配置 安装后需要配置环境变量,如下所示: 配置classpath,如下: 并在path中添加java6安装 ...

  9. HNU_团队项目_Android和数据库对接出现问题总结

    1. 问题说明:Android发来的数据JSON格式不对,Time和Date的位置相反 出现原因:Android的JSON数据组装时顺序不对(可能) 2.问题说明:Android发来的数据无法插入到数 ...

随机推荐

  1. hexo主题hexo-theme-yilia文章太长,截断按钮文字的实现

    文章太长,截断按钮文字不是通过配置文件_config.yml实现的,而是在文章内容里实现,在你想截断的文章位置加上 <!-- more --> 就可以实现了! 参考博客:hexo-them ...

  2. Tomcat启动中文乱码,淇℃伅等

    打开Tomcat根目录下的conf文件夹,打开logging.properties. 把 java.util.logging.ConsoleHandler.encoding = UTF-8 换成 ja ...

  3. (五) 结构化查询语言SQL——3

    4. 数据更新 1)增 对应INSERT语句.格式为INSERT INTO T[(A1,…,Ak)]  VALUES (C1,…,Ck),其中A代表表T的属性,C代表常量,A可以缺省,此时C必须严格按 ...

  4. 不使用C库函数(Sprintf)将void* 指针转换为十六进制字符串

    #include <stdio.h> #include <stdint.h> #include <stdlib.h> void hexDump(void *ptr, ...

  5. cmd_memo

    1. bind host or ip:port #指定域名 curl -H 'Host:www.tsuiz.com' http://10.14.54.131:8080/check.do #指定ip和端 ...

  6. Flyway的简单介绍和使用(转)

    Flyway的简单介绍及使用 一.开发时管理数据库遇到的问题: 现在开发一般都是团队开发,这样就会出现项目同步的问题,代码同步可以通过SVN工具管理起来,那数据库同步怎么办呢?理想的情况下,在开发新项 ...

  7. [Algorithm] Finding Prime numbers - Sieve of Eratosthenes

    Given a number N, the output should be the all the prime numbers which is less than N. The solution ...

  8. 题解 【HEOI2016】tree树

    题面 解析 其实这题可以考虑离线做法,用并查集解决. 因为仔细想,添加标记并不方便, 但如果用并查集记录下祖先, 再一一删除,就会方便很多. 先把每次操作记录下来, 同时记录下每个点被标记的次数(因为 ...

  9. 用jstl的if或when标签判断字符串是否为空

    在jsp页面用到jstl的if或when标签判断字符串不为空的时候,书写格式: <c:when test="${not empty paramName}"> </ ...

  10. JavaMail应用--通过javamail API实现在代码中发送邮件功能

    JavaMail应用   在日常开发中,可能会引用到发邮件功能,例如在持续集成中,自动化测试运行完毕,自动将测试结果以报表的形式发送邮件给相关人.那么在Java中如何实现发邮件呢? 在java EE ...