MyBatis入门学习笔记

MyBatis依赖信息

使用版本3.4.6

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

​ MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

MyBatis主要就完成2件事情

1. 封装JDBC操作
2. 利用反射打通Java类与SQL语句之间的相互转换

MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。

特点
  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
  • 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql
体系结构

在这里插入图片描述1.0版本用mybaits配置文件加一个mapper.xml文件和一个实体类一个测试类能进行简单的查询操作 还需要一个log4j日志文件
项目结构:
在这里插入图片描述
配置文件中需要添加三个依赖

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.41</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>

</dependencies>

mybaits配置文件的内容:

<?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>
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池,此处使用的是mybaits的连接池  &要用&amp;来表示 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mystudent?useSSL=true&amp;characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!--添加映射文件-->
    <mappers>
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>

</configuration>

映射文件: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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
    <!-- id:statement的id 或者叫做sql的id-->
    <!-- parameterType:声明输入参数的类型 -->
    <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
    <!-- #{}:输入参数的占位符,相当于jdbc的?
            如果是简单类型(基本类型、字符串类型)名称可以任意-->
    <select id="queryAll" parameterType="Integer"
            resultType="com.qf.pojo.Student">
		SELECT * FROM `user`
	</select>
</mapper>

pojo中的实体类就是domain中的实体类,此处就不添加。
mybatis的测试类:

public class Demo1 {
    public static void main(String[] args) throws Exception {
        //1.读取mybatis的配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //2.创建SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //3.获取SqlSession(通过工厂获取连接)
        SqlSession sqlSession = factory.openSession();
        //4.执行
        List<Student> studentList = sqlSession.selectList("test.queryAll");
        //5.遍历
        for (Student student : studentList) {
            System.out.println(student.toString());
        }
        //6.关闭
        sqlSession.close();
    }
}

这种方法执行太麻烦,有很大的代码冗余


2.0版本
项目结构:
在这里插入图片描述
这个版本将创建SqlSession对象封装到一个工具类中pom和1.0版本的内容一样,log4j和mybatis-config.xml也和1.0版本一样,UserMapper.xml中有了增删改查的sql语句
UserMapper.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
    <!--查询所有-->
    <select id="findAll" resultType="com.qf.pojo.User">
        select * from user
    </select>
    <!--根据用户名模糊查询  #相当于占位符? 会自动加'' ${} 相当于字符串的拼接-->
    <select id="findByUsername" resultType="com.qf.pojo.User">
        select * from user where username like #{username};

    </select>
    <!--根据ID查询 resultType结果类型(输出)-->
    <select id="findById" resultType="com.qf.pojo.User">
        select * from user where id=#{id}
    </select>
    <!--添加 parameterType参数类型 (输入)-->
    <insert id="add" parameterType="com.qf.pojo.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            select LAST_INSERT_ID();
        </selectKey>
        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>
    <!--更新-->
    <update id="update" parameterType="com.qf.pojo.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
    <!--删除-->
    <delete id="delete" parameterType="int">
        delete from user where id=#{id}
    </delete>
</mapper>

这个版本中添加了dao层,有dao接口以及dao的实现类,dao接口及实现类的代码如下:

public interface UserDao {
    List<User> findAll();
    User findById(int id);
    List<User> findByUsername(String username);
    void add(User user);
    void update(User user);
    void delete(int id);
}

public class UserDaoImpl implements UserDao {
    @Override
    public List<User> findAll() {
        SqlSession sqlSession = MyBatisUtils.openSession();
        //此处的“test”对应的是UserMapper.xnl中mapper的namespace,findAll对应的是select的id,下面的同理
        List<User> userList = sqlSession.selectList("test.findAll");
        sqlSession.close();
        return userList;
    }

    @Override
    public User findById(int id) {
        SqlSession sqlSession = MyBatisUtils.openSession();
        User user = sqlSession.selectOne("test.finById", id);
        sqlSession.close();
        return user;
    }

    @Override
    public List<User> findByUsername(String username) {
        SqlSession sqlSession = MyBatisUtils.openSession();
        List<User> userList = sqlSession.selectList("test.findByUsername",username);
        sqlSession.close();
        return userList;
    }

    @Override
    public void add(User user) {
        SqlSession sqlSession = MyBatisUtils.openSession();
        sqlSession.insert("test.add",user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    @Override
    public void update(User user) {
        SqlSession sqlSession = MyBatisUtils.openSession();
        sqlSession.update("test.update",user);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

    @Override
    public void delete(int id) {
        SqlSession sqlSession = MyBatisUtils.openSession();
        sqlSession.delete("test.delete",id);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }
}

MyBatisUtils作用,通过创建SqlSessionFactory来获得SqlSession对象

public class MyBatisUtils {
    private static SqlSessionFactory factory;
    static {
        //1创建流读取mybaits-config.xml
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            factory = new SqlSessionFactoryBuilder().build(is);
            System.out.println("sqlsesisonfactory初始化成功");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("sqlsesisonfactory初始化失败");
        }
    }
    // (2)返回SqlSession的方法
    public static SqlSession openSession(){
        return factory.openSession();
    }
}

最后是测试类
UserDaoTest.java

public class UserDaoTest {
    UserDao userDao = new UserDaoImpl();
    @Test
    public void testFindAll(){
        List<User> userList = userDao.findAll();
        for (User user : userList) {
            System.out.println(user.toString());
        }
    }
    @Test
    public void testFindById(){
        User user = userDao.findById(10);
        System.out.println(user.toString());
    }
    @Test
    public void testFindByUsername(){
        List<User> userList = userDao.findByUsername("%张%");
        for (User user : userList) {
            System.out.println(user.toString());
        }
    }
    @Test
    public void testAdd(){
        User user = new User(0,"周芷若","2014-08-08","2","安阳");
        userDao.add(user);
        System.out.println(user.toString());
    }
    @Test
    public void testUpdate(){
        User user = new User(27,"周芷若","2008-9-18","2","安阳");
        userDao.update(user);
    }
    @Test
    public void testDelete(){
        userDao.delete(26);
    }
}

版本3.0
先上项目结构:
在这里插入图片描述
mybatis-config.xml和log4j和之前是一样的
这个版本主要的是UserMapper.xml在UserMapper接口要在同一个包下面
在mybaits-config.xml中将映射文件的mappers改成下面这样

 <mappers>
        <!--<mapper resource="StudentMapper.xml"></mapper>-->
        <mapper resource="com/qf/mapper/UserMapper.xml"></mapper>
    </mappers>

mapper包中只用写接口和xml文件即可,不过,接口的方法和配置文件中的id要一一对应,pojo还是用来放实体类

public interface UserMapper {
    List<User> findAll();
    User findById(int id);
    List<User> findByUsername(String username);
    void add(User user);
    void update(User user);
    void delete(int id);
}

UserMapper.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.qf.mapper.UserMapper">
    <select id="findAll" resultType="User">
        select * from USER
    </select>
    <!--根据id查询-->
    <select id="findById" resultType="User">
        select * from USER where id=#{id}
    </select>
    <!--根据用户名模糊查询-->
    <select id="findByUsername" resultType="User">
        select * from user where username like #{username}
    </select>
    <insert id="add" parameterType="User">
        insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
    </insert>
    <update id="update" parameterType="User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
    </update>
    <delete id="delete">
        delete from user where id=#{id}
    </delete>
</mapper>

测试类和工具类与2.0版本一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值