- 首先,在xml配置文件中的标签内注册mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.ss.model"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<!-- 1.一致性 2.隔离性 3.持久性 4.原子性 -->
<transactionManager type="JDBC"/>
<dataSource type="com.ss.datasource.C3P0DataSource"/>
</environment>
</environments>
<mappers >
<mapper resource="com/ss/mapper/BookMapper.xml"/>
<mapper class="com.ss.mapper.BookMapper2"/>
</mappers>
</configuration>
注意:xml格式的mapper和java格式的mapper的注册方式不同
- 创建sqlProvider类,拼接sql语句并返回出去
package com.ss.mapper;
package com.ss.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.jdbc.SQL;
import com.ss.model.Book;
public class BookSqlProvider {
public String search(Map<String,Object> param){
final Book book = (Book)param.get("book");
String string = new SQL(){
{
SELECT("book_id,book_name,book_author,book_price,publish_date,book_kind,total_store,total_sold,book_pic,book_profile,book_status");
FROM("t_book");
if(book.getBookId() != null) WHERE("book_id=#{book.bookId}");
if(book.getBookKind() != null) WHERE("book_kind=#{book.bookKind");
}
}.toString();
System.out.println(string+"********************");
return string;
}
public String update(Map<String,Object> param){
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++");
final Book book = (Book)param.get("book");
String string = new SQL(){
{
UPDATE("t_book");
if(book.getBookName() != null) SET("book_name = #{book.bookName}");
if(book.getBookId() != null) SET("book_id = #{book.bookId}");
if(book.getBookAuthor() != null) SET("book_author = #{book.bookAuthor}");
if(book.getBookPrice() != null) SET("book_price = #{book.bookPrice}");
if(book.getPublishDate() != null) SET("publish_date = #{book.publishDate}");
WHERE("primary_id=#{book.id}");
}
}.toString();
return string;
}
}
注意:返回的String 为拼接后的sql语句:
SELECT book_id,book_name,book_author,book_price,publish_date,book_kind,total_store,total_sold,book_pic,book_profile,book_status
FROM t_book
WHERE (book_id=#{book.bookId})
- 声明mapper接口,在mapper接口中将方法与provider中的方法绑定
package com.ss.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import com.ss.model.Book;
public interface BookMapper2 {
@SelectProvider(method="search",type=BookSqlProvider.class)
public List<Book> search(@Param("book")Book book);
@UpdateProvider(method="update",type=BookSqlProvider.class)
public void update(@Param("book")Book book);
}
- 在dao层用sqlSession调用接口的方法
package com.ss.dao;
import java.io.IOException;
import java.util.ArrayList;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.ss.mapper.BookMapper2;
import com.ss.model.Book;
public class BookDao {
SqlSessionFactory sqlSessionFactory = null;
SqlSession session = null;
@Before
public void before(){
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("sqlConfig.xml"));
session = sqlSessionFactory.openSession(true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void dynamicSearch(){
Book book = new Book();
book.setBookId(123L);
List<Book> books = session.getMapper(BookMapper2.class).search(book);
System.out.println(books.size());
}
@Test
public void dynamicUpdate(){
Book book = new Book();
book.setBookAuthor("修改作者");
book.setId(10029L);
session.getMapper(BookMapper2.class).update(book);
}
@After
public void after(){
session.close();
}
}
结果:
日志中打印的查询结果:
数据库中修改后的结果
最后注意传参的方式: