Mybatis中使用xml进行增删改查实践

简介: Mybatis中使用xml进行增删改查实践

【1】概要


MyBatis是支持普通sql查询、存储过程和高级映射的半自动持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。


MyBatis可以使用 简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects 普通的Java对象)映射成数据库中的记录。每一个Mybatis应用程序都以一个sqlSessionFactory对象的实例为核心。


sqlSessionFactory对象的实例可以通过sqlSessionFactoryBuilder对象来获得。sqlSessionFactoryBuilder对象可以通过xml配置文件,或从以往使用管理中准备好的Configuration类实例中来构建sqlSessionFactory对象。

使用配置类获取sqlSessionFactory

BlogMapper是一个含有SQL语句注解的mapper接口。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//环境
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
//映射器类
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);


注意这种情况下配置是添加映射器类。映射器类是Java类,这些类包含SQL映射语句的注解从而避免了xml文件的依赖,但是xml映射仍然在大多数高级映射(比如:嵌套join映射)时需要。


出于这样的原因,如果存在xml配置文件的话,MyBatis将会自动查找和加载一个对等的XML文件(这种情况下,基于类路径下的BlogMapper.class类的类名,那么BlogMapper.xml将会被加载–即class 与 XML在同一个文件目录下。否则需要手动配置加载xml)。

其他获取sqlsessionFactory的方法如:

SqlSessionFactory build(Reader reader)
SqlSessionFactory build(Reader reader, String environment) 
SqlSessionFactory build(Reader reader, Properties properties) 
SqlSessionFactory build(Reader reader, String environment, Properties properties)
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
SqlSessionFactory build(Configuration config)


【2】基本增删改查xml配置

① 以userMapper实例

<?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.web.mapper.userMapper">
   <!-- 可以解决model属性名与数据表中column列名不一致问题 jdbcType一定要大写 -->   
   <resultMap type="User" id="UserMap">
    <id property="id" column="id" javaType="int" jdbcType="INTEGER"/>
    <result property="name" column="username" javaType="string" jdbcType="VARCHAR"/>
    <result property="age" column="age" javaType="int" jdbcType="INTEGER"/>
   </resultMap>
   <!--
   注意这里的result,如果column == property 则可以直接返回Java object。
   如果属性名与列名不一致,解决方法如下:
   1. 使用resultMap; 
   2.返回hashmap ; 
   3.查询语句使用别名
   -->
   <select id="getUser" parameterType="int" resultMap="UserMap">
    select * from t_user where id=#{id}
   </select>
   <delete id="deleteUser" parameterType="int" >
    delete from t_user where id=#{id}
   </delete>
   <update id="updateUser" parameterType="User" >
    update t_user set username=#{name},age=#{age} where id=#{id}
   </update>
   <insert id="insertUser" parameterType="User" >
    insert into t_user(username,age) values(#{name},#{age})
   </insert>
   <!-- model's attr(name) different from column(username), so the result use UserMap -->
   <select id="getUsers"  resultMap="UserMap">
    select * from t_user
   </select>
</mapper>



② 注册到全局配置文件mybatis.xml

当与spring结合时,将不需要这个配置文件。

mybatis的配置文件

<?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"/>
  <!-- 配置实体类的别名 -->
  <typeAliases>
    <!-- <typeAlias type="com.web.model.User" alias="User"/> -->
    <package name="com.web.model"/>
  </typeAliases>
<!-- 
  development : 开发模式
  work : 工作模式
 -->
  <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>
  </environments>
  <mappers>
  <!--xml格式-->
    <mapper resource="com/web/mapper/userMapper.xml"/>
    <mapper resource="com/web/mapper/orderMapper.xml"/>
  <!--sql 注解格式-->   
    <mapper class="com.web.mapperClass.UserMapper"/>
  </mappers>
</configuration>


【3】通过SqlSessionFactory拿到session

这里使用xml文件获取sqlSessionFactory和sqlSession。

public static SqlSessionFactory getFactory(){
  String resource = "mybatis.xml";
  InputStream inputStream = MybatisUtils.class.getClassLoader().getResourceAsStream(resource);
  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
  return factory;
}
SqlSession session = factory.openSession(true);
//默认手动提交;
/*
两种解决方式:
1.factory.opensession(true);
2.session.commit();
*/


其他获取sqlsession的方式如下:

SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, Connection connection)

