Mybatis的认知与使用

问前世今生,言了了自述

MyBatis的前身是Apache下的一个开源项目ibatis,后在2010年迁移到Google,更名为Mybatis,又于2013年迁移到 Github。
它是一种半自动的ORM框架,它不是直接建立Java对象到关系数据库表的数据的映射,而是建立在对Java对象的操作方法到sql语句之间的映射关系上,所以,它让使用者可以自由编写SQL、存储过程、视图等等,使用者自己编写的高效SQL会让项目的执行更优化。MyBatis依靠XML文件配置映射关系,通过XML+接口的方式实现增删改查。

不知何所示,一试探究之

准备工作

mysql数据库(以下演示使用版本8.0.19)及一张User表;
maven项目(推荐使用,省去导入jar包过程)

开始实践

下面介绍两种MyBatis的使用方法:

使用配置文件

  1. 创建User表
    在这里插入图片描述
  2. 创建项目,引入pom依赖
	<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.19</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.4</version>
    </dependency>
  1. 定义MyBatis全局配置文件

将配置文件直接放到根目录下,方便获取(Eclipse)
将配置文件直接放到resources下(IDEA)

<?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>
    <!--环境配置-->
    <!--默认环境-->
    <environments default="mysql">
        <!--mysql环境-->
        <environment id="mysql">
            <!--JDBC事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED连接池-->
            <dataSource type="POOLED">
                <!--四大参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
				<property name="url" value="jdbc:mysql://localhost/test_db"></property>
				<property name="username" value="develop"></property>
				<property name="password" value="123456"></property>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/study/mybatis/UserMapper.xml" />
    </mappers>
</configuration>
  1. 创建实体类
public class User {
	private int id;
    private String name;
    private String sex;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +"id=" + id +", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public User(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

	public User() {
	}
}
  1. 定义接口类
