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作为根目录进行访问;

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <!--上面一段是非常重要的,有了这一段,xml的配置就拥有了自动补全,这也是考量Mybatis包是否导入成功的一个方面;-->
 6 <configuration>
 7 <!--    可以兼容多种数据库,配置多个environment,default为当前配置-->
 8     <environments default="mysql">
 9         <environment id="mysql">
10             <transactionManager type="JDBC"/>
11 <!--            使用数据库池化技术,详细可以看官方文档-->
12             <dataSource type="POOLED">
13                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
14                 <property name="url" value="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"/>
15                 <property name="username" value=username"/>
16                 <property name="password" value="password"/>
17             </dataSource>
18         </environment>
19     </environments>
20 <!--    映射文件路径,需要告诉数据库,要执行哪些操作,以及数据库实体类和字段的对应关系,接下来进行解释-->
21     <mappers>
22         <mapper resource="main/mapper/UserMapper.xml"/>
23     </mappers>
24 </configuration>

 

3. 编写执行SQL语句的SqlSessionFactory

  可以编写工具类或者工厂类,避免代码重复。我这里设置的是DBTools.java

 1 package main.dao;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 import javax.annotation.Resource;
 9 import java.io.IOException;
10 import java.io.InputStream;
11 
12 /*
13 Comet_Fei
14 2019/11/17
15 */
16 public class DBTools
17 {
18     private static SqlSessionFactory sqlSessionFactory;
19 
20     static
21     {
22         try
23         {
24             //输入流读取文件 Resources Mybatis的自带加载类
25             InputStream config = Resources.getResourceAsStream("mybatis.xml");
26             //工厂设计模式
27             sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
28         }
29         catch (IOException e)
30         {
31             e.printStackTrace();
32         }
33     }
34 
35     //创建可以执行映射文件sql的sqlsession
36     public static SqlSession getSqlSession()
37     {
38         return sqlSessionFactory.openSession();
39     }
40 }

 

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文件相对应,便于操作和使用

 

 1 package main.mapper;
 2 
 3 import main.pojo.User;
 4 
 5 import java.util.List;
 6 
 7 /*
 8 Comet_Fei
 9 2019/11/17
10 */
11 public interface UserMapper
12 {
13     int addUser(User user);
14     User getUser(String userPhoneNumber);
15     int deleteUser(String userPhoneNumber);
16     int setPassword(User user);
17     List<User> listUser();
18 
19 }

 

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)等对接。

 1 package main.dao;
 2 
 3 import main.mapper.UserMapper;
 4 import main.pojo.User;
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import java.io.IOException;
 8 
 9 /*
10 Comet_Fei
11 2019/11/17
12 */
13 public class UserDao {
14 //    定义dao内的sqlSession和映射接口mapper
15     private SqlSession sqlSession;
16     private UserMapper mapper;
17 
18     public UserDao()
19     {
20 //        通过工厂,初始化session;通过特有getMapper设置映射接口
21         sqlSession = DBTools.getSqlSession();
22         mapper = sqlSession.getMapper(UserMapper.class);
23     }
24 
25     //添加用户 成功1 失败0
26     public int addUser(String userPhoneNumber, String userPassword) throws IOException
27     {
28         //用户的 手机号,姓名(默认手机号),密码
29         User user = new User(userPhoneNumber,userPhoneNumber, userPassword);
30         int result = mapper.addUser(user);
31         sqlSession.commit();
32         System.out.println(result);
33         return result;
34     }
35 
36     //用户登录 短信 成功2;失败0
37     public int right(String userPhoneNumber)
38     {
39         int result;
40         User user = mapper.getUser(userPhoneNumber);
41         if(user != null)
42         {
43             result = 2;//登录成功
44         }
45         else
46         {
47             result = 0;//登录失败
48         }
49         sqlSession.commit();
50         return result;
51     }
52 
53     //用户登录 手机 密码 成功2;密码错误1;手机号错误0
54     public int right(String userPhoneNumber, String userPassword)
55     {
56         int result;
57         User user = mapper.getUser(userPhoneNumber);
58         if((user != null)&&(userPassword.equals(user.getUserPassword())))
59         {
60             result = 2;//登录成功
61         }
62         else if(user != null)
63         {
64             result = 1;//密码错误
65         }
66         else
67         {
68             result = 0;//此手机号未注册
69         }
70         sqlSession.commit();
71         return result;
72     }
73 
74     //删除用户 成功是1,不成功是0
75     public int deleteUser(String userPhoneNumber)
76     {
77         int result = mapper.deleteUser(userPhoneNumber);
78         sqlSession.commit();
79         return result;
80     }
81 
82     //重设密码
83     public int setPassword(String userPhoneNumber, String userPassword)
84     {
85         User user = new User(userPhoneNumber, userPhoneNumber, userPassword);
86         return mapper.setPassword(user);
87     }
88     public static void main(String[] args) throws IOException {
89         UserDao dao = new UserDao();
90 //        System.out.println(dao.deleteUser("111")); //删除用户
91 //        dao.addUser("111","111");// 添加用户
92 //        System.out.println(dao.right("11"));//短信登录;
93 //        System.out.println(dao.right("111","111"));//短信登录;
94         System.out.println(dao.setPassword("111","111"));
95     }
96 }

 

以上为全部内容,之后还会写一些关于IDEA操作上的快捷键,如,IDEA如何连接数据库、快速生成pojo实体类等的博客。

如果运行异常,欢迎留言交流,共同进步!

这里特别感谢博客:IDEA项目搭建四——使用Mybatis实现Dao层 

 

 

posted @ 2019-11-18 23:01  Comet_Fei  阅读(445)  评论(0编辑  收藏  举报