zoukankan      html  css  js  c++  java
  • MyBatis入门示例——MyBatis学习笔记之一

       MyBatis是另外一款优秀的ORM框架,前身为iBATIS。凡事预则立,不预则废。鉴于以后的项目可能会用到它,因此决定提前学习。本着分享和督促自己学习的目的,笔者将陆续把学习笔记贴出,希望对朋友们有所帮助。如前述博文所述,笔者将使用ant来管理工程。对ant不熟悉的朋友,请参考笔者的两篇预备篇博文:《ant的下载与安装——mybatis学习笔记之预备篇(一)》《ant入门示例——mybatis学习笔记之预备篇(二)》

          本学习笔记以模拟学生选课管理为背景,以MySQL5.5作为数据库。创建数据库、用户、表以及用户授权的SQL脚本(courseman.sql)如下(在本文下方可下载附件,含本示例全部代码。):

    1. /*数据库编码UTF8,以下命令是为了在脚本和  

    2. 命令行中支持中文*/  

    3. set names gbk;  

    4. /*创建courseman数据库*/  

    5. dropdatabase if exists courseman;  

    6. createdatabase courseman;  

    7. /*切换到courseman数据库*/  

    8. use courseman;  

    9. /*创建学生表*/  

    10. CREATETABLE student(  

    11.    id intNOTNULL AUTO_INCREMENT primarykey,  

    12. namevarchar(10) NOTNULL,/*姓名*/  

    13.    gender char(1) NOTNULL,/*性别*/  

    14.    major varchar(20) NOTNULL,/*专业*/  

    15.    grade char(4) NOTNULL/*年级*/  

    16. );  

    17. /*授予courseman用户访问courseman数据库的全部权限。  

    18. 为方便起见,用户名与数据库同名。该用户若不存在则被  

    19. 创建,密码为abc123*/  

    20. grantallprivilegeson courseman.* to courseman@'%'

    21.  identified by'abc123';  

    22. flush privileges;  

    23. /*添加第一条记录*/  

    24. insertinto student(name, gender, major, grade)  

    25. values('李林','男','计算机科学与技术','2011'); 

          在命令行下以root用户登录(mysql –uroot -p),用source命令运行此脚本(假如此脚本在D盘下,即d:courseman.sql,则运行命令:source d:/courseman.sql。注意,这里是“/”,而不是“”)。

          本示例的任务是根据学生的ID读取学生信息。

          笔者在自己机器上的E:DemoPrograms目录下新建目录MyBatis01,用来存放本示例的工程。按照ant工程常见的组织形式,生成文件build.xml存放在此目录下,另外建立两个目录:src(存放源代码和配置文件)lib(存放jar包),而classes目录让ant帮我们创建。将本次要用到的jar包复制到lib目录下(分别为mybatis的mybatis-3.0.6.jar和MySQL的JDBC驱动包mysql-connector-java-5.1.20-bin.jar)。

          在src目录下新建resources目录,用来保存相关的配置文件。之后,我们将要求ant把此目录复制到classes目录下。由于classes目录会被ant添加到类路径中,因此MyBatis可以访问到这些配置文件。其中核心配置文件configuration.xml(当然也可以取其他名字)的内容如下: 

    1. <?xmlversion="1.0"encoding="UTF-8"?>

    2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

    3. <configuration>

    4. <!--表明重用预编译的SQL语句-->

    5. <settings>

    6. <settingname="defaultExecutorType"value="REUSE"/>

    7. </settings>

    8.   <!--类型别名定义。今后可只用Student来代替它冗长的  

    9.   全限定名-->

    10. <typeAliases>

    11. <typeAliasalias="Student"type="com.abc.domain.Student"/>

    12. </typeAliases>

    13.   <!--environments可包含多个environment元素。  

    14.   每个environment配置与数据库交互的细节,这里  

    15.   只需要配置一个。default属性是指在创建SqlSessionFactory  

    16.   时,若没有明确指定要用哪个environment,则使用此  

    17.   属性指定的-->

    18. <environmentsdefault="development">

    19. <environmentid="development">

    20. <transactionManagertype="jdbc"/>

    21. <!--使用连接池的数据源配置-->

    22. <dataSourcetype="POOLED">

    23. <propertyname="driver"value="com.mysql.jdbc.Driver"/>

    24. <propertyname="url"

    25. value="jdbc:mysql://localhost/courseman"/>

    26. <propertyname="username"value="courseman"/>

    27. <propertyname="password"value="abc123"/>

    28. </dataSource>

    29. </environment>

    30. </environments>

    31.   <!--指定要用到的mapper文件。以下的resource属性告诉  

    32.   MyBatis要在类路径下的resources目录下找StudentMapper.xml文件。我们将把mapper文件存放在src目录下的resources目录中,并让ant把resources目录拷贝到classes中,而classes目录会被ant添加到类路径中。-->

    33. <mappers>

    34. <mapperresource="resources/StudentMapper.xml"/>

    35. </mappers>

    36. </configuration>

     (注:我在configuartion.xml和下面的StudentMapper.xml中添加中文注释后报“Invalid byte 1 of 1-byte UTF-8 sequence.”错误,不知为何。有知道的朋友望告知。因此需要本示例代码的朋友不要复制这两个文件的代码,在本文下方下载附件即可。附件可直接运行。)

          此配置文件很简单,这也体现了笔者一向的原则:从最简单的开始。其实有部分知识不太理解也属正常,慢慢用多了自然就理解了,熟悉了,这符合一般的学习规律。相信包括笔者在内的学习者,都是这种情况。

         接着编写学生类,这是一个普通的java bean。代码如下:

    1. package com.abc.domain;  

    2. publicclass Student {  

    3. privateint id;  

    4. private String name;   //姓名 

    5. private String gender; //性别 

    6. private String major;  //专业 

    7. private String grade;  //年级 

    8. publicint getId() {  

    9. return id;  

    10.     }  

    11. publicvoid setId(int id) {  

    12. this.id = id;  

    13.     }  

    14. public String getName() {  

    15. return name;  

    16.     }  

    17. publicvoid setName(String name) {  

    18. this.name = name;  

    19.     }  

    20. public String getGender() {  

    21. return gender;  

    22.     }  

    23. publicvoid setGender(String gender) {  

    24. this.gender = gender;  

    25.     }  

    26. public String getMajor() {  

    27. return major;  

    28.     }  

    29. publicvoid setMajor(String major) {  

    30. this.major = major;  

    31.     }  

    32. public String getGrade() {  

    33. return grade;  

    34.     }  

    35. publicvoid setGrade(String grade) {  

    36. this.grade = grade;  

    37.     }  

    38. }  

           按照包的层次结构,在src目录下建立子目录层次comabcdomain,然后把Student.java存放于此。

          MyBatis需要我们提供一个接口,在接口中声明访问数据库的方法。因此,编写接口StudentMapper.java如下: 

    1. package com.abc.mapper;  

    2. import com.abc.domain.Student;  

    3. publicinterface StudentMapper {  

    4. //根据学生ID查询学生实体 

    5. public Student getById(int id);  

    6. }  

           类似地,将此文件放置在src目录下的comabcmapper目录下。

          现在编写上面提到的mapper文件StudentMapper.xml。在此文件里,我们写好查询的SQL语句,并配置好映射关系。内容如下:

    1. <?xmlversion="1.0"encoding="UTF-8"?>

    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    3. <!--namespace该是StudentMapper的完整限定名-->

    4. <mappernamespace="com.abc.mapper.StudentMapper">

    5. <!--定义java bean的属性与数据库表的列之间的映射。type="Student"用到了configuration.xml中定义的别名-->

    6. <resultMapid="studentResultMap"type="Student">

    7. <!--id映射-->

    8. <idproperty="id"column="id"/>

    9. <!--普通属性映射-->

    10. <resultproperty="name"column="name"/>

    11. <resultproperty="gender"column="gender"/>

    12. <resultproperty="major"column="major"/>

    13. <resultproperty="grade"column="grade"/>

    14. </resultMap>

    15.        <!--与StudentMapper接口中的getById方法对应,包括  

    16.        方法名和参数类型。SQL语句中以“#{}”的形式引用参数-->

    17. <selectid="getById"parameterType="int"resultMap="studentResultMap">

    18.           SELECT *  

    19.           FROM student  WHERE id = #{id}  

    20. </select>

    21. </mapper>

           MyBatis将根据此文件帮我们实现StudentMapper接口。下面编写TestMyBatis.java,实现我们的功能。代码如下:

    1. package com.test;  

    2. import java.io.IOException;  

    3. import java.io.Reader;  

    4. import org.apache.ibatis.io.Resources;  

    5. import org.apache.ibatis.session.SqlSessionFactory;  

    6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  

    7. import org.apache.ibatis.session.SqlSession;  

    8. import org.apache.ibatis.session.SqlSessionFactory;  

    9. import com.abc.mapper.StudentMapper;  

    10. import com.abc.domain.Student;  

    11. publicclass TestMyBatis  

    12. {     

    13. publicstaticvoid main(String[] args)  

    14.     {  

    15. //与configuration.xml中的mapper配置类似,告诉MyBatis 

    16. //应读取的核心配置文件 

    17.         String resource = "resources/configuration.xml";  

    18.         Reader reader = null;  

    19. try{  

    20.             reader = Resources.getResourceAsReader(resource);  

    21.             }catch(IOException e)  

    22.                {  

    23.                  e.printStackTrace();  

    24.                }  

    25. //创建SqlSessionFactory实例。没有指定要用到的 

    26. //environment,则使用默认的environment 

    27.       SqlSessionFactory sqlSessionFactory  

    28.           = new SqlSessionFactoryBuilder().build(reader);  

    29.       SqlSession sqlSession = sqlSessionFactory.openSession();  

    30. try{        

    31.             StudentMapper mapper =  

    32.                       sqlSession.getMapper(StudentMapper.class);  

    33.             Student student = mapper.getById(1);  

    34. if(student != null)  

    35.             {  

    36.                 System.out.println("姓名: "+student.getName()  

    37.                     +" 专业: "+student.getMajor());  

    38.             }  

    39. else

    40.             {  

    41.                 System.out.println("没有找到。");  

    42.             }  

    43.          }  

    44. finally

    45.           {  

    46.             sqlSession.close();  

    47.           }   

    48.     }  

           在命令窗口进入E:DemoProgramsMyBatis01目录,运行命令:ant run。则运行结果如下:


     

    【MyBatis学习笔记】系列之预备篇一:ant的下载与安装

    【MyBatis学习笔记】系列之预备篇二:ant入门示例

    【MyBatis学习笔记】系列之一:MyBatis入门示例

    【MyBatis学习笔记】系列之二:MyBatis增删改示例

    【MyBatis学习笔记】系列之三:MyBatis的association示例

    【MyBatis学习笔记】系列之四:MyBatis association的两种形式

    【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例

    【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续

    【MyBatis学习笔记】系列之七:MyBatis一对多双向关联

    【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置

    【MyBatis学习笔记】系列之九:MyBatis collection的两种形式

    【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例

    【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例

    【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例

    【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例

    【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题

    【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式

    【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例

    【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例

    本文出自 “肖凡的专栏” 博客,请务必保留此出处http://legend2011.blog.51cto.com/3018495/908956

  • 相关阅读:
    ffmpeg用法
    文本文件存储格式
    一个守护进程实例
    构造函数初始化列表问题
    Windows系统下远程Linux系统
    printStackTrace
    getParameter
    HTML5新增的属性和废除的属性
    oracle导出表结构及注释
    <input type="text" > size与width区别
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958805.html
Copyright © 2011-2022 走看看