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

来源:互联网 发布:java 判断奇偶 编辑:程序博客网 时间:2024/06/12 01:04

前面介绍了接口方式的编程,需要注意的是:在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=1iamge_url=resources/images/english.jpgauthor=孙悟空id=2iamge_url=resources/images/english.jpgauthor=刘诗诗

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基本相同.,这里就不啰嗦了.





0 0
原创粉丝点击