MyBatis学习笔记(2)-项目配置说明

最近在学习使用MyBatis这个工具包来进行数据库开发,发现黑马程序员的一个资源分享网站做的特别好,视频课程讲的清楚又免费!链接地址备忘 http://yun.itheima.com/course/41.html ,推荐看着学习。
在学习中,其中很重要的一点就是如何配置MyBatis便于访问数据库。我将其中的MyBatis基础知识配置部分全部整理了一下,如果不想看理论讲解直接讲使用的话,按着这个步骤足够了。
如图是MyBatis的配置文件相关的目录结构,并列明了配置的具体步骤,像具体创建完SqlMapConfig.xml之后可能随着项目需求的变化跟着改变配置。 备注添加:图中log4j,properties文件的目录位置是错的,应该放在src根目录下,不然容易警告找不到log。



以下分别按照配置步骤逐个说明:
Step1:添加引用jar包。
需要添加MyBatis包的lib里所有的jar,如图


以及
mybatis-3.2.7.jar包本身,我自己使用的是3.2.7版本,从GitHub上下载的。
GitHub仓库地址 https://github.com/mybatis/mybatis-3/releases 上可以任意选择某个版本下载。
添加jar包的方法:
菜单Project->Properties->Java Build Path->Libraries->Add Exterrnal JARS,如图:




Step2:添加配置SqlMapConfig.xml文件
src跟文件夹下新建了config文件夹,及SqlMapConfig.xml,具体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 >  
    <!-- <settings></settings> -->  
    <!-- 自定义别名 -->  
    < typeAliases >  
        <!-- 单个别名定义 -->  
        <!-- <typeAlias type="com.itheima.mybatis.po.User" alias="user"/> -->  
 
        <!-- 批量别名定义(推荐) -->  
        <!-- package:指定包名称来为该包下的 po 类声明别名,默认的别名就是类名(首字母大小写都可) -->  
         < package name = "com.itheima.mybatis.po" />  
    </ typeAliases >  
    <!-- 配置 mybatis 的环境信息,与spring整合,该信息由spring来管理 -->  
    < environments default = "development" >  
        < environment id = "development" >  
            <!-- 配置JDBC事务控制,由 mybatis 进行管理 -->  
            < transactionManager type = "JDBC" ></ transactionManager >  
            <!-- 配置数据源,采用 mybatis 连接池 -->  
            < dataSource type = "POOLED" >   
                < property name = "driver" value = "com.mysql.jdbc.Driver" />
                < property name = "url" value = "jdbc:mysql://localhost:3306/my_db_test" />
                < property name = "username" value = "root" />
                < property name = "password" value = "123456" />
            </ dataSource >  
        </ environment >  
    </ environments >  
    <!-- 加载映射文件,2018-4-14yanru修改 -->  
    < mappers >  
        < mapper resource = "config/sqlmap/UserMapper.xml" />  
    <!-- <mapper resource=" mapper /UserMapper.xml" /> -->  
        <!-- 批量加载映射文件 -->  
        < package name = "com.itheima.mybatis.mapper" />  
    </ mappers >  
</ configuration >  
其中注意的是, my_db_test 指的是我本机数据库的名称。以及UserMapper.xml是我所使用的测试加载Mapper文件,具体的SQL语句就会配在其中。
以下为创建和初始化表信息:
/*Table structure for table `user` */
 
DROP TABLE IF EXISTS `user`;
 
