前面介绍了接口方式的编程,需要注意的是:在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. iOS 南京互联网大会分享及个人见解 韩俊强的博客

    首先分两大块: 1.如何打造高效/稳定的App (重点): 2.软件自动化测试: 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 每日更新关注:http://we ...

  2. UNIX网络编程——客户/服务器程序设计示范(五)

        TCP预先派生子进程服务器程序,传递描述符 对预先派生子进程服务器程序的最后一个修改版本是只让父进程调用accept,然后把所接受的已连接套接字"传递"给某个子进程.这么做 ...

  3. iOS中 扫描二维码/生成二维码详解 韩俊强的博客

    最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: se ...

  4. 03 SeekBar 音频播放拖拽进度条

    八,  SeekBar  音频播放拖拽进度条       >                 android:progress="40"   第一进度         and ...

  5. 如何在Cocos2D 1.0 中掩饰一个精灵(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...

  6. Web开发的发展史

    英文出处:arunr.欢迎加入翻译小组. 导读:Arunr 把过去 15 年以来,Web开发从最初的纯 HTML 到 CGI.PHP\JSP\ASP.Ajax.Rails.NodeJS 这个过程简要地 ...

  7. Socket编程实践(13) --UNIX域协议

    UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答 ...

  8. 《java入门第一季》之网络编程初探

    由于在写有关javaweb的博客,在写到web服务器的时候需要回顾网络编程的知识,提前把网络编程放在前面写. 直接上代码解释: import java.net.InetAddress; import ...

  9. Android使用SimpleAdapter

    SimpleAdapter的使用步骤如下: 声明ListView,并进行初始化操作 准备数据集,一般用list来实现,当然也可以使用数组 为listview适配simpleadapter 如下代码: ...

  10. C语言--字符串和数字的相互转换

    1.数字转换为字符串 sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出. sprintf 是个变参函数,定义如下: int sp ...