zoukankan      html  css  js  c++  java
  • mybatis基本用法

    mybatis 架构

    mybatis开发dao的方法:

             1、原始dao开发方法,需要程序员编写dao接口和实现类,此方法在当前企业中还有使用,因为ibatis使用的就是原始dao开发方法。

             2、mapper代理方法,程序员只需要写mapper接口(相当于dao接口),mybatis自动根据mapper接口和mapper接口对应的statement自动生成代理对象(接口实现类对象)。

             开发需要遵循规则:

              1)mapper.xml中namespace是mapper接口的全限定名

              2)mapper.xml中statement的id为mapper接口方法名

              3)mapper.xml中statement的输入映射类型(parameterType)和mapper接口方法输入参数类型一致

              4) mapper.xml中statement的输出映射类型(resultType)和mapper接口方法返回结果类型一致

     传入多个参数的情况

    方案1

    public List<XXXBean> getXXXBeanList(String xxId, String xxCode);  
    
    <select id="getXXXBeanList" resultType="XXBean">
    
      select t.* from tableName where id = #{0} and name = #{1}  
    
    </select>  
    
    由于是多参数那么就不能使用parameterType, 改用#{index}是第几个就用第几个的索引,索引从0开始
    

    方案2(推荐)基于注解

    public List<XXXBean> getXXXBeanList(@Param("id")String id, @Param("code")String code);  
    
    <select id="getXXXBeanList" resultType="XXBean">
    
      select t.* from tableName where id = #{id} and name = #{code}  
    
    </select>  
    
    由于是多参数那么就不能使用parameterType, 这里用@Param来指定哪一个

    三、Map封装多参数:  

    public List<XXXBean> getXXXBeanList(HashMap map);  
    
    <select id="getXXXBeanList" parameterType="hashmap" resultType="XXBean">
    
      select 字段... from XXX where id=#{xxId} code = #{xxCode}  
    
    </select>  
    
    其中hashmap是mybatis自己配置好的直接使用就行。map中key的名字是那个就在#{}使用那个,map如何封装就不用了我说了吧。 

    resultType和resultMap都可以完成输出映射:

             resultType映射要求sql查询的列名和输出映射pojo类型的属性名一致

             resultMap映射时对sql查询的列名和输出映射pojo类型的属性名作一个对应关系。

    动态sql:

             #{}和${}完成输入参数的属性值获取,通过OGNL获取parameterType指定pojo的属性名。

        #{}:占位符号,好处防止sql注入

             ${}:sql拼接符号

    步骤:

      1、编写SqlMapConfig.xml

      2、编写mapper.xml

               定义了statement

      3、编程通过配置文件创建SqlSessionFactory

      4、通过SqlSessionFactory获取SqlSession

      5、通过SqlSession操作数据库

               如果执行添加、更新、删除需要调用SqlSession.commit()

      6、SqlSesion使用完成要关闭

    首先创建dao层接口和相关方法

    package com.dao;
    
    import java.awt.List;
    
    import org.apache.ibatis.annotations.Param;
    
    import com.pojo.User;
    
    public interface IUserDao {
        User getUserById(@Param(value = "id") int id);   //
    
        User getUserByName(String username);
    
        void deleteByid(int id);
    
        void insert(User u);
        java.util.List<User> getUsers();
    }

    其次 在IUserDao.xml 中写相关的方法的实现

    <!-- namespace 表示命名空间 必须和 该mapper对应的接口的全路径 -->
    <mapper namespace="com.dao.IUserDao">
    <?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 表示命名空间 必须和 该mapper对应的接口的全路径 -->
    <mapper namespace="com.dao.IUserDao">
    	<!-- id表示 标号 必须和接口的方法一致 -->
    	<!-- #里面的变量名 必须和方法里面参数一致 -->
    	<!-- resultType 返回类型 必须数据库字段和属性名相同才可以赋值 -->
    	<resultMap type="com.pojo.User" id="uid">
    		<id property="userId" column="user_id" />
    		<!-- 名字不一样必须配置 名字一样 可以不配的  -->
    	</resultMap>
    	<select id="getUserById" resultMap="uid">
    
    		select * from user where
    		user_id =#{id} ;
    	</select>
    	<!-- # id和方法id一样就可以了 但是 $ 最后和@param一起使用 指定名字 -->
    	<select id="getUserByName" resultType="com.pojo.User">
    		select * from user where
    		username =#{username} ;
    	</select>
    	<delete id="deleteByid">
    		delete from user where
    		user_id =#{id}
    
    	</delete>
    	<!-- 如果穿入对象的时候 我们写法 直接写#{该class属性的属性} -->
    	<insert id="insert" parameterType="com.pojo.User" keyProperty="userId"
    		useGeneratedKeys="true">
    		insert into user values(null,#{username},1);
    
    	</insert>
    	
    	
    	<!-- 返回list 跟返回单个是一样的   resultMap-->
    	<select id="getUsers" resultMap="uid">
    
    		select * from user ;
    	</select>
    </mapper>
    

      

    按照上面的架构具体操作如下:

    1   SqlMapConfig.xml的配置  包含两个部分   1mybatis全局配置 ,运行环境   2 mapper.xml(<mapper resource="com/dao/UserMapper.xml" />)

    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    	<settings>
    		<setting name="logImpl" value="STDOUT_LOGGING" />
    		<!-- 全局配置参数 -->
    		<!-- 延迟加载总开关 -->
    		<setting name="lazyLoadingEnabled" value="true" />
    		<!-- 设置按需加载 -->
    		<setting name="aggressiveLazyLoading" value="true" />
    		<!-- 开启二级缓存 -->
    		<setting name="cacheEnabled" value="true" />
    	</settings>
    	<!-- 和spring整合后 environments配置将废除 -->
    	<environments default="development">
    		<environment id="development">
    
    			<transactionManager type="JDBC" />
    
    			<dataSource type="POOLED">
    				<property name="driver" value="com.mysql.jdbc.Driver" />
    				<property name="url" value="jdbc:mysql://localhost:3306/test" />
    				<property name="username" value="root" />
    				<property name="password" value="mysql" />
    			</dataSource>
    		</environment>
    	</environments>
    
    	<!--加載mapper.xml -->
    	<mappers>
    		<mapper resource="com/dao/UserMapper.xml" />
    	</mappers>
    
    </configuration>
    

      2  创建测试类

        注意  :   在执行增加,修改,删除等操作的时候应该要手动提交事务,

            Resources.getResourceAsReader加载文件时  默认在src目录下

    import java.io.Reader;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import com.dao.IUserDao;
    import com.pojo.User;
    
    public class Test1Hello {
    	public static void main(String[] args) throws Exception {
    		// 1加载核心配置文件
    
    		Reader inputStream = org.apache.ibatis.io.Resources.getResourceAsReader("SqlMapConfig.xml");
    		// 2获取Factory
    		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);
    		// 获取session
    		//
    		SqlSession session = sf.openSession();
    		IUserDao userDao = session.getMapper(IUserDao.class);
    		User u = userDao.getUserById(6);
    		System.out.println("==========" + userDao.getUsers());
    		// System.out.println(u.getUsername());
    		// 删除操作 以及插入 需要提交事务
    		// userDao.deleteByid(4);
    		// session.commit();
    		// 插入
    		// User insertUser = new User(1, "cca");
    		// userDao.insert(insertUser);
    		// System.out.println(insertUser.getUserId());
    		// session.commit();
    		// 查询所有的时候
    	}
    }
    

      

    主键返回:

    <!-- 如果穿日入对象的时候 我们写法 直接写#{该class属性的属性} -->
    	<insert id="insert" parameterType="com.pojo.User" keyProperty="userId"
    		useGeneratedKeys="true">
    		insert into user values(null,#{username},1);
    
    </insert>

        #{}

    表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。

    程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。

    #{}接收pojo数据,可以使用OGNL解析出pojo的属性值

        ${}

    表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。

    ${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值

    缺点:不能防止sql注入。

     输入和输出映射[重要]

    通过parameterType完成输入映射,通过resultType和resultMap完成输出映射。

    resultType :指定输出结果的类型(pojo、简单类型、hashmap..),将sql查询结果映射为java对象 。

             使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。

    resultMap:将sql查询结果映射为java对象。

             如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)

    Collection里面的值表示类型,和mapper.java里面的属性无关

    使用foreach遍历list:

    <delete id="deleteByids">

                       delete from user where user_id in (

                       <foreach collection="list" item="item" separator=",">

                                #{item}

                       </foreach>

                       )

             </delete>

         自定义别名

     

         使用别名

    在parameterType、resultType中使用别名:

     

     

     ResultMap的用法

     where  if 用法

  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/MyJavaStudy/p/9267361.html
Copyright © 2011-2022 走看看