Mybatis-Dao开发详解
文章目录
1 Dao需求
1.1 根据用户ID查询用户信息
1.2 根据用户名查找用户列表
1.3 添加用户
2 原始Dao开发方法
2.1使用原有的user映射文件user.xml,不需修改(接上文Mybatis入门详解中,从中复制即可)
2.2 新建一个UserDao接口
package com.lpp.mybatis.dao;
import com.lpp.mybatis.pojo.User;
import java.util.List;
public interface UserDao {
//
/**
* @Description: 根据用户ID查询用户信息
* @Param: ID
* @return:
* @Author: LPP
* @Date:2020/2/16
*/
User getUserById(Integer id);
/**
* @Description: 根据用户名查找用户列表
* @Param:username
* @return:
* @Author: LPP
* @Date:2020/2/16
*/
List<User> getUserByUserName(String username);
/**
* @Description:添加用户
* @Param:
* @return:
* @Author: LPP
* @Date:2020/2/16
*/
void insertUser(User user);
}
2.3 新建一个UserDaoImpl接口实现类
package com.lpp.mybatis.dao.impl;
import com.lpp.mybatis.dao.UserDao;
import com.lpp.mybatis.pojo.User;
import com.lpp.mybatis.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession= SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user=sqlSession.selectOne("User.getUserById",id);
sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String username) {
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> list=sqlSession.selectList("getUserByUserName",username);
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
sqlSession.insert("User.insertUser",user);
sqlSession.close();
}
}
2.4 使用dao测试
打开UserDao,光标放到UserDao上,Ctrl+shift+T出现如下图点击第二个
我们把测试放到com.lpp.mybatis.test包下,下面三个全选,OK即可
UserDaoTest.java
package com.lpp.mybatis.test;
import com.lpp.mybatis.dao.UserDao;
import com.lpp.mybatis.dao.impl.UserDaoImpl;
import com.lpp.mybatis.pojo.User;
import java.util.Date;
import java.util.List;
class UserDaoTest {
@org.junit.jupiter.api.Test
void getUserById() {
UserDao userDao=new UserDaoImpl();
User user=userDao.getUserById(33);
System.out.println(user);
}
@org.junit.jupiter.api.Test
void getUserByUserName() {
UserDao userDao=new UserDaoImpl();
List<User> list=userDao.getUserByUserName("%张%");
for(User user : list){
System.out.println(user.toString());
}
}
@org.junit.jupiter.api.Test
void insertUser() {
UserDao userDao=new UserDaoImpl();
User user=new User();
user.setUsername("魏无羡");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("上海");
userDao.insertUser(user);
}
}
测试一下第一个功能:根据用户ID查询用户信息
结果如下:
3 接口动态管理
3.1动态代理dao开发规则
1.namespace命名必须是接口的全路径名
2.接口的方法名必须与映射文件的sql id一致
3.接口的输入参数必须与映射文件的parameterType类型一致
4.接口的返回类型必须与映射文件的resultType类型一致
3.2动态代理dao开发步骤
1.创建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语句,后面有重要作用
-->
<!--动态代理的开发规则:
1、namespace必须是全路径名
2、接口的方法必须与sql id一致
3、接口的参数与parameterType一致
4、接口的返回值必须与resultType一致-->
<mapper namespace="com.lpp.mybatis.mapper.UserMapper">
<select id="getUserById" parameterType="int" resultType="uSER">
SELECT id,username,birthday,sex,address FROM user where id=#{id};
</select>
<!--如果返回结果为集合:只需设置为每一个的数据类型-->
<select id="getUserByUserName" parameterType="String" resultType="com.lpp.mybatis.pojo.User">
SELECT id,username,birthday,sex,address FROM user WHERE username LIKE #{name};
</select>
<!-- 插入用户-->
<!-- useGeneratedKeys:使用自增,keyProperty与之配套使用,这里是user的主键-->
<insert id="insertUser" parameterType="com.lpp.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
</insert>
<!--更新用户-->
<update id="updateUser" parameterType="com.lpp.mybatis.pojo.User">
update user set username =#{username} where id=#{id};
</update>
<!-- 删除用户-->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
2.创建UserMapper接口
package com.lpp.mybatis.mapper;
import com.lpp.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
//
/**
* @Description: 根据用户ID查询用户信息
* @Param: ID
* @return:
* @Author: LPP
* @Date:2020/2/16
*/
User getUserById(Integer id);
/**
* @Description: 根据用户名查找用户列表
* @Param:username
* @return:
* @Author: LPP
* @Date:
*/
List<User> getUserByUserName(String username);
/**
* @Description:添加用户
* @Param:
* @return:
* @Author: LPP
* @Date:
*/
void insertUser(User user);
}
3.加载UserMapper.xml两种方法,在SqlMapConfig.xml中添加
方法1:如下图
<mappers>
<mapper resource="user.xml"/>
<mapper resource="UserMapper.xml"/>
</mappers>
方法2:
<!-- 加载映射文件-->
<mappers>
<!--映射文件包扫描:推荐
1.接口文件必须和映射文件同一目录下
2.接口文件名称必须和映射文件名称一致-->
<package name="com.lpp.mybatis.mapper"/>
</mappers>
SqlMapConfig.xml内容(Mybatis入门详解中也有,这里再写一遍)
<?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>
<!--环境配置-->
<!-- 加载规则,首先加载标签内部属性,再加载外部文件,名称相同时,会替换相同名称的内容 -->
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
//这里是新添加的
<typeAliases>
<!-- 单个定义别名,不区分大小写-->
<!-- <typeAlias type="User" alias="user"/>-->
<!-- 别名包扫描器,别名是类的全称,不区分大小写,推荐方式-->
<package name="com.lpp.mybatis.pojo"/>
</typeAliases>
<!--默认环境-->
<environments default="development">
<!--mysql环境-->
<environment id="development">
<!--JDBC事务-->
<!-- 使用JDBC管理事务-->
<transactionManager type="JDBC"/>
<!--POOLED连接池-->
<!--数据库连接池 -->
<dataSource type="POOLED">
<!--四大参数-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_01?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="user.xml"/>
<!--<mapper resource="UserMapper.xml"/>-->
<!-- 映射文件,class扫描器
1.接口文件必须和映射文件同一目录下
2.接口文件名必须和映射文件的名称一致-->
<!--<mapper class="UserMapper"/>-->
<!--映射文件包扫描:推荐
1.接口文件必须和映射文件同一目录下
2.接口文件名称必须和映射文件名称一致-->
<package name="com.lpp.mybatis.mapper"/>
</mappers>
</configuration>
3.3 测试动态代理dao(操作方法同上测试方法)
UserMapperTest中代码
package com.lpp.mybatis.test;
import com.lpp.mybatis.mapper.UserMapper;
import com.lpp.mybatis.pojo.User;
import com.lpp.mybatis.utils.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import java.util.Date;
import java.util.List;
class UserMapperTest {
@Test
void getUserById() {
SqlSession sqlSession= SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
//获取接口的代理实现类
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUserById(24);
System.out.println(user);
sqlSession.close();
}
@Test
void getUserByUserName() {
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<User> list=userMapper.getUserByUserName("%魏%");
for(User user:list){
System.out.println(user);
}
sqlSession.close();
}
@Test
void insertUser() {
SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=new User();
user.setUsername("蓝忘机");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("浙江");
userMapper.insertUser(user);
sqlSession.close();
}
}
我这里测试一下第三个功能:
测试成功!