欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mybatis初步搭建

程序员文章站 2022-05-07 19:01:56
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,是一个基于Java的持久层框架。为啥要用呢?在我们传统的 JDBC 中,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,闲的繁琐又枯燥。而我们在使用了 MyBatis 之后,只需...

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,是一个基于Java的持久层框架。

本文参考于:https://www.jianshu.com/p/c77e3691867d

为啥要用呢?
在我们传统的 JDBC 中,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,闲的繁琐又枯燥。

而我们在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作 Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。

如何使用呢?
我的愚见初略的理解是
本次使用的是oracle数据库。
第一步 导包
首先在maven的pom文件中导入oracle和mybatis的包。

    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

第二步 创建实体类
创建一个pojo包,里面含有数据库字段所对应的实体类。
我的数据库是这样的:
Mybatis初步搭建

package com.beans;


public class polo {
    String name;
    String password;
    String studentid;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getStudentid() {
        return studentid;
    }

    public void setStudentid(String studentid) {
        this.studentid = studentid;
    }
}

第三步 创建配置文件 mybatis.cfg.xml
在resources目录下建立一个叫mybatis.cfg.xml的文件,其作用是提供连接数据库用的驱动,数据名称,编码方式,账号密码等。以及加载mapper.xml文件

配置文件的大部分内容都是固定的
1.扫描包的地方填写的是扫描实体类所对应的包
2.连接数据库填的是自己的数据库信息
3.mapper则是后面写sql语句的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>

    <!-- 扫描包 -->
    <typeAliases>
        <package name="com.beans"/>
    </typeAliases>

    <!-- 连接数据库 -->
    <environments default="cybatis">
        <environment id="cybatis">
            <!--事务管理方式 jdbc -->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置连接池的方式 POOLED JNDI -->
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
                <property name="username" value="system"/>
                <property name="password" value="sun"/>
            </dataSource>
        </environment>
    </environments>

//之后写sql语句的mapper文件
    <mappers>
        <mapper resource="zhuce.xml"></mapper>
    </mappers>

</configuration>

第四步 创建配置文件   *.xml和创建对应接口
*指的是里面含sql语句的文件,名字可以自己起

下面的两句话是所有的含sql的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">

*.xml文件接下来的代码如下:

  1. namespace是接口所对应的包,这就是和接口关联的操作
  2. insert语句就选insert方法,id是接口中自己起名的方法
  3. selectKey是查询序列的方法,keyProperty是查询出来以后的名字,resultType是查询出来的类型,order有两种选择BEFORE、AFTER,BEFORE是执行完上面的selectKey方法在执行sql语句,AFTER是执行完下面的在执行上面的
  4. 后面的values()里面需要放在#{*}
//namespace
<mapper namespace="com.inter.jiekou">
//insert
    <insert id="insertuser">
