MyBatis的Mapper代理开发方式的简单使用

本文介绍使用MyBatis的Mapper代理方式进行数据库操作的方法,包括配置数据源、编写Mapper接口及XML映射文件,并通过JUnit测试验证增删改查功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天下午在练习使用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();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值