public interface UserInfo {
    public void addUser(User user);
    public void updateUser(User user);
    public void deleteUser(int id);
    public List<User> getAllUser();
    public User getUserById(int id);
}
  1. 编写映射文件mapper.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.micro.profession.mybatis.GetUserInfo">
    <insert id="addUser" parameterType="com.study.entity.User"
            useGeneratedKeys="true" keyProperty="id">
        insert into user (name,sex)
        values(#{name},#{sex})
    </insert>
    <update id="updateUser" parameterType="com.study.entity.User">
        update user set name =
        #{name} , sex = #{sex}
        where id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from user
        where id =
        #{id}
    </delete>
    <select id="getAllUser" resultType="com.study.entity.User">
        select id,name,sex from user
    </select>
    <select id="getUserById" parameterType="int" resultType="com.study.mybatis.User">
        select id,name,sex from user where id = #{id}
    </select>
</mapper>
  1. 编写测试类
public class Test {

	public static void main(String[] args) {

        // 1. 加载应⽤用配置文件
        InputStream is = Test.class.getClassLoader().getResourceAsStream("config.xml");

        // 2. 创建SqlSessonFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3. 获取Session
        SqlSession session = sessionFactory.openSession(true);

        try {
            // 4. 获取操作类
            UserInfo userInfo = session.getMapper(UserInfo.class);

            // 5. 完成增删改查操作
            List<User> users = userInfo.getUser();// 获取所有用户
            for (User result: users) {
                System.out.println(result.getId() + " " + result.getName() + " " + result.getSex()  + ";");
            }
            
            User user = new User("张三","男");
            userInfo.addUser(user);// 插入
            
            user = userInfo.getUserById(user.getId());// 按照id查看结果
            System.out.println(user.getId() + " " + user.getName() + " " + user.getSex()  + ";");
                      
            user.setName("李四");
            user.setSex("女");
            userInfo.updateUser(user);// 修改
            
            user = userInfo.getUserById(user.getId());// 按照id查看结果
            System.out.println(user.getId() + " " + user.getName() + " " + user.getSex()  + ";");
            
            userInfo.deleteUser(user.getId());// 删除

        } finally {
            // 6.关闭Session
            session.close();
        }

	}

}

到此,一个简单的以配置文件方式使用MyBatis的增删改查应用就写好了。

使用注解

  1. MyBatis全局配置文件去掉mapper的配置
<?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>
    <!--环境配置-->
    <!--默认环境-->
    <environments default="mysql">
        <!--mysql环境-->
        <environment id="mysql">
            <!--JDBC事务-->
            <transactionManager type="JDBC"></transactionManager>
            <!--POOLED连接池-->
            <dataSource type="POOLED">
                <!--四大参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
				<property name="url" value="jdbc:mysql://localhost/test_db"></property>
				<property name="username" value="develop"></property>
				<property name="password" value="123456"></property>
            </dataSource>
        </environment>
    </environments>
</configuration>
  1. 定义接口类
public interface UserInfoAnnotation {

    @Insert("insert into user(name,sex) values(#{name},#{sex})")
    @Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
    public void addUser(User user);

    @Update("update user set name=#{name}, sex=#{sex} where id=#{id}")
    public void updateUser(User user);

    @Delete("delete from user where id=#{id}")
    public void deleteUser(int id);

    @Select("select id,name,sex from user")
    public List<User> getUser();

    @Select("select id,name,sex from user where id=#{id}")
    public User getUserById(int id);
}
  1. 编写测试类
public class TestAnnotation {

    public static void main(String[] args) {
        // 1. 加载应⽤用配置文件
        InputStream is = TestAnnotation.class.getClassLoader().getResourceAsStream("config.xml");

        // 2. 创建SqlSessonFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        Configuration configuration = sessionFactory.getConfiguration();
        configuration.addMapper(UserInfoAnnotation.class);

        // 3. 获取Session
        SqlSession session = sessionFactory.openSession();

        try {
            // 4. 获取操作类
            UserInfoAnnotation userInfo = session.getMapper(UserInfoAnnotation.class);

            // 5. 完成增删改查操作
            List<User> users = userInfo.getUser();// 获取所有用户
            for (User result: users) {
                System.out.println(result.getId() + " " + result.getName() + " " + result.getSex()  + ";");
            }

            User user = new User("张三","男");
            userInfo.addUser(user);// 插入

            user = userInfo.getUserById(user.getId());// 按照id查看结果
            System.out.println(user.getId() + " " + user.getName() + " " + user.getSex()  + ";");

            user.setName("李四");
            user.setSex("女");
            userInfo.updateUser(user);// 修改

            user = userInfo.getUserById(user.getId());// 按照id查看结果
            System.out.println(user.getId() + " " + user.getName() + " " + user.getSex()  + ";");

            userInfo.deleteUser(user.getId());// 删除

        } finally {
            // 6.关闭Session
            session.close();
        }

    }
}

以上,两种使用方式便介绍完毕了。

处处惹人恼,早看早知道

Q1:使用IDEA练习,编写全局配置文件时,"http://mybatis.org/dtd/mybatis-3-config.dtd"报红

Ans:在这里插入图片描述
如图所示,添加网址即可。

Q2:在获取输入流(InputStream )时是null

Ans:若你是Eclipse编写代码,按照上述过程操作,检查下是否将全局配置文件config.xml放在了根目录下,并且在测试类中正确书写了文件名。
若是用IDEA编写代码,检查下全局配置文件config.xml、mapper.xml是否放在resources类型的文件夹下,并且正确书写了文件名。

Q3:到执行sql时报异常Error instantiating class com.study.mybatis.User with invalid types () or values ()

Ans:MyBatis在创建bean映射时,需要无参的构造器来构造对象,所以检查一下你定义的User类,是否缺少无参的构造器

Q4:执行insert语句,不执行delete时数据依旧未插入到数据库表中

Ans:注意测试类中获取session这一句“SqlSession session = sessionFactory.openSession(true);”,这句里当标识了“true”,才能正确的插入,因为MyBatis获取的session,默认是开启事务的,所以session下的增删改查操作都是在一个事务中,需要我们显示的调用commit提交才行

Q5:根据id查询user后得到null,以致报空指针异常

Ans:需要注意的是在insert执行语句中,无论是使用配置文件执行,还是利用注解执行都设置了返回自增id,确认下是否正确书写

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值