mybatis mapper介绍
使用 mybatis mapper 好处:
使用 mapper 接口的方式,不用写接口实现类,直接完成数据库操作,简单方便。使用 mapper 接口,采用的是面向接口编程的思想。
mybatis mapper 的应用举例
定义实体类:User.java
public class User {
private int id;
private String name;
private int age;
}
定义 mapper 接口:UserMapper.java
public interface UserMapper {
void add(User user);
void del(int id);
void update(User user);
User getUser(int id);
}
mapper 接口定义有以下特点:
Mapper 接口方法名和 UserMapper.xml 中定义的每个 sql 的 id 同名。
Mapper 接口方法的输入参数类型和 UserMapper.xml 中定义的 sql 的parameterType 类型相同。
Mapper 接口的返回类型和 UserMapper.xml 中定义的 sql 的 resultType 类型相同
定义 sql 映射文件:userMappers.xml
需要注意的是:xml文件的namespace要写成mapper接口的路径,像下面:
<mapper namespace="cn.mybatis.mapper.UserMapper">
下面是完整的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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
<mapper namespace="cn.mybatis.mapper.UserMapper">
<!-- 添加数据 -->
<insert id="add" parameterType="cn.mybatis.beans.User">
insert into t_user(name,age) value(#{name},#{age})
</insert>
<!-- 删除数据 -->
<delete id="del" parameterType="int">
delete from t_user where id = #{id}
</delete>
<!-- 修改数据 -->
<update id="update" parameterType="cn.mybatis.beans.User">
update t_user set name=#{name},age=#{age} where id=#{id}
</update>
<!--根据id查询得到一个user对象-->
<select id="getUser" parameterType="int" resultType="cn.mybatis.beans.User">
select * from t_user where id=#{id}
</select>
</mapper>
定义mybatis的配置文件:conf.xml
这里需要配置两个东西
- 配置JDBC的连接
- 配置mapper.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>
<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="root" />
</dataSource>
</environment>
</environments>
<!-- 注册userMapper.xml文件 -->
<mappers>
<mapper resource="cn/mybatis/mapping/userMappers.xml"/>
</mappers>
</configuration>
工具类:SqlSessionUtil.java
主要目的是要拿到sqlSession,因为之后每次操作数据库都需要写一遍,所以进行一次封装。
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionUtil {
public static SqlSession getSqlSession() throws Exception{
String resource = "config.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = Resources.getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建能执行映射文件中sql的sqlSession
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession;
}
}
测试类:MyTest.java
这是测试类,通过上面的工具类sqlSession,最关键的是下面这句
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
MyBatis通过动态代理的方式实现mapper接口,然后执行接口中定义好的方法就可以了。
注意:不要忘了sqlSession.commit()和sqlSession.close().否则在执行过程中虽然不会报错,但是数据库中是不会有变化的.
下面的例子只执行了添加的功能:
import org.apache.ibatis.session.SqlSession;
import cn.mybatis.beans.User;
import cn.mybatis.mapper.UserMapper;
import cn.mybatis.util.SqlSessionUtil;
public class MyTest {
public static void main(String[] args) throws Exception {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
userMapper.add(user);
sqlSession.commit();
sqlSession.close();
}
}