Mybatis——基于注解的CRUD
程序员文章站
2022-07-12 22:31:04
...
注意:使用了注解,Resource下的com.itheima.dao 不能存在IUserDao.xml 否则报错!!!二者不能共存。
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@ResultMap:实现引用@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用
IUserDao
package com.itheima.dao;
import com.itheima.domain.QueryVo;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*
* 用户的持久层接口
*/
public interface IUserDao {
/**
* 查询所有操作
* @return
*/
@Select("select * from user")
List<User> findAll();
/**
* 保存用户
*/
@Insert("insert into user(username,sex,birthday,address)values(#{username},#{sex},#{birthday},#{address})")
@SelectKey(keyColumn="id",keyProperty="id",resultType=Integer.class,before =
false, statement = { "select last_insert_id()" })
int saveUser(User user);
/**
* 更新用户
* @param user
*/
// @Update("update user (username=#{username},address=#{address},sex=#{sex},birthday=#{birthday})where id = #{id}")
@Update("update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id =#{id} ")
void updateUser(User user);
/**
* 根据Id删除用户
* @param userId
*/
@Delete("delete from user where id = #{uid}")
void deleteUser(Integer userId);
/**
* 根据id查询用户信息
* @param userId
* @return
*/
@Select("select * from user where id = #{uid}")
User findById(Integer userId);
/**
* 根据名称模糊查询用户信息
* @param username
* @return
*/
@Select("select * from user where username like #{username}")
List<User> findByName(String username);
/**
* 查询总用户数
* @return
*/
@Select("select count(*) from user")
int findTotal();
/**
* 根据queryVo中的条件查询用户
* @param vo
* @return
*/
@Select("select * from user where username like #{user.username}")
List<User> findUserByVo(QueryVo vo);
}
SqlMapConfig.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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<!-- <mapper resource="com/itheima/dao/IUserDao.xml"/> 基于xml-->
<!-- 配置 dao 接口的位置,它有两种方式
第一种:使用 mapper 标签配置 class 属性
第二种:使用 package 标签,直接指定 dao 接口所在的包
-->
<!-- <mapper class="comitheima.dao.IUserDao"/>-->
<package name="com.itheima.dao"/><!--某一个包下所有接口-->
</mappers>
</configuration>
Test
package com.itheima.test;
import com.itheima.dao.IUserDao;
import com.itheima.domain.QueryVo;
import com.itheima.domain.User;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @author 黑马程序员
* @Company http://www.ithiema.com
*
* 测试Mybatis的CRUD操作(基于注解)
*/
public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 测试查询所有
*/
@Test
public void testFindAll(){
//5.执行查询所有方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
/**
* 测试保存操作
*/
@Test
public void testSave(){
User user = new User();
user.setUsername("mybatis annotation testSave");
user.setAddress("深圳市市福田区");
user.setSex("女");
user.setBirthday(new Date());
int res = userDao.saveUser(user);
System.out.println("影响数据库记录的行数:"+res);
System.out.println("插入的主键值:"+user.getId());
/* System.out.println("保存操作之前:"+user);
//5.执行保存方法
userDao.saveUser(user);
System.out.println("保存操作之后:"+user);*/
}
/**
* 测试更新操作
*/
@Test
public void testUpdate(){
User user = new User();
user.setId(50);
user.setUsername("mybastis update user");
user.setAddress("华强北");
user.setSex("女");
user.setBirthday(new Date());
//5.执行保存方法
userDao.updateUser(user);
}
/**
* 测试删除操作
*/
@Test
public void testDelete(){
//5.执行删除方法
userDao.deleteUser(48);
}
/**
* 测试根据id查找一个操作
*/
@Test
public void testFindOne(){
//5.执行查询一个方法
User user = userDao.findById(42);
System.out.println(user);
}
/**
* 测试模糊查询操作
*/
@Test
public void testFindByName(){
//5.执行模糊查询方法
/*select * from user where username like #{name}
预处理PrepatedStatement的参数占位符 :select *from user where username like ? 执行效率更高 开发常用*/
List<User> users = userDao.findByName("%王%");
// Statement对象的字符串拼接sql : select * from user where username like %王% :效率慢
// List<User> users = userDao.findByName("王");
for(User user : users){
System.out.println(user);
}
}
/**
* 测试查询总记录条数
*/
@Test
public void testFindTotal(){
int count = userDao.findTotal();
System.out.println(count);
}
/**
* 测试使用QueryVo作为查询条件 使用POJO实体类的包装对象(可以包含多个实体类的信息条件)作为查询条件,用于连表查询
*/
@Test
public void testFindByVo(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUsername("%王%");
vo.setUser(user);
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
}
上一篇: 理解与配置Android studio中的gradle
下一篇: Mybatis的CRUD(非注解)
推荐阅读
-
MyBatis中XML和注解的对比及使用
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
浅谈基于SpringBoot实现一个简单的权限控制注解
-
Mybatis注解和配置文件命名规范所引发的问题
-
荐 MyBatis基于注解的开发
-
mybatis基于注解实现增删改查(详细介绍)
-
基于mybatis中
标签的作用说明 -
Python基于列表list实现的CRUD操作功能示例
-
基于MVC5中的Model层开发数据注解
-
Struts2基于注解的Action配置