• MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
    MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。
    MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

*MyBatis的导jar包


        <!--数据库相关-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>

        <!--配置mySql-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

        <!--配置mybatis-->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!--配置JDBC-->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>

*在main文件夹下创建resources文件并标记为资源文件,在该文件夹下创建mybatis的配置文件(mybatis-config.xml).

XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。

<?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>
        <!--/第一种-->
        <!--指定实体类-->
       <typeAlias type="com.lanou.demo.bean.UserBean" alias="user"/>
        <!--
        第二种:
        批量为某个包下的实体类的的小驼峰形式
        -->
        <package name="com.lanou.demo.bean"/>
    </typeAliases>


    <environments default="dev">
        <environment id="dev">
            <!--配置事务管理器-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源的类型我为连接池类型-->
            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/j0304?serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>

            </dataSource>
        </environment>

    </environments>


    <!--引入所有mapper.XML文件-->

    <mappers>
        <!--指定插入的文件-->
        <mapper resource="UserMapper.xml"/>

        
        <!--使用class来指定-->
        <mapper class="com.lanou.demo.mapper.UserRepository"/>-->

        <!--批量引入Mapper文件-->
        <package name="com.lanou.demo.mapper"/>
    </mappers>


</configuration>

*创建一个实体类,
在main包下建一个java包 ,在里面建立 com.lanou.demo 包,在这个包下建bean包里面只写有关实体类的代码

package com.lanou.demo.bean;

public class TeacherBean {

    private  Integer teacherId;
    private String teacherName;


    @Override
    public String toString() {
        return "TeacherBean{" +
                "teacherId=" + teacherId +
                ", teacherName='" + teacherName + '\'' +
                '}';
    }

    public Integer getTeacherId() {
        return teacherId;
    }

    public void setTeacherId(Integer teacherId) {
        this.teacherId = teacherId;
    }

    public String getTeacherName() {
        return teacherName;
    }

    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }
}

*.创建一个接口来实现有关这个实体类的sql语句
在 com.lanou.demo 包下,建mapper这个包只用来写SQL语句的接口

package com.lanou.demo.mapper;

import com.lanou.demo.bean.TeacherBean;

import java.util.List;

public interface TeacherMapper {


    //查询所有
    List<TeacherBean> findAll();

    void  addOne(TeacherBean teacherBean);


}

*实现sql语句,使用 mybatis-config.xml 配置类型别名 第二种:批量为某个包下的实体类的的小驼峰形式 走mappers标签下的 批量引入Mapper文件
在与java 相同的resources 包下建立 com.lanou.demo.mapper,(必须要与要实现的接口路径一样)

<?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.lanou.demo.mapper.TeacherMapper">

   -简单映射
    由于表中的列名和实体类的属性名()不一致.
    所以需要映射,否则查出的数据只有数量面没有内容

 
    -结果映射
    id:结果映射的唯一标识
    type:需要映射成实体类的类型
  
    <resultMap id="teacherMap" type="teacherBean">
        <!--具体的书写哪一列映射到那个属性-->

        <!--主键使用id标签进行映射-->
        <id column="teacher_id" property="teacherId"/>
        <!--其他使用result标签来进行映射-->
        <result column="teacher_name" property="teacherName"/>
    </resultMap>


    <select id="findAll" resultMap="teacherMap">
       // 正常这么写
     <!--  select  teacher_id as teacherId,
               teacher_name as teacherName
        from tb_teacher-->

        //映射过后的写法
        select * from tb_teacher

    </select>

    <!--为了获取到新增数据生成之后的主键-->
       <!-- keyColumn="teacher_id" keyProperty="teacherId" useGeneratedKeys="true"写上这个就可以-->

    <insert id="addOne" keyColumn="teacher_id"
            keyProperty="teacherId" useGeneratedKeys="true">

        insert  into  tb_teacher values (null ,#{teacherName})
    </insert>

</mapper>

*实现userMapper接口的xml
userMapper.xml 可以不和java中的地址一样,但必须使用 第一种配置类别名,并指定他所要插入的文件 ,走mappers标签下的指定插入文件
这种不需要接口,就能查
例:

<?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="UserMapple">

    <select id="findall" resultType="com.lanou.demo.bean.UserBean">
        select id,name,passwork,age from `tb-user`
    </select>



</mapper>

*实现 UserRepository 接口
这种和第一种实现一样的路径地址

package com.lanou.demo.mapper;

import com.lanou.demo.bean.UserBean;

public interface UserRepository {

    UserBean findOne(Integer id);

    void insertOne(UserBean userBean);

    void  updateById(UserBean user);

    void deleteById(UserBean userBean);
}

实现的xml,(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.lanou.demo.mapper.UserRepository">

    <!--id要与接口中的方法名一致-->
    <!--所以java接口中的方法不要写成重载的方式-->

    <select id="findOne" resultType="userBean">

        <!--
    参数使用#{}的形式来获取
    里面的参数变量名是有规则的:如果接口中的参数只有一个并且类型是值的类型
    那么这个变量名起什么都行
    如果接口中传递的参数是一个对象,那么每一条属性都是一个参数
    获取参数时候,{}里面必须写的是参数的属性名
    -->
        select *from `tb-user`where id = #{id}
    </select>


    <insert id="insertOne">
        insert into `tb-user`
        values (null, #{name}, #{passwork}, #{age})
    </insert>


    <update id="updateById">
        update `tb-user`
        set name     = #{name},
            passwork = #{passwork},
            age      = #{age}
        where id = #{id}
    </update>


    <delete id="deleteById">
        delete
        from `tb-user`
        where id = #{id}
    </delete>

</mapper>

*写一个Test测试一下

package com.laou.demo;

import com.lanou.demo.bean.TeacherBean;
import com.lanou.demo.bean.UserBean;

import com.lanou.demo.mapper.TeacherMapper;
import com.lanou.demo.mapper.UserRepository;
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 java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileAlreadyExistsException;
import java.util.List;

public class MyBatisTest {


    @Test
    public void test1() throws IOException {

        //把文件读成输入流
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);

        SqlSession session = sqlSessionFactory.openSession();
        //测试"UserMapple.xml中的findall 方法
        List<UserBean> list = session.selectList("UserMapple.findall");


        //指定测试的接口为UserRepository.class
        UserRepository mapper = session.getMapper(UserRepository.class);
        //调取接口中的方法
        UserBean one = mapper.findOne(1);

        //添加 userBean 属性
        UserBean userBean = new UserBean();
        userBean.setName("王五");
        userBean.setPasswork("12345");
        userBean.setAge(6);
        //调取接口中的insertOne 方法
        mapper.insertOne(userBean);


        userBean.setName("李四");
        userBean.setAge(7);
        //调取接口中的updateById 方法
        mapper.updateById(userBean);
        //提交session
        session.commit();


        // 指定测试的接口为TeacherMapper.class
        TeacherMapper mapper1 = session.getMapper(TeacherMapper.class);
        //调取接口中的findAll 方法
        List<TeacherBean> all = mapper1.findAll();
        System.out.println(all);

        //创建一个teacherBean 的对象
        TeacherBean teacherBean = new TeacherBean();
        teacherBean.setTeacherName("aaa");
        //调取addOne 方法,这个方法调取了主键
        mapper1.addOne(teacherBean);

        //提交 session
        session.commit();

        // 测试获取到自动生成的主键
        System.out.println(teacherBean.getTeacherId());
    }
}

posted on 2019-06-02 13:11  脑抽不要停  阅读(118)  评论(0编辑  收藏  举报