//selectKey
<!--        <selectKey keyProperty="name" resultType="java.lang.Integer" order="BEFORE">-->
<!--            select t_users_seq.nextval from dual-->
<!--        </selectKey>-->
        insert into xinxi0708(name,password,studentid) values(#{name},#{password},#{studentid})
    </insert>
</mapper>

接口中代码如下:
方法名是上面insert方法里面的id

//接口文件,写好方法名    对应mapper.xml里面的方法名
public interface jiekou {
    //增加数据
    int insertuser(polo p);
}

第五步 创建一个SqlSessionFactory操作SqlSession的方法
mybatis.cfg.xml到java里面变成一个sqlsession对象,但是sqlsession不能直接被操控,只能使用sqlsessionfactory来操作数据
Mybatis初步搭建

import org.apache.ibatis.io.Resources;

public class dbt {
    static SqlSessionFactory sqlSessionFactory;
    static {
        try {
        	//读取配置文件
            Reader re= Resources.getResourceAsReader("mybatis.cfg.xml");
            //建立sqlSessionFactory
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(re);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getcc(){
        return sqlSessionFactory.openSession();
    }

    public static void main(String[] args) {
        System.out.println(getcc());  //得到连接数据库的会话
    }
}

第六步 编写测试类

public class caozuozz {
    public static void getccd(){
    	//首先需要一个数据
        SqlSession ss= dbt.getcc();   //建立连接的会话
        //取到ss下的usermapper.xml文件
        jiekou jj=ss.getMapper(jiekou.class);
        polo pp=new polo();
        pp.setName("qwe");
        pp.setPassword("wer");
        pp.setStudentid("rty");
        jj.insertuser(pp);
        ss.commit();
    }

    public static void main(String[] args) {
        getccd();
    }
}

第五步第六步的代码也可以合并写成
e.g:偷别人的

public class TestMyBatis {

    public static void main(String[] args) throws IOException {
        // 根据 mybatis-config.xml 配置的信息得到 sqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 然后根据 sqlSessionFactory 得到 session
        SqlSession session = sqlSessionFactory.openSession();
        // 最后通过 session 的 selectList() 方法调用 sql 语句 listStudent
        List<Student> listStudent = session.selectList("listStudent");
        for (Student student : listStudent) {
            System.out.println("ID:" + student.getId() + ",NAME:" + student.getName());
        }

    }
}

本次的思考图我认为可能是这样的
Mybatis初步搭建
第七步 结果集和查询:
增加,删除和修改返回的都是受影响的行数,也就是返回一个int值,但是查询不一样,查询返回的往往是一个对象或是一个具体的数据类型。
例如:修改的方法

    <update id="updateu">
        update t_users set username=#{username},password=#{password},account=#{account} where id=#{id}
    </update>

当返回结果是一个对象或者多个对象的时候,我们需要创建一个结果集。
结果集代码也在mapper文件的下面。
子元素id代表resultMap的主键,而result代表其属性。id和result都是映射单列值到一个属性或字段的简单数据类型。
唯一不同的是,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用,尤其是应用到缓存和内嵌的结果映射
结果集内的标签名的意思:
resultMap的id是mapper文件内其他查询语句调用它的时候所需要的,type类型是返回的结果类型(javabean内的类)
1.property是该结果集在本页面的名字
2.column是数据库内的名字
3.javaType是返回类型
结果集具体代码如下:

    <resultMap id="usermaps" type="User">
<!--        第一个property是本页面的名字,第二个column是数据库内的名字,第三个javaType是返回类型-->
        <id property="id"   column="id"  javaType="java.lang.Integer"></id>
        <result property="username" column="username" javaType="java.lang.String"></result>
        <result property="password" column="password" javaType="java.lang.String"></result>
        <result property="account" column="account" javaType="java.lang.Double"></result>
    </resultMap>

查询时的调用:
查询整张表的集合:

    <select id="selectAll" resultMap="usermaps">
        select *from t_users
    </select>

当where个数为单个时的查询的集合:
parameterType在where个数为单个时要写,两个及以上不用写

    <select id="selecuserbylid" resultMap="usermaps" parameterType="int">
        select *from t_users where id=#{id}
    </select>

当where个数为多个时的查询的集合:
不需要写parameterType,但是where查询内的要写成#{0}、#{1}…
注:在mybatis版本在3.4.4以上的时候写成#{arg0}、#{arg1}…

<!--    多个参数时,不需要写parameterType-->
<!--    在mybatis 3.4.4版本以上不能写#{0}而是要写#{arg0}-->
    <select id="selects" resultMap="usermaps">
        select *from t_users where username=#{arg0} and password=#{arg1}
    </select>

查询单个的字段:

    <select id="selectname" resultType="java.lang.String" parameterType="int">
        select  username from t_users where id=#{id}
    </select>

查询时,多个框可能没有的情况:
第一种方法(selectif):

    <select id="selectif" parameterType="User" resultMap="usermaps">
        select *from t_users
        <where>
            <if test="account!=0">
                and account>#{account}
            </if>
            <if test="username!=null">
                and  username=#{username}
            </if>
        </where>
    </select>

第二种方法:

    <select id="selectwhen" parameterType="User" resultMap="usermaps">
        select *from t_users
        <where>
            <choose>
                <when test="username!=null">
                    username=#{username}
                </when>
                <when test="account!=0">
                    account>#{account}
                </when>
                <otherwise>
                    1=1
                </otherwise>
            </choose>
        </where>
    </select>

两种方法都行,但是第二种效率高一点,因为第一种每个if都要判断

本文地址:https://blog.csdn.net/weixin_46744534/article/details/107289902