Loading

Mybatis笔记(一):第一个Mybatis程序

 

时间:2021/10/11

 

本文是学习了b站狂神老师的视频后的一个总结,总结了一下编写一个mybatis项目所需的基本流程和可能遇到的一些bug。

首先展示一下项目的整体结构,如下图:

 

然后项目的具体流程如下所示: 

 

一.创建数据库和相应的表

这里我使用的mysql,创建了一个mybatis数据库,数据库中有一个user表,表中插入了两条记录。

 

二.在maven项目的配置文件中插入依赖 

这个项目中使用的依赖主要有mysql驱动、mybatis和junit。具体配置代码如下:

 1 <!--导入依赖-->
 2     <dependencies>
 3         <!--mysql驱动-->
 4         <dependency>
 5             <groupId>mysql</groupId>
 6             <artifactId>mysql-connector-java</artifactId>
 7             <version>5.1.46</version>
 8         </dependency>
 9         <!--mybatis-->
10         <dependency>
11             <groupId>org.mybatis</groupId>
12             <artifactId>mybatis</artifactId>
13             <version>3.5.6</version>
14         </dependency>
15         <!--junit-->
16         <dependency>
17             <groupId>junit</groupId>
18             <artifactId>junit</artifactId>
19             <version>4.13.1</version>
20             <scope>test</scope>
21         </dependency>
22 
23     </dependencies>

 

三.编写mysql配置文件

在写url时要注意后面的参数,比如时区什么的。

 1 <?xml version="1.0" encoding="UTF8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <environments default="development">
 7         <environment id="development">
 8             <transactionManager type="JDBC"/>
 9             <dataSource type="POOLED">
10                 <property name="driver" value="com.mysql.jdbc.Driver"/>
11                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT"/>
12                 <property name="username" value="root"/>
13                 <property name="password" value="123456789.a"/>
14             </dataSource>
15         </environment>
16     </environments>
17 
18     <mappers>
19         <mapper resource="bupt/machi/dao/UserMapper.xml"/>
20     </mappers>
21 </configuration>

 

四.编写获取SqlSession对象的工具类

这段代码首先要读取mysql配置文件,然后通过输入流获取到SqlSessionFactory对象,最后获取SqlSession对象。

 1 package bupt.machi.utils;
 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 java.io.IOException;
 9 import java.io.InputStream;
10 
11 //mybatis工具类,返回一个SqlSession对象
12 public class MybatisUtils {
13 
14     private static SqlSessionFactory sqlSessionFactory;
15 
16     static{
17         try{
18             String resource = "mybatis_config.xml";
19             InputStream inputStream =  Resources.getResourceAsStream(resource);
20             sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
21         }catch (IOException e){
22             e.printStackTrace();
23         }
24     }
25 
26     public static SqlSession getSqlSession(){
27         //获取SqlSession对象
28         return sqlSessionFactory.openSession();
29     }
30 }

 

 

五.编写实体类

这里编写一个User实体类,属性必须与数据库中属性一一对应。

 1 package bupt.machi.pojo;
 2 
 3 //实体类
 4 public class User {
 5 
 6     private int id;
 7     private String name;
 8     private String pwd;
 9 
10     public User(){
11 
12     }
13 
14     public User(int id, String name, String pwd){
15         this.id = id;
16         this.name = name;
17         this.pwd = pwd;
18     }
19 
20     public int getId(){
21         return id;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public String getPwd(){
29         return pwd;
30     }
31 
32     public void setId(int id){
33         this.id = id;
34     }
35 
36     public void setName(String name){
37         this.name = name;
38     }
39 
40     public void setPwd(String pwd){
41         this.pwd = pwd;
42     }
43 
44     @Override
45     public String toString(){
46         return "User{" + "id=" + id + ",name=" + name + ",pwd=" + pwd + "}";
47     }
48 }

 

六.编写dao/mapper接口

1 package bupt.machi.dao;
2 
3 import bupt.machi.pojo.User;
4 
5 import java.util.List;
6 
7 public interface UserDao {
8     List<User> getUserList();
9 }

 

七.编写sql操作的配置文件

该文件起到了dao/mapper接口实现类的作用。

 1 <?xml version="1.0" encoding="UTF8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!--绑定一个Dao接口,使用xml文件代替之前的实现类-->
 6 <mapper namespace="bupt.machi.dao.UserDao">
 7     <!--id对应方法名字-->
 8     <select id="getUserList" resultType="bupt.machi.pojo.User">
 9         select * from mybatis.user
10     </select>
11 </mapper>

这里要注意resultType中写的是范型中的类型。

 

八.编写测试类

要注意这里测试类的路径要与被测试类的路径相同,最后要记得关闭SqlSession对象。

 1 package bupt.machi.dao;
 2 
 3 import bupt.machi.pojo.User;
 4 import bupt.machi.utils.MybatisUtils;
 5 import org.apache.ibatis.session.SqlSession;
 6 import org.junit.Test;
 7 
 8 import java.util.List;
 9 
10 public class UserDaoTest {
11 
12     @Test
13     public void test(){
14         //获取SqlSession对象
15         SqlSession sqlSession = MybatisUtils.getSqlSession();
16 
17         UserDao userDao = sqlSession.getMapper(UserDao.class);
18         List<User> userList = userDao.getUserList();
19 
20         for (User user : userList) {
21             System.out.println(user);
22         }
23 
24         sqlSession.close();
25     }
26 }

 

九.可能出现的bug以及解决方法

1)在mysql配置文件中,需要通过mapper标签引入你编写的sql配置文件,每一个都必须引入。

1 <mappers>
2   <mapper resource="bupt/machi/dao/UserMapper.xml"/>
3 </mappers>

2)如果出现找不到sql配置文件的问题,可能是由于maven的资源过滤机制,要在父项目和子项目的配置文件中添加build标签。

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

 

posted @ 2021-10-11 16:33    阅读(32)  评论(0编辑  收藏  举报