Mybatis的简单使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

     一直想对自己学习框架的过程做一个记录,经过这次记录感觉自己好像又进一步掌握了Mybatis,但是写这篇文章的目的并不单单是着眼于学习Mybatis,而是想着学会思考,假如未来又出现一个框架,我应该从何入手,如何去学习。


一、传统方式

1.准备工作导入jdbc的驱动

        String url = "jdbc:mysql://127.0.0.1:3306/mytest?useSSL=false";
        String user = "root";
        String pass = "root";
        Connection connection = null;

        try {
            //反射获取驱动,将驱动注册到DriverManager里
            Class.forName("com.mysql.jdbc.Driver");
            //从DriverManager里获取连接
            connection = DriverManager.getConnection(url, user, pass);
            String sql="select * from student where name=? ";
            //进行预编译处理sql
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1,"小明");
            //执行sql并返回结果集
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                //将结果集进行遍历保存处理
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

二、使用Mybatis

1.准备工作配置maven依赖

导入mybatis和mysql的驱动

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

2.对MyBatis进行配置

1.配置mybatis.xml文件和properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1/mytest?useSSL=false
username=root
password=root
<?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 resource="jdbc.properties"/>
    <!-- 设置日志-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
    <!-- 设置别名-->
    <typeAliases>
        <package name="com.xzt.domain"/>
    </typeAliases>
    
    <!-- 设置连接数据库的相关配置 environments标签下可以有很多个环境 default表示默认选择的环境-->
    <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>
       <!--另一个环境配置 如果切换就直接将default修改为这个环境的id-->
       <!--  <environment id="development2">
            <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>

     <!--扫描mapper文件-->
    <mappers>
        <!--写mapper文件的路径-->
        <mapper resource="com/xzt/dao/StudentDao.xml"/>
        <!--        <package name="com.xzt.dao"/>-->
    </mappers>

</configuration>
2.创建实体类
package com.xzt.domain;
public class Student {
    private Long id;
    private String name;
    private Integer age;
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.创建数据访问层dao并配置对应的mapper.xml文件
package com.xzt.dao;

import com.xzt.domain.Student;
import org.apache.ibatis.annotations.Param;
import org.omg.CORBA.INTERNAL;

import java.util.List;

public interface StudentDao {
//    List<Student> selectAll(List<Long> id);

//    List<Map<Object,Object>> selectMapList(@Param("id") Long id, @Param("age") String age);


    //一个插入方法对应一个<insert>标签
    Integer insertStudent(Student student);
    //一个删除方法对应一个<deleted>标签
    Integer deleteStudent(Long id);
    //一个更新方法对应一个<update>标签
    Integer updateStudent(Student student);
    /*查询方法对应 <select>标签  当mapper文件中用了if标签,单个参数也要加上@Param注解 
    * 不然if里的test判断会报错找不到id
    */
    List<Student> selectAll(@Param("id") Long id);
    /* 
    * 传多个参数  两种方式
    * 1 通过对象的方式,将多个参数封装到对象中 如上述通过Student传id,name,age
    * 2 每个参数加@Param注解标签
    *  
    */
    Student selectOne(@Param("id")  Integer id, @Param("age")  String age);
    List<Student> selectAllIn( @Param("id") List<Long> id);
}
<?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.xzt.dao.StudentDao">
 <!-- 标签的几个属性 
   1.resultType
      增删改:不能设置resultType   返回的是受影响记录的条数 
      查:这里需要注意,返回值类型是每一条结果的类型 是list里存的对象而不是返回的List
         我们可以思考一下传统的jdbc接收数据,变化的代码只是while循环中new的对象
         的对象的变化。
         List<Student> =new ArrayList();
         while (resultSet.next()) {
         Student student =  new Student();
         student.setAge(resultSet.get)
         ...
         list.add(student);        
         }
         所以我们其实只需要告诉mybatis循环中需要new的数据的类型,
         mybatis会帮我们遍历插入到list中,
         但如果我们告诉mybatis数据是个List,mybatis无从下手。
   2.parameterType 
      传入参数类型其实可以不写 mybatis会自动获取参数类型-->
    <insert id="insertStudent" parameterType="com.xzt.domain.Student">
        insert into student(id,name,age) values (#{id},#{name},#{age})
    </insert>

    <delete id="deleteStudent" parameterType="java.lang.Long">
        delete from student where id=#{id}
    </delete>

    <update id="updateStudent" parameterType="com.xzt.domain.Student">
        update student set  name = #{name} where  id=#{id}
    </update>
    
   
    <select id="selectAll" resultType="com.xzt.domain.Student" parameterType="java.lang.Long">
         select * from student where 1=1
       
        if标签作用,当标签里的test内容成立时会拼接到上面的语句中-->
        <if test=" id !=null ">
            and id=#{id}
        </if>
    </select> 
    
    <select id="selectOne" resultType="com.xzt.domain.Student">
        select * from student where id=#{id} and age=#{age}
    </select>  
    
    <select id="selectAllIn" resultType="com.xzt.domain.Student">
        select * from student where 1=1
        <if test="id != null and id.size!=0">
            and id in
            <foreach collection="id" index="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </if>
    </select>
</mapper>
3.运行测试程序

先理一下前面做了什么
第一步配置了连接的相关属性,其实以后的使用中该主配置文件一般只需
修改资源文件 jdbc.properties文件的位置,文件中的url,username,password
修改需要扫描的Mapper文件的位置
第二步创建mapper文件其实就是对StudentDao接口进行了实现
以后增加例如TeacherDao,只需要增加对应的TeacherDaoMapper类,并将mapper文件再添加至主配置文件中,让其扫描到

创建测试程序

package com.xzt;

import com.xzt.dao.StudentDao;
import com.xzt.domain.Student;
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 java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

public class main {
    public static void main(String[] args) throws IOException {
        //从类路径下加载主配置文件
        InputStream resourceAsStream  =  Resources.getResourceAsStream("mybatis.xml");
        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        //创建工厂对象
        SqlSessionFactory sqlSessionFactory = builder.build(resourceAsStream);
        //获取sqlSession  这里这设置参数为事务自动提交 默认为false 如果为false 最后需要 调用 sqlSession.commit();
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        /*以上都是固定代码 
        *也很好记忆 
        *创建建造者,建造者打造工厂,工厂创建sql会话对象,最终目的就是拿到 sqlSession */
        //sqlSession.getMapper() 根据接口找到对应这个接口的mapper文件,根据mapper文件创建并返回一个StudentDao接口的实现类
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);



        Student insertStudent = new Student();
        insertStudent.setName("小明");
        insertStudent.setAge(10);
        studentDao.insertStudent(insertStudent);

        studentDao.deleteStudent(1L);

        Student updateStudent = new Student();
        insertStudent.setName("小明");
        insertStudent.setAge(10);
        studentDao.updateStudent(updateStudent);

        List<Student> students = studentDao.selectAllIn(Arrays.asList(1L, 2L));
        List<Student> student2 = studentDao.selectAll( 1L);
        Student  student  = studentDao.selectOne( 1L ,13);

        System.out.println(student);

        students.forEach(System.out::println);
    }
}

最后附上程序结构
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值