栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis新手教程之简单入门

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis新手教程之简单入门

1、Mybatis概述  

MyBatis 是支持普通 SQL 查询(相比较于Hibernate的封装,Mybatis是半自动化的JDBC封装,一个特点就是Mybatis执行的SQL查询语句需要自己在配置文件中写),存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录。

2、Mybatis原理解析

下面以Mybatis简单的执行流程

  1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着标签项。

  2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

  3、SqlSession对象完成和数据库的交互:

  a、用户程序调用mybatis接口层api(即Mapper接口中的方法)

  b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象

  c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象

  d、JDBC执行sql。

  e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。

下面是Mybatis的框架原理图

  

3、Mybatis简单实例

(1)导入相关jar包以及Mybatis运行环境核心jar包和连接数据库的包

(2)创建一张简单的数据表

(3)创建Java对象(PO类型)

package cn.mybatis.po;

public class User {
 private int id;
 private String username;
 private String password;
 private String address;
 private String sex;

 public int getId() {
 return id;
 }

 public String getUsername() {
 return username;
 }

 public String getPassword() {
 return password;
 }

 public String getAddress() {
 return address;
 }

 public String getSex() {
 return sex;
 }

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

 public void setUsername(String username) {
 this.username = username;
 }

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

 public void setAddress(String address) {
 this.address = address;
 }

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

 @Override
 public String toString() {
 return "User{" +
  "id=" + id +
  ", username='" + username + ''' +
  ", password='" + password + ''' +
  ", address='" + address + ''' +
  ", sex='" + sex + ''' +
  '}';
 }
}

User实体类

(4)创建Mybatis核心配置文件(SqlMapConfig.xml)

在核心配置文件配置连接数据库的相关信息,(如果是和Spring整合,则可以放在Spring配置文件中进行对数据库的配置)




 

 

 
 
 
  
  
  
  
  
  
  
  
  
 
 
 
 
 
 


Mybatis核心配置文件

(5)创建一个Mapper.xml文件,对应编写所需要的Sql查询操作





 
 
 
 
 
 
 SELECT * FROM t_user WHERe username LIKE '%${value}%'
 

使用查询的时候碰到一个小错误,由于之前测试的insert方法,其中在User实体类中添加了有参构造函数,所以出现了下面的错误,分析原因就是:使用Mybatis查询的时候需要在实体类中加入无参构造方法(当然如果实体类本身没有构造函数,就会是默认的无参构造函数)

附上findByUsername的函数实现

public void findUserByUsername() throws IOException {
 //得到配置文件的文件流信息
 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 SqlSession sqlSession = sqlSessionFactory.openSession();

 List userList = sqlSession.selectList("test.findUserByUsername","u");
 System.out.println(userList);
 //释放会话资源
 try {
  sqlSession.close();
 } catch (Exception e) {
  e.printStackTrace();
 }
 }

findByUsername函数实现

(3)删除操作

首先在Mapper中配置删除的操作

 
  DELETE FROM t_user WHERe id = #{value}
 

运行测试程序,同insert中一样,需要手动提交事务,如下面所示

最终结果:

数据表中删除了编号为10的数据记录

5.细节整理

(1)关于示例程序中一些相关类的理解

   a)SqlSessionFactoryBuilder

   用来创建SqlSessionFactory。因为SqlSessionFactory使用了单例模式,所以不需要使用单例模式来管理SqlSessionFactoryBuilder,只需要在创建SqlSessionFactory时 候使用一次就可以

   b)SqlSessionFactory

   会话工厂,用来创建SqlSession。可以使用单例模式来管理SqlSessionFactory这个会话工厂,工厂创建之后,就一直使用一个实例。

   c)SqlSession

   面向程序员的接口,提供了操作数据库的方法。SqlSession是线程不安全的(原因:在SqlSession实现类中除了接口中的操作数据库的方法之外,还有数据域的属性,比如说一些提交的数据等等,所以在多线程并发请求的时候,会导致线程不安全),所以我们可以将SqlSession使用在方法体里面,这样每个线程都有自己的方法,就不会冲突

(2)Mybatis中mapper映射文件

  如同解释Mybatis执行原理的时候一样,Mapper映射文件中配置的Sql语句,实际上在执行的时候都被封装称为一个个MapperStatment对象,即Mapper映射文件是按照statment来管理不同的Sql。在编写程序的时候,我们在使用SqlSession其中的操作数据库的方法(selectOne,selectList等等)的时候,传入的参数除了实参(id,模糊查询的字符串等等)之外,还需要传入的就是相应的Sql位置,而Sql是被Statment管理,所以就是传入namespace+statmentId

(3)占位符

   #{id}:其中的id表示的就是接受的输入参数,参数名称就是id,这里指出:如果输入参数是简单类型,#{}中的参数名可以任意设置(value或者其他名称)

   ${value}:表示将输入的参数不加任何的修饰,直接作为字符串拼接在SQL中但是这样直接拼接,容易导致SQL注入的隐患${value}中的value表示接受的输入参数,注意如果输入参数是简单类型,其中的形参只能用value

(4)别名定义

     ①单个别名的定义


 
 
 

      定义别名后的使用

 
  SELECT * FROM t_user WHERe id = #{id}
 

 
  DELETE FROM t_user WHERe id = #{value}
 


mapper.xml配置文件

    ②编写mapper接口,按照mapper代理的方式开发规范来编写mapper的接口

package cn.mybatis.testmapper;

import cn.mybatis.mapper.UserMapper;
import cn.mybatis.po.User;
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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;


public class UserMapperTest {

 private SqlSessionFactory sqlSessionFactory;

 @Before
 public void setUp() throws Exception {
  InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 }

 @Test
 public void testFindUserById() throws Exception{

  SqlSession sqlSession = sqlSessionFactory.openSession();
  //得到UserMapper的代理对象
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  User user = userMapper.findUserById(9);

  System.out.println(user);
 }

 @Test
 public void testDeleteUser() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  userMapper.deleteUser(9);
  sqlSession.commit();
 }

 @After
 public void tearDown() throws Exception {
 }
}

mapper接口

    ③Junit测试

package cn.mybatis.testmapper;

import cn.mybatis.mapper.UserMapper;
import cn.mybatis.po.User;
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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;


public class UserMapperTest {

 private SqlSessionFactory sqlSessionFactory;

 @Before
 public void setUp() throws Exception {
  InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 }

 @Test
 public void testFindUserById() throws Exception{

  SqlSession sqlSession = sqlSessionFactory.openSession();
  //得到UserMapper的代理对象
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  User user = userMapper.findUserById(8);

  System.out.println(user);
 }

 @Test
 public void testDeleteUser() throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  userMapper.deleteUser(8);
 }

 @After
 public void tearDown() throws Exception {
 }
}

Junit测试

    ④查询结果展示

    ⑤删除结果展示

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对考高分网的支持。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/139002.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号