Mybatis学习

来源:互联网 发布:ubuntu17.04安装mysql 编辑:程序博客网 时间:2024/06/07 07:14

学习了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/mybatisdriver =com.mysql.jdbc.Driverusername =rootpassword =

log4j.properties

日志配置

# Global logging configurationlog4j.rootLogger=ERROR, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n# MyBatis logging configuration...log4j.logger.com.wy.bean.StudentMapper=TRACElog4j.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官方中文网站