文章使用的数据库表仍然为之前测试时使用的user表—数据库表在本文中。
相比于原始dao开发代码重复率高且存在硬编码不利于系统维护,使用Mybatis的代理模式,解决了这些问题,并且不需要再写实现类,但是需要遵循4个开发约束。下面介绍Mybatis的代理模式。
一、代理模式的4条开发约束
- namespace与接口的全限定名保持一致。
- id与接口中的方法名保持一致。
- parameterType与接口中的参数类型保持一致。
- resultType与接口中的方法返回值保持一致。
二、使用代理模式进行增删改查
1.定义接口
该接口包含了增删改查操作。
package com.gql.mapper;
import java.util.List;
import com.gql.pojo.User;
/**
* 类说明:
* 接口
* @guoqianliang1998.
*/
public interface UserMapper {
User getUserById(int id);
List<User> getUserListByName(String name);
void saveUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
2.配置sql语句
该配置包含增删改查操作,与接口一一对应
<?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="com.gql.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="com.gql.pojo.User">
SELECT id,username as name,sex,address,birthday FROM user WHERE id = #{id};
</select>
<insert id="saveUser" parameterType="com.gql.pojo.User">
<selectKey keyProperty="id" order="AFTER" resultType="int">
select last_insert_ID();
</selectKey>
insert into user
(username,sex,address,birthday)
values(#{name},#{sex},#{address},#{birthday});
</insert>
<select id="getUserListByName" parameterType="java.lang.String" resultType="com.gql.pojo.User">
SELECT id,
username as name,
sex,
address,
birthday
FROM user
WHERE username like '%${value}%';
</select>
<update id="updateUser" parameterType="com.gql.pojo.User">
UPDATE user SET
username=#{name},
sex=#{sex},
address=#{address},
birthday=#{birthday}
WHERE id=#{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id};
</delete>
</mapper>
3.全局配置
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="Hudie" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
4.使用Mybatis测试增删改查
package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
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.Before;
import org.junit.Test;
import com.gql.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void testGetUserById(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
System.out.println(user.getName());
}
@Test
public void testSaveUser(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setName("蔡小坤");
userMapper.saveUser(user);
session.commit();
}
@Test
public void testGetUserListByName(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserListByName("小");
System.out.println(userList.size());
}
@Test
public void testUpdateUser(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setName("钟南山");
user.setAddress("上海");
user.setSex("男");
user.setId(9);
user.setBirthday(new Date());
userMapper.updateUser(user);
session.commit();
}
@Test
public void testDeleteUser(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
userMapper.deleteUser(6);
session.commit();
}
}
分别运行对上述单元测试,均能正确执行操作,最后的数据库如下: