• mybatis ---- 实现数据的增删改查


    前面介绍了接口方式的编程,需要注意的是:在book.xml文件中,<mapper namespace="com.mybatis.dao.IBookDao"> ,命名空间namespace,必须要与我们定义的package和接口一致,否则就会出错。这一章主要基于接口的编程完成如下事情.

    用mybatis查询数据

    上一章,已经介绍了查询数据(一行数据),这里我们主要看查询出列表的. 查询出列表,也就是返回List,在我们这个例子中也就是List<Book>, 这种方式返回数据,需要在book.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的.  注意:resultMap 不仅仅可以查询列表,也可以查询单个数据对象. 它也是解决列名不匹配的一种方式.
    废话不多少,我直接把改动的代码文件贴出来:
    IBookDao.java
    package com.mybatis.dao;
    
    import java.util.List;
    import com.mybatis.model.Book;
    
    public interface IBookDao {
    	//这里的selectBookById必须和book.xml 配置的select id 对应
    	 public Book selectBookById(int id);
    	 
    	 //查询列表
         public List<Book>	selectAll();
         
    }
    

    book.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">
        
    <!--这块等于Dao接口的实现 namespace必须和接口的类路径一样-->
    <mapper namespace="com.mybatis.dao.IBookDao">
    
     <resultMap type="Book" id="resultListBook">
         <id property="id" column="id"/> 
         <result property="imageUrl" column="image_url"/>
         <result property="name" column="book_name"/>
         <result property="author" column="author"/>
         <result property="description" column="description"/>
     </resultMap>
     
      <!-- queryEmpById必须和接口中的方法名一样, 返回一个Emp 就是刚才的别名 ,如果不用别名要连路径一起写,麻烦-->
      <!-- 这里我省略了参数类型,parameterType,主要是为了配合我数据库里的数据(只有两条嘛) -->
         <select id="selectAll" resultMap="resultListBook">
              select id, image_url,book_name, author,description from books 
         </select>
    </mapper>

    Test.java
    package com.mybatis.test;
    
    import java.io.IOException;
    import java.util.List;
    
    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 com.mybatis.dao.IBookDao;
    import com.mybatis.model.Book;
    
    public class Test {
    
    	/***
    	 * 获得MyBatis SqlSessionFactory
    	 * SqlSessionFactory 负责创建SqlSession ,一旦创建成功,就可以用SqlSession实例来执行映射语句
    	 * ,commit,rollback,close等方法
    	 * @return
    	 */
    	private static SqlSessionFactory getSessionFactory(){
    		SqlSessionFactory sessionFactory=null;
    		String resource="configuration.xml";
    		 try {
    			sessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return sessionFactory;
    	}
    	
    	/**
    	 * main 方法
    	 * @param args
    	 */
    	public static void main(String[] args) {
              SqlSession session=getSessionFactory().openSession();
              //获得IBookDao 接口实例
              IBookDao bookDao=(IBookDao) session.getMapper(IBookDao.class);
               List<Book> listBook=bookDao.selectAll();
               for(Book book :listBook){
            	   System.out.println("id="+book.getId()+"	iamge_url="+book.getImageUrl()+"	author="+book.getAuthor());
               }
    	}
    }
    
    运行Test.java如下:
    id=1	iamge_url=resources/images/english.jpg	author=孙悟空
    id=2	iamge_url=resources/images/english.jpg	author=刘诗诗
    

    mybatis实现数据的增加

    insert 语句会涉及到主键的问题。首先,如果你的数据库支持自动生成主键的字段(比如MySQL和SQL  Server),那么你可以设置useGeneratedKeys="true",而且设置keyProperty到你已经做好的目标属性上。例如,我们的表books已经对id使用了自动生成的列类型,那么语句就可以变为:
        <insert id="insertBook" parameterType="Book" useGeneratedKeys="true" keyProperty="id">
                insert into books(image_url,book_name,author,description)
                values(#{imageUrl},#{name},#{author},#{description})     
         </insert>

    MyBatis有另外一种方法来处理数据库不支持自动生成类型,或者JDBC驱动不支持自动生成主键时的主键生成问题。这里有一个简单的示例,使用Oralce的一个序列。
         <insert id="insertBook2" parameterType="Book">
              <selectKey keyProperty="id" resultType="int" order="BEFORE">
              <!--emppkempno是一个 oracle的序列-->
                  select emppkempno.nextval from dual;   
              </selectKey>
                <insert id="insertBook" parameterType="Book" useGeneratedKeys="true" keyProperty="id">
    	            insert into books(id,image_url,book_name,author,description)
    	            values(#{id},#{imageUrl},#{name},#{author},#{description})     
         </insert>
    在上面的示例中,selectKey元素将会首先运行,Book的id会被设置,然后插入语句会被调用。

    废话不多少,来看下MySQL的insert 用法:

    book.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">
        
    <!--这块等于Dao接口的实现 namespace必须和接口的类路径一样-->
    <mapper namespace="com.mybatis.dao.IBookDao">
    
     <resultMap type="Book" id="resultListBook">
         <id property="id" column="id"/> 
         <result property="imageUrl" column="image_url"/>
         <result property="name" column="book_name"/>
         <result property="author" column="author"/>
         <result property="description" column="description"/>
     </resultMap>
     
      <!-- queryEmpById必须和接口中的方法名一样, 返回一个Emp 就是刚才的别名 ,如果不用别名要连路径一起写,麻烦-->
      <!-- 这里我省略了参数类型,parameterType,主要是为了配合我数据库里的数据(只有两条嘛) -->
         <select id="selectAll" resultMap="resultListBook">
              select id, image_url,book_name, author,description from books 
         </select>
         
         <insert id="insertBook" parameterType="Book" useGeneratedKeys="true" keyProperty="id" >
                insert into books(image_url,book_name,author,description)
                values(#{imageUrl},#{name},#{author},#{description})     
         </insert>
    </mapper>
    

    IBookDao.java
    package com.mybatis.dao;
    
    import java.util.List;
    import com.mybatis.model.Book;
    
    public interface IBookDao {
    	//这里的selectBookById必须和book.xml 配置的select id 对应
    	 public Book selectBookById(int id);
    	 
    	 //查询列表
         public List<Book>	selectAll();
         
         //插入数据对象Book
         public void  insertBook(Book book);
    }
    

    Test.java  ,如果不session.commit().,数据不会进入到数据库中.
    package com.mybatis.test;
    
    import java.io.IOException;
    import java.util.List;
    
    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 com.mybatis.dao.IBookDao;
    import com.mybatis.model.Book;
    
    public class Test {
    
    	/***
    	 * 获得MyBatis SqlSessionFactory
    	 * SqlSessionFactory 负责创建SqlSession ,一旦创建成功,就可以用SqlSession实例来执行映射语句
    	 * ,commit,rollback,close等方法
    	 * @return
    	 */
    	private static SqlSessionFactory getSessionFactory(){
    		SqlSessionFactory sessionFactory=null;
    		String resource="configuration.xml";
    		 try {
    			sessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return sessionFactory;
    	}
    	
    	/**
    	 * main 方法
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		
    	    Book book=new Book();
            book.setAuthor("安徒生");
            book.setName("卖火柴的小女孩");
            book.setDescription("好好学习,天天向上吧");
            book.setImageUrl("resources/images/gg.jpg");
            
              SqlSession session=getSessionFactory().openSession();
              //获得IBookDao 接口实例
         try {
    			     IBookDao bookDao=(IBookDao) session.getMapper(IBookDao.class);
              //测试增加
              bookDao.insertBook(book);
              session.commit();
              System.out.println(book.getId());
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		finally{
    			session.close();
    		}
    	}
    }

    至于Update 和Delete ,与Insert 、update基本相同.,这里就不啰嗦了.





  • 相关阅读:
    判断鼠标点击在div外时,更改背景图片
    CSS--border边框颜色渐变
    实验一:Java开发环境的熟悉
    实验楼第四次试验报告
    实验楼第三次试验报告
    实验楼第二次试验报告
    实验楼第一次试验报告
    c++程序设计中的函数重载
    C++中,new/delete和malloc/free的区别
    继承和多态二:虚析构函数
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300376.html
Copyright © 2020-2023  润新知