【自学java笔记#第四十天#】mabatis day03 手把手教你搭建一个mybatis入门案例

素材来源于B站黑马的视频:https://www.bilibili.com/video/BV1mE411X7yp?from=search&seid=3671223557816907230

需要用到的工具/软件:eclipse、Navicat、VMware、JDK1.8、mysql5.1.46-32位(虚拟主机上)、maven3.5.4

一、远程连接mysql数据库

1、将虚拟机(win7-32位)上的mysql数据库设定为允许远程连接状态

 依次在dos窗口执行以下命令:

use mysql; 
select host from user where user='root';
flush privileges;

2、再用Navicat新建连接,输入数据库的账号密码即可使用远程的数据库

我通过这个可视化工具,创建了一个user表:

创建该表的步骤如下:

①新建查询-->输入创建表单的sql语句-->run;

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime default NULL COMMENT '生日',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

②新建查询-->输入insert语句-->run;

insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','','北京'),(42,'小二王','2018-03-02 15:09:37','','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','','北京金燕龙'),(45,'传智播客','2018-03-04 12:04:06','','北京金燕龙'),(46,'老王','2018-03-07 17:37:26','','北京'),(48,'小马宝莉','2018-03-08 11:44:00','','北京修正');

进行到这里,简单的数据表就准备好了。接下来是需要在eclipse中完成的操作。

二、配置eclipse

1、新建一个maven工程(因为这个入门案例涉及到很多的jar包,用maven管理起来比较方便)

*maven也是需要配置环境变量才能使用的,配起来和jdk一样的步骤,故在此省略。

项目完整的目录长这样:

 ①maven本地仓库的默认地址在c盘,我将它更改到D盘下;

打开maven的安装目录-->conf文件夹-->setting文件,加上红框里的语句即可。

②maven的默认jdk版本是1.5,这里我将它更改为1.8

点击顶上的Windows菜单-->Preferences-->Java-->Installed JREs-->add-->再选择你想要的jdk版本即可。

若做完这一步,一刷新maven工程,这个地方显示的还是jdk1.5:

 那还需要再进一步设置:

打开项目所在的目录-->settings文件夹-->找到图中的文件:

 直接将里面的jdk版本改为1.8:

2、配置pom.xml

<!-- Maven项目的基本配置 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lulu.mabatis</groupId>
  <artifactId>day01_mybatis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  
  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
                  <encoding>UTF-8</encoding>
              </configuration>
          </plugin>
      </plugins>
  </build>
  
  <dependencies>
  <!-- mybatis框架的依赖,可直接从官网复制过来 -->
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
     </dependency>
     <!-- 数据库的依赖,写虚拟机中mysql数据库的版本号 -->
     <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
      </dependency>
      <!-- 输出日志的依赖,可写可不写  -->
      <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
      </dependency>
      <!-- 单元测试的依赖,可写可不写  -->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      </dependency>
 </dependencies>
</project>

有几个要注意的地方:

①写了的依赖都是要导入相应的jar包到maven项目里去的;

②mysql数据库不要过分追求最新的版本,最好首选那些能找到jar包的旧版本。

像我之前在虚拟机上安装的5.7.29没有对应的jar包(官网也下不到),而5.1.46就有(之前保存的)。

3、创建实体类User

package com.lulu.domin;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{
  
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
                + address + "]";
    }
}

4、创建Dao接口并声明一个方法findAll,为后续的输出做铺垫

package com.lulu.dao;

import java.util.List;

import com.lulu.domin.User;

public interface IUserDao {
    List<User>findAll();
}

5、配置SqlMapConfig.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">
  <!-- mybatis的主配置文件 -->
  <configuration>
      <!-- 配置环境 -->
      <environments default="mysql">
      <!-- 配置mysql的环境 -->
          <environment id="mysql">
          <!-- 配置事务的类型 -->
          <transactionManager type="JDBC"></transactionManager>
          <!-- 配置数据源(连接池) -->
          <dataSource type="POOLED">
              <!-- 配置连接数据库的4个基本信息 -->
              <property name="driver" value="com.mysql.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://192.168.1.103:3306/eesy"/>
              <property name="username" value="root"/>
              <property name="password" value="123456"/>
          </dataSource>
          </environment>
      </environments>
      
      <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
      <mappers>
          <mapper resource="com\\lulu\\dao\\IUserDao.xml"/>
      </mappers>
  </configuration>

