版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35537301/article/details/82223921
DAO开发方式
使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法
原始DAO开发
映射文件
<?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:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="test">
<select id="selectUserById" parameterType="Integer" resultType="com.itheima.pojo.User">
select * from user where id = #{id}
</select>
<!-- 根据用户名称模糊查询用户信息 -->
<select id="selectUserByUsername" parameterType="String" resultType="com.itheima.pojo.User">
select * from user where username like "%"#{username}"%"
</select>
<!-- 添加用户信息-->
<insert id="saveUser" parameterType="com.itheima.pojo.User">
<selectKey keyColumn="id" keyProperty="id" order="AFTER"
resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 修改用户信息 -->
<update id="updateUserById" parameterType="com.itheima.pojo.User">
update user set username = #{username} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="Integer">
delete from user where id=#{id}
</delete>
</mapper>
接口
package com.itheima.dao;
import java.util.List;
import com.itheima.pojo.User;
public interface UserDao {
/**
* @MethodName:selectUserById
* @Description:
* @param id
* @return
*/
public User queryUserById(Integer id);
/**
* @MethodName:selectUserByUsername
* @Description:
* @param username
* @return
*/
public List<User> queryUserByUsername(String username);
/**
* @MethodName:saveUser
* @Description:
* @param user
*/
public void addUser(User user);
}
实现类
package com.itheima.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.itheima.dao.UserDao;
import com.itheima.pojo.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User queryUserById(Integer id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.selectUserById", 27);
sqlSession.close();
return user;
}
@Override
public List<User> queryUserByUsername(String username) {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list = sqlSession.selectList("test.selectUserByUsername", "小");
sqlSession.close();
return list;
}
@Override
public void addUser(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.saveUser", user);
sqlSession.close();
}
}
测试类
package com.itheima.test;
import static org.junit.Assert.*;
import java.io.InputStream;
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.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
import com.itheima.pojo.User;
public class UserDaoTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void selectUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
// 执行查询
User user = userDao.queryUserById(27);
System.err.println(user);
}
@Test
public void selectUserByUsername() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
// 执行查询
List<User> list = userDao.queryUserByUsername("小");
for (User user : list) {
System.err.println(user);
}
}
}
Mapper动态代理的规范
- Mapper.xml文件中的namespace与mapper接口的类路径相同。
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
案例
UserMapper.java
package com.itheima.mapper;
import java.util.List;
import com.itheima.pojo.User;
public interface UserMapper {
/**
* @MethodName:selectUserById
* @Description:
* @param id
* @return
*/
public User selectUserById(Integer id);
/**
* @MethodName:selectUserByUsername
* @Description:
* @param name
* @return
*/
public List<User> selectUserByUsername(String name);
/**
* @MethodName:saveUser
* @Description:
* @param user
*/
public void saveUser(User user);
}
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:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="selectUserById" parameterType="Integer" resultType="com.itheima.pojo.User">
select * from user where id = #{id}
</select>
<!-- 根据用户名称模糊查询用户信息 -->
<select id="selectUserByUsername" parameterType="String" resultType="com.itheima.pojo.User">
select * from user where username like "%"#{username}"%"
</select>
<!-- 添加用户信息-->
<insert id="saveUser" parameterType="com.itheima.pojo.User">
<!-- selectKey 标签实现主键返回 -->
<!-- keyColumn:主键对应的表中的哪一列 -->
<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
<!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->
<!-- resultType:设置返回的id的类型 -->
<selectKey keyColumn="id" keyProperty="id" order="AFTER"
resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
测试类
package com.itheima.test;
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.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
String resource = "SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void selectOne() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.err.println(user);
}
@Test
public void select() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.selectUserByUsername("小");
for (User user : list) {
System.err.println(user);
}
}
@Test
public void save() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("阿杰");
user.setSex("1");
user.setBirthday(new Date());
user.setAddress("北京");
mapper.saveUser(user);
}
}
总结
selectOne和selectList
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。
namespace
mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性