第一个Mybatis程序

第一个Mybatis程序

1.环境搭建

1.1 创建数据库

CREATE DATABASE  `mybatis`

1.2 创建表

CREATE TABLE `user` (
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(45) NOT NULL,
`pwd` VARCHAR(45) NOT NULL)
ENGINE = InnoDB
DEFAULT CHARSET = utf8

1.3 添加数据

INSERT INTO  `user`(`id`, `name`, `pwd`) VALUES
(1, '张三', '123456'),
(2, '李四', '123456'),
(3, '王五', '123456')

2.在Maven项目中导入Mybatis依赖

2.1在pom.xml文件中添加依赖

<dependencies>
       <!--导入mysql驱动-->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.22</version>
       </dependency>

       <!--mybatis-->
       <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.6</version>
       </dependency>

       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
       </dependency>
   </dependencies>

3.编写Mabatis的代码

3.1编写配置文件,连接数据库

mybatis-config.xml

<configuration>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useSSL=true&amp;autoReconnect=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"/>
               <property name="username" value="root"/>
               <property name="password" value="075290"/>
           </dataSource>
       </environment>
   </environments>

</configuration>

将property中四个属性的value修改成自己的数据库对应参数

3.2编写Mybatis工具类

Mybatis工具类的目的是与数据库连接,并可以生成SqlSession对象,只用写一次就可以不管了

/**
* @author leogoat
* SqlSessionFactory --> SqlSession
* 获取SqlSessionFactory,用于生成SqlSession
* SqlSession可以执行sql语句,类似于PrepareStatement
*/
public class MybatisUtils {

   private static SqlSessionFactory sqlSessionFactory;

   static{
       //静态代码块在JVM加载该类时就会加载,并且只加载一次
   try {
       String resource = "mybatis-config.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  } catch (IOException e) {
       e.printStackTrace();
  }

  }

   /**
   从SqlSessionFactory中获取SqlSession
    */
   public static SqlSession getSqlSession(){
       return sqlSessionFactory.openSession();
  }
}

3.3编写实现代码

经过上述步骤,我们已经配置好了与数据库连接的必要配置文件和工具类,接下来就是写具体的类和接口来实现对数据库的增删改查

3.3.1实体类

User.java

/**
* @author leogoat
* User实体类
*/
public class User {
   private int id;
   private String name;
   private String pwd;

   public User() {
  }

   public User(int id, String name, String pwd) {
       this.id = id;
       this.name = name;
       this.pwd = pwd;
  }

   public int getId() {
       return id;
  }

   public void setId(int id) {
       this.id = id;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public String getPwd() {
       return pwd;
  }

   public void setPwd(String pwd) {
       this.pwd = pwd;
  }

   @Override
   public String toString() {
       return "User{" +
               "id=" + id +
               ", name='" + name + '\'' +
               ", pwd='" + pwd + '\'' +
               '}';
  }
}

3.3.2接口类

UserDao.java

/**
* @author leogoat
*/
public interface UserDao {
   /**
    * get user list
    * @param null
    * @return List<User>
    */
   List<User> getUserList();
}

3.3.3接口实现类

在之前,我们会写一个接口实现类UserDaoImpl.java来实现具体的增删改查操作,在Mabatis中使用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">
<!--namespace 绑定一个Dao接口/Mapper接口-->
<mapper namespace="com.hu.dao.UserDao">
   <!--id对应Dao接口的具体操作方法,相当于原来的DaoImpl所做的事情-->
   <!--result:该sql语句执行完成的返回类型-->
   <select id="getUserList" resultType="com.hu.pojo.User">
      select * from mybatis.user;
   </select>

</mapper>

参数说明:

  • namespace:绑定的接口类

  • id:执行接口类中的方法名

  • resultType:返回的结果类型

提示:参数填写对应文件所在包的完整路径

3.3.4在mabatis-xml文件注册接口

<mappers>
   <mapper resource="com/hu/dao/UserMapper.xml"/>
</mappers>

此时完整的mabatis-xml为:

<?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">
<configuration>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useSSL=true&amp;autoReconnect=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"/>
               <property name="username" value="root"/>
               <property name="password" value="075290"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <mapper resource="com/hu/dao/UserMapper.xml"/>
   </mappers>
</configuration>

4.测试

public class UserDaoTest {

   @Test
   public void test(){
       //获取SqlSession对象
       SqlSession sqlSession = MybatisUtils.getSqlSession();

       //方法一:使用getMapper
       UserDao userDao = sqlSession.getMapper(UserDao.class);
       List<User> userList = userDao.getUserList();

       for (User user : userList) {
           System.out.println(user.toString());
      }

       //务必要关闭SqlSession
       sqlSession.close();

  }
}

错误总结:

  • com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效

    • 原因:xml文件中声明的编码与xml文件本身保存时的编码不一致

    • 解决方案,修改项目编码:

File->Settings>Editior>File Encodings

全都勾选为UTF-8

  • org.apache.ibatis.binding.BindingException: Type interface com.hu.dao.UserDao is not known to the MapperRegistry

    • 原因:没有在XML文件注册接口类

    • 解决方案:

      <mappers>
         <mapper resource="com/hu/dao/UserMapper.xml"/>
     </mappers>
  • 无法找到配置文件

    • 原因:Maven在build项目没有把xml以及properties等资源文件包括进去,只生成了class文件

    • 解决方案,在pom.xml文件添加下面的内容,将java和resources目录下文件都include到build

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

             <resource>
                 <directory>src/main/java</directory>
                 <includes>
                     <include>**/*.xml</include>
                     <include>**/*.properties</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
         </resources>
      </build>
  • com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized

    • 原因:提示连接的url中设置的时区存在问题

    • 解决方案:修改连接jdbc的url参数,添加:serverTimezone=UTC

    • 完整的url参数:

    value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useSSL=true&amp;autoReconnect=true&amp;characterEncoding=utf8&amp;serverTimezone=UTC"
posted @ 2021-01-22 17:35  会微笑的leo  阅读(161)  评论(0)    收藏  举报