CREATE TABLE `user` (
  `id` int(10) NOT NULL DEFAULT '1',
  `name` varchar(100) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
/*Data for the table `user` */

insert  into `user`(`id`,`name`,`age`) values (1,'哈哈',2),(2,'张三',1),(3,'李四',2),(4,'王五',1),(5,'啥名字',2),(6,'赵六',1),(7,'赵六',2);
 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;


Step3:创建名为log4j.properties的文件:
具体配置文件内容如下,唯一注意的就是log级别,默认开发者模式用DEBUG选项,等项目发布以后再改为INFO用户级别。备注,log4j这个文件最好放在src根目录下不然会出现如图的找不到log文件的报错导致log4j的一些调试log无法正常输出:(我也是查询了 https://www.cnblogs.com/huxinga/p/6868074.html 这个链接地址的解决方案才好的

如下是配置文件具体内容:
# Global logging configuration,DEBUG is development environment,INFO is user environment
log4j.rootLogger= DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper= TRACE
# Console output...
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %5p [%t] - %m%n


Step4:创建跟表结构一致的数据结构:
如下我创建了User.java类,类名任意,只要类成员结构跟数据库表对得上就行。其中,我还故意测试一下,比如本来作为表主键的id(int类型)我在数据结构类中故意修改为了String类型,结果也能“碰巧测试通过”,不会严格编译或运行报错,但是我们都知道类型不一致这写法太不安全了,所以原则上数据类的成员类型必须和数据库保持一致、或值域一致。
package cn.mytest.mybatis.po;
  /**
  * @version 2018 - 4 - 14 17:12:24
  * @author DELL
  */
public class User
    //属性名要和数据库表的字段对应
    private int id
    private String name
    private int age
    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 int getAge() { 
       return age
    } 
    public void setAge( int age ) { 
       this . age = age
    }  
}


Step5:添加并为user表配置相应的SQL语句XML UserMapper.xml:
如下具体是UserMapper.xml的配置内容,其中我只配了一个SQL表达式" findUserById "用于查询用户信息:

<? 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 命名空间,作用就是对 sql 进行分类花管理,理解 sql 隔离
注意:使用 mapper 代理方法开发, namespace 有特殊重要的作用
-->
< mapper namespace = "test" >  
 
  <!-- 在映射文件中配置很多 sql 语句 -->
  <!-- 需求:通过id查询用户表的记录 -->
  <!-- 通过select执行数据库查询,以下为精确查询
  id:标识 映射文件中的 sql
         将 sql 语句封装到mappedStatement对象中,所以将id成为statement的id
   ①parameterType:指定输入参数的类型,这里指定 int
   ②#{}表示一个占位符
   ③#{id}:其中的id表示接收输入的参数,参数名称就是id,如果参数类型是简单类型,#{}中的参数名可以任意,可以是value或其他名称
   ④resultType:指定 sql 输出结果的所映射的java对象雷西兴,select指定resultType表示将单条记录映射成的java对象。
  -->
  < select id = "findUserById" parameterType = "int" resultType = "cn.mytest.mybatis.po.User" >
     SELECT * FROM USER WHERE id=#{value}
  </ select >
</ mapper >


Step6:创建工作类测试与数据库的交互:
最后我创建了一个名为MyFirstBatis.java的工作类用来访问数据库:
package cn.mytest.mybatis.first;
import org.junit.Test;
import cn.mytest.mybatis.po.User;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * <p>Description:MyBatis入门程序,用于处理对数据库的增删改查</p>
 * @author DELL
 *
 */
public class MyBatisFirst {
   //根据id查询用户信息,得到一条结果记录
   @Test
   public void findUserByIdTest()
   {
      //MyBatis配置文件
      String resource ="config/SqlMapConfig.xml";
      //step1:得到配置文件流
      java.io.InputStream inputStream = null;
      try {
         //具体.getResourceAsStream中相对路径的格式为src基础资源目录为根目录,最好将其他要加载的文件也放在src文件夹下
         inputStream = Resources.getResourceAsStream(resource);
         System.out.println("success get resource="+resource);
      } catch (IOException e) {
         // TODO Auto-generated catch block
         System.out.println("Resources.getResourceAsStream获取路径="+resource+"的资源失败!");
         e.printStackTrace();
      }
     
      //step2:创建会话工厂
      SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
        
      //step3:通过工厂得到SqlSession
      SqlSession sqlSession = sqlSessionFactory.openSession();
        
      //step4:通过SQLSession操作数据库
      //第一个参数,映射文件中statement的id,等于namespace+"."+statement的id
      //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
      //sqlSession.selectOne结果与映射文件中所匹配的resultType类型的对象
      User user=   sqlSession.selectOne("test.findUserById",3);
      System.out.println(user);
      System.out.println("sqlSession res output getId="+user.getId());
      System.out.println("sqlSession res output getName="+user.getName());
      System.out.println("sqlSession res output getAge="+user.getAge());
     
      //释放资源
      sqlSession.close();
   }
}

最后运行效果,成功查询数据库!如图


猜你喜欢

转载自blog.csdn.net/stephanie_1/article/details/80023678