Mybatis学习

学习了Mybatis,觉得这个东西是真的方便,站在巨人的肩上都能感受到无穷的能量呀。

MyBatis官方中文网站

完整项目:http://oz1w76hwf.bkt.clouddn.com/java/mybatisMyBatis.7z

搭建项目

使用Maven搭建好项目
项目结构图

image

环境准备

安装mybatis
在pom.xml中加入maven依赖

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

同时增加java连接数据库依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.40</version>
</dependency>

后面需要到的日志log4j依赖

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
数据库表结构和数据
-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes`  (
  `cid` int primary key auto_increment,
  `cname` varchar(10)
) 

-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES (1, '软件工程一班');
INSERT INTO `classes` VALUES (2, '软件工程二班');
INSERT INTO `classes` VALUES (3, '软件工程三班');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `sid` int primary key auto_increment,
  `sname` varchar(10),
  `spwd` varchar(50),
  `cid` int
) 
--增加外键约束
alter table student add constraint sc foreign key(cid) references classes(cid) 
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '文章', 'a', 1);
INSERT INTO `student` VALUES (2, '沪旦铭', 'a', 1);
INSERT INTO `student` VALUES (3, '马伊琍', 'a', 1);
INSERT INTO `student` VALUES (7, '佟大为', 'a', 2);
INSERT INTO `student` VALUES (8, '谢娜', 'a', 2);
INSERT INTO `student` VALUES (9, '王力宏', 'a', 3);
JavaBean
Student类
import java.io.Serializable;
public class Student implements Serializable{

    private static final long serialVersionUID = 3626150075724553325L;

    private Integer sid;
    private String sname;
    private String spwd;
    private Integer cid; //班级编号
    //省略get set方法
}
Classes类
import java.io.Serializable;
import java.util.List;

public class Classes implements Serializable{

    private static final long serialVersionUID = 5527884450588186839L;
    private Integer cid;
    private String cname;

    private List<Student> student;
    //省略get set方法
}

配置Mybatis

使用框架,就是搭建一系列的配置文件

mybatis-config.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>

    <!-- 配置执行顺序 -->
    <!-- 
        properties 属性
        settings 设置
        typeAliases 类型别名
        typeHandlers 类型处理器
        objectFactory 对象工厂
        plugins 插件
        environments 环境
        environment 环境变量
        transactionManager 事务管理器
        dataSource 数据源
        databaseIdProvider 数据库厂商标识
        mappers 映射器
      -->

    <properties resource="config.properties">
        <!--  
          注意: 如果加上一下两句表示数据库的连接名称为root 密码为a 这个可以不填写则mybatis会去config.properties读取
     <property name="username" value="root"/>
     <property name="password" value="a"/>
    -->
    </properties>
    <!-- 配置了properties则数据源连接可以用     ${username} 格式动态加载数据 -->


    <settings>
      <!-- 设置缓存等相关 -->
      <setting name="cacheEnabled" value="true"/>
      <!-- 设置日志 -->
      <setting name="logImpl" value="LOG4J"/>

    </settings>
    <!-- 类的别名 同时也支持包扫描 -->
    <typeAliases>
    <!-- 一个一个类指明 <typeAlias alias="Author" type="domain.blog.Author"/> -->
      <!-- 使用包扫描 -->
      <package name="com.wy.bean"/>
    </typeAliases>


    <environments default="development">
      <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
              <!-- 数据库连接信息 -->
              <property name="driver" value="${driver}"/>
              <property name="url" value="${url}"/>
              <property name="username" value="${username}"/>
              <property name="password" value="${password}"/>
        </dataSource>
      </environment>
    </environments>

    <!-- 配置映射文件 有三种方式  xml.文件,类,file: -->
    <mappers>
      <mapper resource="com/wy/bean/StudentMapper.xml"/>
      <mapper resource="com/wy/bean/ClassesMapper.xml"/>
    </mappers>

</configuration>
config.properties

数据库配置文件

#dateSource propertie 
url =jdbc:mysql://localhost:3306/mybatis
driver =com.mysql.jdbc.Driver
username =root
password =
log4j.properties

日志配置

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# 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

# MyBatis logging configuration...
log4j.logger.com.wy.bean.StudentMapper=TRACE
log4j.logger.com.wy.bean.ClassesMapper=TRACE

Mapper XML 映射文件

StudentMapper.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.wy.bean.StudentMapper">

  <!-- 根据名字查找学生 -->
  <!-- 注意:在mybatis-config.xml没有配置类别名的时候需要写上类的全路径  com.wy.bean.Student-->
  <select id="selectStudentBySname" resultType="Student" parameterType="Student">
    select * from student where sname = #{sname}
  </select>

  <!-- 查找所有学生 返回的是一个list集合 -->
  <select id="selectAllStudent" resultType="Student">
    select * from student
  </select>
</mapper>
ClassesMapper.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.wy.bean.ClassesMapper">

    <!-- 开启缓存 -->
    <cache/>


    <!-- 查找所有班级 -->
    <select id="selectAllClasses" resultType="Classes">
        select * from classes
    </select>

    <resultMap id="studentResultMap" type="Classes">

      <id property="cid" column="cid" />
      <result property="cname" column="cname"/>
      <!-- 如果是一对多关系则用collection 一个班级对应对个学生-->
      <collection property="student" ofType="Student">
            <id property="sid" column="sid"/>
            <result property="sname" column="sname"/>
      </collection>
    </resultMap>


    <!-- 根据班级名查找所有学生 -->
    <!-- 
        因为查到的结果集并不是只有班级,还有多个学生,因此需要在classes类中写上学生
     -->
    <select id="selectStudentByClassesCName" parameterType="Classes" resultMap="studentResultMap">
        select classes.cid as cid,cname,sid,sname from student 
        left join classes on student.cid = classes.cid 
        where cname = #{cname}
    </select>

    <!-- 
      <association property="student" javaType="Student">
        <id property="sid" column="sid"/>
        <result property="sname" column="sname"/>
      </association>
     -->

</mapper>

使用Junit测试

package com.wy.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 org.junit.Test;

import com.wy.bean.Classes;
import com.wy.bean.Student;

/**
 * 测试sqlsession是否创建成果
 * @author 沪旦铭
 *
 */
public class MyTest {

    static SqlSession sqlSession ;

    static {

        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //建立Sqlsession
        sqlSession = sqlSessionFactory.openSession();

    }


    @Test
    public void selectStudentBySname() throws IOException {
        //通过sqlSession去执行sqlQurey
        //参数说明: xml配置文件.执行的id
        Student s = new Student();
        s.setSname("沪旦铭");
        Student stu = sqlSession.selectOne("com.wy.bean.StudentMapper.selectStudentBySname",s);

        System.out.println( stu.getSname() ); 
        /*
        DEBUG [main] - ==>  Preparing: select * from student where sname = ? 
        DEBUG [main] - ==> Parameters: 沪旦铭(String)
        TRACE [main] - <==    Columns: sid, sname, spwd, cid
        TRACE [main] - <==        Row: 2, 沪旦铭, a, 1
        DEBUG [main] - <==      Total: 1
        沪旦铭
        */


    }

    //查找所有学生信息
    @Test
    public void selectAllStudent() {
        List<Student> list = sqlSession.selectList("com.wy.bean.StudentMapper.selectAllStudent");
        for(Student stu:list) {
            System.out.println(  stu.getSname() );
        }
        /*
        DEBUG [main] - ==>  Preparing: select * from student 
        DEBUG [main] - ==> Parameters: 
        TRACE [main] - <==    Columns: sid, sname, spwd, cid
        TRACE [main] - <==        Row: 1, 文章, a, 1
        TRACE [main] - <==        Row: 2, 沪旦铭, a, 1
        TRACE [main] - <==        Row: 3, 马伊琍, a, 1
        TRACE [main] - <==        Row: 7, 佟大为, a, 2
        TRACE [main] - <==        Row: 8, 谢娜, a, 2
        TRACE [main] - <==        Row: 9, 王力宏, a, 3
        DEBUG [main] - <==      Total: 6
        文章
        沪旦铭
        马伊琍
        佟大为
        谢娜
        王力宏
        */


    }

    //查询所有的班级
    @Test
    public void selectAllClasses() {
        List<Classes> list = sqlSession.selectList("com.wy.bean.ClassesMapper.selectAllClasses");
        for(Classes c:list) {
            System.out.println( c.getCname() );
        }
        /*
        DEBUG [main] - Cache Hit Ratio [com.wy.bean.ClassesMapper]: 0.0
        DEBUG [main] - ==>  Preparing: select * from classes 
        DEBUG [main] - ==> Parameters: 
        TRACE [main] - <==    Columns: cid, cname
        TRACE [main] - <==        Row: 1, 软件工程一班
        TRACE [main] - <==        Row: 2, 软件工程二班
        TRACE [main] - <==        Row: 3, 软件工程三班
        DEBUG [main] - <==      Total: 3
        软件工程一班
        软件工程二班
        软件工程三班
        */
    }


    //根据班级名查找所有的学生
    @Test
    public void selectStudentByClassesCName() {
        Classes c = new Classes();
        c.setCname("软件工程一班");
        Classes cla = sqlSession.selectOne("com.wy.bean.ClassesMapper.selectStudentByClassesCName",c);

        System.out.println( cla.getCname() );   
        List<Student> stus = cla.getStudent();
        for(Student s:stus) {
            System.out.println( s.getSid()+"\t"+s.getSname() );
        }
        /*
            DEBUG [main] - Cache Hit Ratio [com.wy.bean.ClassesMapper]: 0.0
        DEBUG [main] - ==>  Preparing: select classes.cid as cid,cname,sid,sname from student left join classes on student.cid = classes.cid where cname = ? 
        DEBUG [main] - ==> Parameters: 软件工程一班(String)
        TRACE [main] - <==    Columns: cid, cname, sid, sname
        TRACE [main] - <==        Row: 1, 软件工程一班, 1, 文章
        TRACE [main] - <==        Row: 1, 软件工程一班, 2, 沪旦铭
        TRACE [main] - <==        Row: 1, 软件工程一班, 3, 马伊琍
        DEBUG [main] - <==      Total: 3
        软件工程一班
        1   文章
        2   沪旦铭
        3   马伊琍
        */
    }
}

更详细的学习参考官方文档即可!
MyBatis官方中文网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值