mybatis使用xml进行增删改查代码解析

MyBatis是支持普通sql查询、存储过程和高级映射的持久层框架。

MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。

MyBatis可以使用 简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects 普通的Java对象)映射成数据库中的记录。

每一个Mybatis应用程序都以一个sqlSessionFactory对象的实例为核心。

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

【示例:使用配置类获取sqlSessionFactory】

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)。

【1】基本增删改查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.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>
    <mapper resource="com/web/mapper/userMapper.xml"/>
    <mapper resource="com/web/mapper/orderMapper.xml"/>
    <mapper class="com.web.mapperClass.UserMapper"/>
  </mappers>
</configuration>

【2】通过SqlSessionFactory拿到session

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

public static SqlSessionFactory getFactory(){
	/* flow the src dir*/
	String resource = "mybatis.xml";
	/*MybatisUtils.class.getResourceAsStream(resource)----- it's wrong !!!!
     * please distinguish the two up and down
     * */
	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();
  */

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

/*use sql xml not annotation*/
@Test
  public void testAdd(){
	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();
}

Tips :

parameterType 和 resultType 为 hashmap :

  • mapper.xml :
<select id="getUserForMap" parameterType="hashmap" resultType="hashmap">
    select * from c_user where id=#{id};
  </select>
  • test code :
@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());
}
  • result as follows :
effect rows..{id=1, age=12, name=luli} ,class :class java.util.HashMap

综上可知:mybatis 会根据参数类型和结果类型,自动进行解析封装。

【扩展 基本方法】

