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()+"\tiamge_url="+book.getImageUrl()+"\tauthor="+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基本相同.,这里就不啰嗦了.





转载于:https://www.cnblogs.com/wuyida/p/6300376.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值