一.原始Dao开发
原始Dao开发,我们需要些dao接口和dao的实现类,向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。
public class UserDaoImpl implements UserDao {
// 需要向dao实现类中注入SqlSessionFactory
// 这里通过构造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
// 释放资源
sqlSession.close();
return user;
}
上述代码中的
User user = sqlSession.selectOne("test.findUserById", id);
1.sqlSession方法,将statement的id硬编码
2.sqlSession方法id应该是int,但是当传入String类型的时候,因为该方法使用泛型,编译阶段不会出错,不利于开发
二.mapper代理开发
我们编写mapper.xml映射文件,mybatis可以自动生成mapper接口实现类代理对象。但是mapper代理的实现,需要遵循以下4个开发规则1、在mapper.xml中namespace等于mapper接口地址
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代码方法开发,namespace要等于mapper接口地址 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
mapper.java接口方法
//根据id查询用户
public User findUserById(int id) throws Exception;
mapper.xml中statement的id
<select id="findUserById" parameterType="int"
resultType="cn.itcast.mybatis.po.User">
select * from USER where id = #{id}
</select>
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
在规则2的代码中可以看出
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
同规则2的代码
完整代码
Usermapper接口
package cn.itcast.mybatis.mapper;
import java.util.List;
import cn.itcast.mybatis.po.User;
/**
* UserMapper 2016年9月21日18:00:30
* mapper接口,相当于dao接口
* @author fxq
*
*/
public interface UserMapper {
//根据id查询用户
public User findUserById(int id) throws Exception;
//查询多条记录
public List<User> findUserByName(String name) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;
}
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">
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代码方法开发,namespace有特殊重要的作用 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
<!-- 在映射文件中配置很多sql语句 -->
<!-- 需求:通过id查询用户表的记录 -->
<!-- 通过select执行数据库的查询 -->
<!-- id:标识映射文件中的sql -->
<!-- 将sql语句封装到mappedStatement对象中,所以将id成为statement 的id -->
<select id="findUserById" parameterType="int"
resultType="cn.itcast.mybatis.po.User">
select * from USER where id = #{id}
</select>
<!-- 自定义条件查询用户列表 -->
<!-- resultType:指定就是单条记录所映射的java对象类型 -->
<select id="findUserByName" parameterType="java.lang.String"
resultType="cn.itcast.mybatis.po.User">
select * from USER where username like '%${value}%'
</select>
<!-- 添加用户 parameterType:指定输入参数类型是pojo(包括:用户信息) #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值; -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT
LAST_INSERT_ID()
</selectKey>
insert into USER (id,username,birthday,sex,address)
values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 删除 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from USER WHERE id
= #{id}
</delete>
<!-- 更新 -->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update USER set username =
#{username},birthday=#{birthday},sex=#{sex},address=#{address} where
id = #{id}
</update>
</mapper>
测试类
package cn.itcast.mybatis.mapper;
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;
import org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.po.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception{
//创建sqlSessionFactory
String resource= "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象;
<strong>UserMapper userMapper=sqlSession.getMapper(UserMapper.class);</strong>
User user = userMapper.findUserById(1);
System.out.println(user);
}
}
三.总结
mapper代理开发遵循一定的开发规范,减少了错误的概率,提高了开发效率。同时对于数据类型的控制,从原始Dao的运行阶段到了mapper代理的编译阶段,更利于开发。