【1】分页列表

 <select id="getListPage" parameterType="hashmap" resultMap="siteExtendDaoMap">
    select id,site_id,site_name,site_number,province,city,area,address,internal_number,longitude,latitude
    from tb_site
    --使用动态sql
    <trim prefix="where" prefixOverrides="AND |OR ">
      <if test="checkState!= null and checkState!=''">
        and check_state = #{checkState,jdbcType=INTEGER}
      </if>
      <if test="siteId!= null and siteId!=''">
        and site_id like concat('%',#{siteId},'%')
      </if>
      <if test="siteName!= null and siteName!=''">
        and site_name like concat('%',#{siteName},'%')
      </if>
      <if test="siteNumber!= null and siteNumber!=''">
        and site_number like concat('%', #{siteNumber},'%')
      </if>
      <if test="province!= null and province!=''">
        and province = #{province}
      </if>
      <if test="city!= null and city!=''">
        and city = #{city}
      </if>
      <if test="area!= null and area!=''">
        and area = #{area}
      </if>
    </trim>
    --添加排序
    <if test="sortname!= null and sortname!='' and sortorder!= null and sortorder!=''">
      order by ${sortname} ${sortorder}
    </if>
    --添加分页
    limit ${(page-1)*pagesize},${pagesize}
 </select>

【2】删除方法–根据对象或者Id

如果参数为pojo,mybatis会自动从对象里面获取id ;

  <delete id="delete" parameterType="User">
    delete from tb_user
    where
    id = #{id}
  </delete>

  <delete id="deleteById" parameterType="long">
    delete from tb_user
    where
    id = #{id}
  </delete>

【3】根据 id list 删除数据

  <delete id="deleteByIds">
    delete from tb_user
    where id in
    --使用foreach
    <foreach collection="list" item="id" open="(" separator=","close=")"> #{id}
    </foreach>
  </delete>

【4】getRows

通常与getListPage联合使用。

<select id="getRows" parameterType="hashmap" resultType="long">
    select count(*) from tb_sys_role
    <if test="keySysRole!= null">
      <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="keySysRole.id!= null">
        and id = #{keySysRole.id}
        </if>
        <if test="keySysRole.name!= null and keySysRole.name!=''">
        and name = #{keySysRole.name}
        </if>
        <if test="keySysRole.available!= null and keySysRole.available!=''">
        and available = #{keySysRole.available}
        </if>
      </trim>
    </if>
  </select>

总结

以上就是本文关于mybatis使用xml进行增删改查代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Mybatis中的config.xml配置文件详细解析

    经过前面的文章,我觉得对Mybatis的正题理解已经足够了,但是对Mybatis的使用,我觉得还是会有一点的模糊,就我个人而言,我觉得掌握好Mybatis框架,主要要明白三个文件,第一个就是等下要谈论的Mybatis-comfig.xml文件,还有就是**Mapper.xml,以及我们所定义的Mapper类,理解了这三个东西,然后有sql的基础,还有java的基础的话,后面不论是使用基于xml的方法,还是基于java-based Configuration的方法,都会简单的多. 废话不多说,现在

  • 详解SpringBoot 快速整合MyBatis(去XML化)

    序言: 此前,我们主要通过XML来书写SQL和填补对象映射关系.在SpringBoot中我们可以通过注解来快速编写SQL并实现数据访问.(仅需配置:mybatis.configuration.map-underscore-to-camel-case=true).为了方便大家,本案例提供较完整的层次逻辑SpringBoot+MyBatis+Annotation. 具体步骤 1. 引入依赖 在pom.xml 引入ORM框架(Mybaits-Starter)和数据库驱动(MySQL-Conn)的依赖.

  • mybatis如何通过接口查找对应的mapper.xml及方法执行详解

    本文主要介绍的是关于mybatis通过接口查找对应mapper.xml及方法执行的相关内容,下面话不多说,来看看详细的介绍: 在使用mybatis的时候,有一种方式是 BookMapper bookMapper = SqlSession().getMapper(BookMapper.class) 获取接口,然后调用接口的方法.只要方法名和对应的mapper.xml中的id名字相同,就可以执行sql. 那么接口是如何与mapper.xml对应的呢? 首先看下,在getMapper()方法是如何操作

  • mybatis映射XML文件详解及实例

    mybatis映射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="c

  • Mybatis中 XML配置详解

    Mybatis常用带有禁用缓存的XML配置 <?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> <

  • Mybatis中通过generator生成mapper、Dao、mapper.xml的方法

    1.将如下东西复制到项目中,或某一个文件夹. 2.更改generator.xml (1)更改数据驱动包的位置,选择你所安装的目录: (2)更改你所要连接的数据库的名称,数据库的user和password (3)更改下图 targetPakage的地方,targetProject的地方,这里targetProject所在的地方一定要存在 要不然会报错 (4)在tableName中填写你所要填写的表名.domainObjectName填写你想要生成的名字. 3.进入命令行窗口运行: 1.进入项目 的

  • 基于MyBatis XML配置方法(全面了解)

    MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息. 文档的顶层结构如下: configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSourc

  • 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)

    序言:使用MyBatis3提供的注解可以逐步取代XML,例如使用@Select注解直接编写SQL完成数据查询,使用@SelectProvider高级注解还可以编写动态SQL,以应对复杂的业务需求. 一. 基础注解 MyBatis 主要提供了以下CRUD注解: @Select @Insert @Update @Delete 增删改查占据了绝大部分的业务操作,掌握这些基础注解的使用是很必要的.例如下面这段代码无需XML即可完成数据查询: @Mapper public interface UserMa

  • mybatis使用xml进行增删改查代码解析

    MyBatis是支持普通sql查询.存储过程和高级映射的持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用 简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects 普通的Java对象)映射成数据库中的记录. 每一个Mybatis应用程序都以一个sqlSessionFactory对象的实例为核心. sqlSessionFactory对象的实例可以通过sqlSessionFa

  • MyBatis中SqlSession实现增删改查案例

    前言 开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕竟是作为java/mybatis学习的过程想把学习的路线和遇到的问题都总结下来,也让知识点在脑海里能形成一个体系. 开发环境 idea2016.mybatis3.SQLServer2012 pom.xml.mybatis.xml.log4j.properties 先贴上pom.xml是因为他直接和搭建开发环境和测试环境有关系,mybatis.xml则是连接数据库,log4j.properties在学习阶段配置上有助于我们

  • SpringBoot整合Mybatis与thymleft实现增删改查功能详解

    首先我们先创建项目 注意:创建SpringBoot项目时一定要联网不然会报错 项目创建好后我们首先对 application.yml 进行编译 #指定端口号server: port: 8888#配置mysql数据源spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/nba?serverTimezone=Asia/Shanghai    use

  • PHP实现对xml的增删改查操作案例分析

    本文实例讲述了PHP实现对xml的增删改查操作.分享给大家供大家参考,具体如下: 案例: index.php <?php header("content-type:text/html;charset=utf-8"); $xmldom = new DOMDocument(); $xmldom->load("demo2.xml"); //查询学生信息 $stus = $xmldom->getElementsByTagName("学生"

  • Android利用Dom对XML进行增删改查操作详解

    1. 概述 平常我们一般是使用JSON与服务器做数据通信,JSON的话,直接用GSON或者其他库去解析很简单.但是,其他有些服务器会返回XML格式的文件,这时候就需要去读取XML文件了. XML的解析有三种方式,在Android中提供了三种解析XML的方式:DOM(Document Objrect Model) , SAX(Simple API XML) ,以及Android推荐的Pull解析方式,他们也各有弊端,而这里来看看使用DOM的方式. 2. Dom解析 DOM解析器在解析XML文档时,

  • Java对XML文件增删改查操作示例

    本文实例讲述了Java对XML文件增删改查操作.分享给大家供大家参考,具体如下: xml文件: <?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>哈里波特</name> <price>10</price> <memo>这是一本很好看的书.</memo> </book> <b

  • Java编程通过list接口实现数据的增删改查代码示例

    List接口常用的实现ArrayList. 常用方法:add(Object obj)  增加一个元素                      add(int index,Object obj) 在指定索引位置添加元素                      remove(int index) 删除指定位置的元素                      remove(Objiect)  从列表中删除元素                      set(index,Object) 修改指定位

  • jsp+servlet实现最简单的增删改查代码分享

    话不多说,请看代码 package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import ceet.ac.cn.model.Admin; public class A

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • mybatis <foreach>标签动态增删改查方式

    目录 <foreach>标签动态增删改查 mybatis<foreach> 实战 有了建表以及插入,当然少不了删除和更新 mapper.xml中<foreach>标签使用 适用场景 <foreach>标签动态增删改查 mybatis<foreach> 有的时候在项目中需要查询某个列表时,可能会在代码中进行嵌套循环再取值,其实mybatis提供了这么一个标签,可以在SQL中进行循环(是不是很酸爽) 先来了解一下foreach这个标签有哪些元素: i

随机推荐