【4】增删改查后台测试代码

① 基本增删改查测试

/*use  sql  xml not annotation*/
  @Test
  public void testAdd(){
    //直接使用sqlsession的方法进行操作,不对userMapper进行代理
    SqlSession session = MybatisUtils.getFactory().openSession();
    String statement = "com.web.mapper.userMapper.insertUser";
    /*return the effect rows*/
    int insert= session.insert(statement, new User("tom5", 15));
    /*default is not auto commit*/
    session.commit(true);
    session.close();
    System.out.println("effect rows.."+insert);
  }
  @Test
  public void testSelect(){
    /*set auto commit ,which equals to the above*/
    SqlSession session = MybatisUtils.getFactory().openSession(true);
    String statement = "com.web.mapper.userMapper.getUser";
    /*return the effect rows*/
    User user =  session.selectOne(statement, 3);
    System.out.println("effect rows.."+user);
  }
  @Test
  public void testUpdate(){
    SqlSession session = MybatisUtils.getFactory().openSession(true);
    String statement = "com.web.mapper.userMapper.updateUser";
    /*return the effect rows*/
    int update= session.update(statement, new User(3,"tom4", 13));
    System.out.println("effect rows.."+update);
  }
  @Test
  public void testDelete(){
    SqlSession session = MybatisUtils.getFactory().openSession();
    String statement = "com.web.mapper.userMapper.deleteUser";
    /*return the effect rows*/
    int delete= session.delete(statement, 6);
    /* commit by yourself*/
    session.commit();
    System.out.println("effect rows.."+delete);
    session.close();
  }
  @Test
  public void testGetUsers(){
    SqlSession session = MybatisUtils.getFactory().openSession();
    String statement = "com.web.mapper.userMapper.getUsers";
    /*return the List<User>*/
    List<User> users= session.selectList(statement);
    session.commit();
    System.out.println("effect rows.."+users);
    session.close();
  }


② 参数类型和返回类型为map

修改userMapper.xml :

<select id="getUserForMap" parameterType="hashmap" resultType="hashmap">
    select * from c_user where id=#{id};
  </select>


测试代码

@Test
public void getUserForMap(){
  SqlSession session = MybatisUtils.getFactory().openSession();
  String statement = "com.web.mapper.userMapper.getUserForMap";
  HashMap<String, Object> map = new HashMap<String, Object>();
  map.put("id", 1);
  /*return the effect rows*/
  Object selectOne = session.selectOne(statement, map);
  /*default is not auto commit*/
  session.commit(true);
  session.close();
  System.out.println("effect rows.."+selectOne+" ,class :"+selectOne.getClass());
}


测试结果

effect rows..{id=1, age=12, name=luli} ,class :class java.util.HashMap


目录
相关文章
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
453 0
|
6月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
578 5
|
8月前
|
XML Java 数据库连接
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
277 21
|
8月前
|
人工智能 Java 数据库连接
MyBatis Plus 使用 Service 接口进行增删改查
本文介绍了基于 MyBatis-Plus 的数据库操作流程,包括配置、实体类、Service 层及 Mapper 层的创建。通过在 `application.yml` 中配置 SQL 日志打印,确保调试便利。示例中新建了 `UserTableEntity` 实体类映射 `sys_user` 表,并构建了 `UserService` 和 `UserServiceImpl` 处理业务逻辑,同时定义了 `UserTableMapper` 进行数据交互。测试部分展示了查询、插入、删除和更新的操作方法及输出结果,帮助开发者快速上手 MyBatis-Plus 数据持久化框架。
623 0
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
469 5
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
251 1
|
6月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
173 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
270 1
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)