1. I just want to show how to setup complete batis project. I’ll be using example from docs. As you can read there you need at least 4 files at least:
- Configuration.xml
- BlogMapper.xml
- BlogBean.java (session bean)
- Blog.java (domain class)
So then you have ready and working object-relational mapping you can easily publish as web service by adding annotation @webservice.
Configuration.xml
<?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>
<typeAlias alias="Blog" type="pl.centertel.tis.soa.adapte.db.smart.domain.Blog"/>
</typeAliases>
<environments default="developement">
<environment id="developement">
<transactionManager type="MANAGED"/>
<dataSource type="JNDI">
<property name="data_source" value="jdbc/__SMART"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="BlogMapper.xml"/>
</mappers>
</configuration>
BlogMapper.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">
<mapper namespace="BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
BlogBean.java (session bean)
@Stateless
@WebService
public class BlogBean implements BlogLocal {
private SqlSessionFactory factory = null;
private static final Logger logger = Logger.getLogger(BlogBean.class.getName());
public BlogBean() {
try {
Reader reader = Resources.getResourceAsReader("Configuration.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(reader);
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
}
}
@WebMethod(operationName = "getBlog")
public String getBlog(@WebParam(name = "id") String id) {
String name = null;
SqlSession session = factory.openSession();
try {
Blog blog = (Blog) session.selectOne("BlogMapper.selectBlog", 101);
name = blog.getName();
} finally {
session.close();
}
return name;
}
}
Blog.java (domain class)
public class Blog {
private String Name;
private int id;
public String getName() {
return Name;
}
public void setName(String Name) {
this.Name = Name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Except those you will need and interface for bean but that will be generated for you by your favorite IDE tool :P
2. What if you want to call an stored oracle procedure returning ie. result set??
- you have to change your mapper.xml
- you have to change domain class for mapping data
- you need to add middle class let’s call it params for catching result set into one variable
New mapper would look like this:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace=BlogMapper">
<resultMap id="rsGetBlog" type="Blog">
<result property="ID" column="ID" />
<result property="USR" column="USR" />
<result property="USR_EMAIL" column="USR_EMAIL" />
</resultMap>
<select id="getBlog" statementType="CALLABLE" parameterType="Params" resultMap="rsGetBlog">
{#{out, jdbcType=CURSOR, mode=OUT, javaType=java.sql.ResultSet,resultMap=rsGetBlog} = call BLOGGING.GETBLOG(#{in})}
</select>
</mapper>
New domain class would look like this: (simple domain .java class with getters and setters)
Params:
public class Params {
private String in;
private Object out;
public String getIn() {
return in;
}
public void setIn(String in) {
this.in = in;
}
public Object getOut() {
return out;
}
public void setOut(Object out) {
this.out = out;
}
@Override
public String toString() {
return "[in="+in+"][out="+out+"]";
}
}
Of course you would need to fix all the imports :) Example bean method could like this:
@WebMethod public List getBlog(@WebParam(name = "id") String name) {
SqlSession session = factory.openSession();
Params params = new Params();
params.setIn(name);
session.selectList("BlogMapper.getBlog", params);
List liBlog= (List) params.getOut();
session.close();
return liBlog;
}