前面介绍了接口方式的编程,需要注意的是:在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基本相同.,这里就不啰嗦了.






mybatis ---- 实现数据的增删改查的更多相关文章

  1. Mybatis实现数据的增删改查

    Mybatis实现数据的增删改查 1.项目结构(使用maven创建项目) 2.App.java package com.GetcharZp.MyBatisStudy; import java.io.I ...

  2. Mybatis实现数据的增删改查(CRUD)

    什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBat ...

  3. 转!!!Mybatis实现数据的增删改查(CRUD)

    什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBat ...

  4. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  5. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

  6. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  7. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  8. MVC模式:实现数据库中数据的增删改查功能

    *.数据库连接池c3p0,连接mysql数据库: *.Jquery使用,删除时跳出框,确定是否要删除: *.使用EL和JSTL,简化在jsp页面中插入的java语言 1.连接数据库 (1)导入连接数据 ...

  9. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...

随机推荐

  1. 对LCS算法及其变种的初步研究

    LCS的全称为Longest Common Subsequence,用于查找两个字符串中的最大公共子序列,这里需要注意区分子序列与子串,所谓子序列,指的是从前到后,可以跳跃元素筛选,而字串则必须连续筛 ...

  2. Servlet中的跳转(redirect和forward)

    Forward是通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法来实现的 ...

  3. Android开发学习之路--RxAndroid之简单原理

      学习了RxAndroid,其实也就是RxJava了,但是还是不是非常清楚到底RxAndroid有什么用呢?为什么要使用RxAndroid呢?这篇文章讲得不错,RxJava的原理.但是这里还是把整个 ...

  4. Cocos2d-x 添加iOS7默认分享/AirDrop

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=530 下午添加分享的时候,看着这 ...

  5. 03-Git常用命令演示、冲突演示

    Git常用命令演示 Git的的思想其实和SVN还是蛮像的,可以参考之前svn文章一起加深了解. 新建一个user2目录,clone下代码. 修改readme.txt git status 可以看到re ...

  6. 【一天一道LeetCode】#117. Populating Next Right Pointers in Each Node II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...

  7. android dataBinding详解

    官方介绍地址:http://developer.android.com/intl/zh-cn/tools/data-binding/guide.html 2015 Google IO 大会带来的 Da ...

  8. OJ题:计算各个数的位数之和

    题目描述: 输入一个大于0的数,要求各个位数的和. 例如: 输入12345 那么输出15 程序如下: ) ; }

  9. 小强的HTML5移动开发之路(14)——Video标签详解

    来自:http://blog.csdn.net/dawanganban/article/details/18180605 在前面的小强的HTML5移动开发之路(5)--制作一个漂亮的视频播放器中制作了 ...

  10. Java解析XML与生成XML文件

    XML是eXtensible Markup Language(可扩展标记语言)的简写形式,它是一种元标记语言(meta-markup language),也就是说它没有一套能够适用于各个领域中所有用户 ...