开篇
上篇文章我们已经讲了 Mybatis 的入门以及简单的对单表进行增删改查,那么今天我们就来讲一下使用 mybatis 开发dao的两种方式以及 mysql 比较厉害的动态 sql。
利用 mybatis 开发 DAO
1. 原始的方式开发DAO
主要完成功能
-
根据用户 id 查询用户信息
-
根据用户姓名查询用户列表
-
插入用户
-
新建一个接口 User1Dao.java 和一个实现类 User1DaoImpl.java,并在 User1Dao 中添加如下方法
User1Dao.java
public interface UserDao {
//根据用户id 查询用户
User findUserById(Integer id);
//根据用户名称查询用户列表
List<User> findUserByName(String name);
//插入用户
void insertUser(User user);
}
- 在实现类中实现如下方法
User1DaoImpl.java
public class User1DaoImpl implements UserDao{
private static SqlSessionFactory factory;
static {
String resource = "SqlMapConfig.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public User findUserById(Integer id) {
SqlSession session = factory.openSession();
User user= session.selectOne("test.findUserById", id);
return user;
}
@Override
public List<User> findUserByName(String name) {
SqlSession session = factory.openSession();
List<User> userList = session.selectList("test.findUserByName", name);
return userList;
}
@Override
public void insertUser(User user) {
SqlSession session = factory.openSession();
session.insert("test.insertUser", user);
session.commit();
}
}
注意
只有查询方法不用提交事务,其他的,比如增加,删除,更新等操作都要执行 session.close() 方法。
- 新建测试类 TestDao1.java
public class TestDao1 {
@Test
public void testFindUserById(){
System.out.println(new User1DaoImpl().findUserById(6));
}
@Test
public void testFindUserByName(){
List<User> userList = new User1DaoImpl().findUserByName("二");
for (User user :
userList) {
System.out.println(user);
}
}
@Test
public void testInsertUser(){
User user = new User();
user.setName("李二牛");
user.setAddress("湖北武汉");
user.setSex("1");
new User1DaoImpl().insertUser(user);
}
}
以上的结果就非常简单了,在这里我就不贴图了,相信小伙伴们都可以看得明白。这就是原生的 Dao 的开发方式,实际上还是有点麻烦的。这里省略了 service 层,这种原生的开发方式我们只要知道怎么写就可以了,在实际工作中我们并不会使用这种方式来开发。
2.使用 Mapper 的动态代理的方式开发 DAO
Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口),由 mybatis 框架家根据接口定义创建接口的动态代理对象, 代理对象的方式同上边 Dao 接口实现类方法。这种方式简单的多,但是有一定的规则。具体规则如下:
Mapper.xml 文件中的 namespace 于 mapper 接口的类路径相同。
Mapper 接口方法名和 Mapper.xml 中定义的每个 Statement 的 id 相同。
Mapper 接口方法点的输入参数类型和 Mapper.xml 中定义的每个 sql 的 parameterType 的类型相同。
Mapper 接口方法的输出参数类型和 Mapper.xml 中定义的每个 sql 的 resultType 的类型相同。
有了上面的规则,我们就开始编写 Mapper.xml 映射文件
Mapper.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="com.student.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="user">
select * from user where uid = #{uid}
</select>
<select id="findUserByName" parameterType="string" resultType="user">
select * from user where name LIKE '%${value}%'
</select>
<delete id="deleteUserById" parameterType="int">
delete from user where uid = #{uid}
</delete>
<insert id="insertUser" parameterType="user">
<selectKey keyProperty="uid" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(name, sex, address) values (#{name}, #{sex}, #{address});
</insert>
<update id="updateUserById" parameterType="user">
update user set name = #{name} where uid = #{id};
</update>
</mapper>
注意:namespace 要改成 UserMapper 这个接口的全路径。
UserMapper.java
public interface UserMapper {
User findUserById(Integer id);
List<User> findUserByName(String name);
void insertUser(User user);
}
切记:需要在 SqlMapConfig.xml 中引入 UserMapper.xml 文件,否则会报错。
<!--批量引入mapper文件 -->
<package name="com.student.mybatis.mapper"/>
测试类 TestMapper.java
public class TestMapper {
private SqlSessionFactory factory;
@Before
public void setUP() throws Exception{
String resources = "SqlMapConfig.xml";
InputStream inputStrea