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