6、配置IUserDao.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">
  
 <mapper namespace="com.lulu.dao.IUserDao">
      <!-- 配置查询所有 -->
      <select id="findAll" resultType="com.lulu.domin.User">
          select * from user
      </select>
 </mapper>

7、加入日志配置文件log4j.properties

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

至此,所有的配置全部完成,只待测试一下是否能正常运行了。

三、测试类

package com.lulu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.lulu.dao.IUserDao;
import com.lulu.domin.User;

/*
 * Mybatis入门案例的测试类。
 */
public class MybatisTest {
    public static void main(String[] args) throws IOException {
        //1.读取配置文件
        InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        SqlSessionFactory factory=builder.build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session=factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao=session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User>users=userDao.findAll();
        for(User user:users){
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}

四、结果

如果你按照上面的步骤来,并且在没有任何错误的前提下,得到的输出信息应该是这样的:

2020-04-30 18:46:56,345 0      [           main] DEBUG ache.ibatis.logging.LogFactory  - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2020-04-30 18:46:56,520 175    [           main] DEBUG source.pooled.PooledDataSource  - PooledDataSource forcefully closed/removed all connections.
2020-04-30 18:46:56,521 176    [           main] DEBUG source.pooled.PooledDataSource  - PooledDataSource forcefully closed/removed all connections.
2020-04-30 18:46:56,521 176    [           main] DEBUG source.pooled.PooledDataSource  - PooledDataSource forcefully closed/removed all connections.
2020-04-30 18:46:56,521 176    [           main] DEBUG source.pooled.PooledDataSource  - PooledDataSource forcefully closed/removed all connections.
2020-04-30 18:46:56,784 439    [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Opening JDBC Connection
2020-04-30 18:47:00,528 4183   [           main] DEBUG source.pooled.PooledDataSource  - Created connection 20025028.
2020-04-30 18:47:00,528 4183   [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1318ec4]
2020-04-30 18:47:00,542 4197   [           main] DEBUG  com.lulu.dao.IUserDao.findAll  - ==>  Preparing: select * from user 
2020-04-30 18:47:00,592 4247   [           main] DEBUG  com.lulu.dao.IUserDao.findAll  - ==> Parameters: 
2020-04-30 18:47:00,620 4275   [           main] DEBUG  com.lulu.dao.IUserDao.findAll  - <==      Total: 6
User [id=41, username=老王, birthday=Tue Feb 27 17:47:08 CST 2018, sex=男, address=北京]
User [id=42, username=小二王, birthday=Fri Mar 02 15:09:37 CST 2018, sex=女, address=北京金燕龙]
User [id=43, username=小二王, birthday=Sun Mar 04 11:34:34 CST 2018, sex=女, address=北京金燕龙]
User [id=45, username=传智播客, birthday=Sun Mar 04 12:04:06 CST 2018, sex=男, address=北京金燕龙]
User [id=46, username=老王, birthday=Wed Mar 07 17:37:26 CST 2018, sex=男, address=北京]
User [id=48, username=小马宝莉, birthday=Thu Mar 08 11:44:00 CST 2018, sex=女, address=北京修正]
2020-04-30 18:47:00,648 4303   [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1318ec4]
2020-04-30 18:47:00,649 4304   [           main] DEBUG ansaction.jdbc.JdbcTransaction  - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1318ec4]
2020-04-30 18:47:00,649 4304   [           main] DEBUG source.pooled.PooledDataSource  - Returned connection 20025028 to pool.

 去掉日志,输出的信息与表单内容一致。

五、过程中有可能碰到的问题及解决方案

问题1:Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result. 
解决方案:
https://www.cnblogs.com/summer-solstice-sea/archive/2016/06/05/5562351.html(对我无效)
https://www.cnblogs.com/lmei/p/7107421.html(有效)

问题2:Invalid bound statement (not found): com.xxx.dao.xxxDao.selectByxx
解决方案:
https://blog.csdn.net/weixin_42204641/article/details/81155726?utm_source=blogxgwz0

问题3:A mapper element may only specify a url, resource or class, but not more than one.
解决方案:
https://blog.csdn.net/weixin_45535861/article/details/104016685

六、总结

Java学习真的是一个圈,前几天因为学框架之前先学了maven就自认为是浪费了时间。

没想到开始学框架了,又要求你至少会一点maven的知识。

直接从se跳到框架学习,还是会有一种手足无措的感觉。一边学一边补ee的知识点吧。

猜你喜欢

转载自www.cnblogs.com/yizhinailu/p/12810381.html
今日推荐