今天下午在练习使用MyBatis,它的原始Dao的开发方式与Mapper代理开发方式都简单的使用了一下,特以此文记录Mapper代理开发的使用。
数据库使用的是MySql,数据连接池用的DBCP,为了能更好的看到log使用了log4j,使用到的jar包如下:
整体工程的文件结构如下:
由于MyBatis不能使用外部连接池,因此需要自定义一个数据源工厂,我同时将获取sqlSession也写在了DBCPUtil.java中了,其内容如下:
package com.example.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.datasource.DataSourceFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 用于返回DBCP的dataSource(数据源)的工具类
*
* @author wang
*/
public class DBCPUtil implements DataSourceFactory {
private BasicDataSource dataSource = null;
public DBCPUtil() {
dataSource = new BasicDataSource();
}
@Override
public DataSource getDataSource() {
return dataSource;
}
@Override
public void setProperties(Properties ps) {
dataSource.setDriverClassName(ps.getProperty("driver"));
dataSource.setUrl(ps.getProperty("url"));
dataSource.setUsername(ps.getProperty("username"));
dataSource.setPassword(ps.getProperty("password"));
// 是否默认自动提交回滚
dataSource.setDefaultAutoCommit(ps.getProperty("defaultAutoCommit", "0").equals("1"));
dataSource.setInitialSize(Integer.parseInt(ps.getProperty("initialsize", "2")));
dataSource.setMaxActive(Integer.parseInt(ps.getProperty("maxactive", "20")));
dataSource.setMaxIdle(Integer.parseInt(ps.getProperty("maxidle", "0")));
dataSource.setMaxWait(Long.parseLong(ps.getProperty("maxwait", "0")));
}
public static SqlSession getSqlSession() {
String resource = "SqlMapConfig.xml";
try {
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
return factory.openSession();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
需要在配置文件中对自定义的连接池进行配置,如下:
剩下的也就比较简单了,一带而过吧,UserMapper.java如下:
public interface UserMapper {
public void add(User user);
public void delete(Integer id);
public void update(User user);
public User find(Integer id);
}
UserMapper.xml内容如下,修改了自动生成的xml文件:
<mapper namespace="com.example.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="com.example.model.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="nickname" property="nickname" jdbcType="VARCHAR" />
<result column="email" property="email" jdbcType="VARCHAR" />
<result column="phone" property="phone" jdbcType="VARCHAR" />
<result column="city" property="city" jdbcType="VARCHAR" />
<result column="create_date" property="createDate" jdbcType="TIMESTAMP" />
<result column="update_date" property="updateDate" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, username, password, nickname, email, phone, city, create_date, update_date
</sql>
<select id="find" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from t_user
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="delete" parameterType="java.lang.Integer" >
delete from t_user
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="add" parameterType="com.example.model.User" >
insert into t_user (id, username, password,
nickname, email, phone,
city, create_date, update_date)
values (#{id,jdbcType=INTEGER}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
#{nickname,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
#{city,jdbcType=VARCHAR}, #{createDate,jdbcType=TIMESTAMP}, #{updateDate,jdbcType=TIMESTAMP})
</insert>
<update id="update" parameterType="com.example.model.User" >
update t_user
set username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR},
nickname = #{nickname,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR},
phone = #{phone,jdbcType=VARCHAR},
city = #{city,jdbcType=VARCHAR},
create_date = #{createDate,jdbcType=TIMESTAMP},
update_date = #{updateDate,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
最后是使用了Junit进行测试的测试文件,TestMapper.java,其内容如下:
public class TestMapper {
private SqlSession sqlSession = null;
private UserMapper userMapper;
@Before
public void setUp() {
sqlSession = DBCPUtil.getSqlSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void TestFind() {
User user = userMapper.find(6);
System.out.println(user);
}
@Test
public void TestAdd() {
User user = new User();
user.setCity("唐山");
user.setCreateDate(new Date());
user.setEmail("nimen@qq.com");
user.setNickname("你");
user.setPassword("1235690");
user.setUsername("你们好啊");
user.setPhone("12345547533");
user.setUpdateDate(new Date());
userMapper.add(user);
// 需要进行手动提交
sqlSession.commit();
}
@Test
public void TestDelete() {
userMapper.delete(12);
// 需要进行手动提交
sqlSession.commit();
}
@Test
public void TestUpdate() {
User user = new User();
user.setId(2);
user.setCity("唐山");
user.setCreateDate(new Date());
user.setEmail("nimen@qq.com");
user.setNickname("你");
user.setPassword("1235690");
user.setUsername("你们好啊");
user.setPhone("12345547533");
user.setUpdateDate(new Date());
userMapper.update(user);
// 需要进行手动提交
sqlSession.commit();
}
}