Mybatis CRUD 操作
create
1, UserDao接口新增方法void saveUser(User user);
2, 配置文件
<!--insert标签用于插入操作,
parameterType值的是接口方法即id的参数类型 void saveUser(User user),这里是User类型
mybatis规定sql语句的?用#{}占位符替代,填的是实体类的属性名(本质是方法名去掉前面的get set),
如果不是用IDE自动生成的方法,这就意味着可能属性和方法不一致,直接方法名去掉get set即可
-->
<insert id="saveUser" parameterType="com.scott.domain.User">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
3, 测试方法
先把公用代码提取出来
private InputStream is;
private SqlSession session;
private UserDao userDao;
/**
* 注意:并非你写了init方法它就会自动执行,而是看上面的注解
* 而且,这里的Before After注解的方法都要为public才行
* @throws IOException
*/
@Before
public void init() throws IOException {
is = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
session = factory.openSession();
userDao = session.getMapper(UserDao.class);
}
@After
public void destroy() throws IOException {
//提交事务
session.commit();
//释放资源
session.close();
is.close();
}
注意一定要手动提交事物,否则会回滚
/**
* 测试保存用户
* @throws IOException
*/
@Test
public void testSaveUser() throws IOException {
User user = new User();
user.setUsername("山本武大郎");
user.setSex("M");
user.setBirthday(new Date());
user.setAddress("北京三文鱼海鲜市场");
userDao.saveUser(user);
}
补充新增后如何返回新插入记录的id
1, 接口方法不用改
2,配置文件
<insert id="saveUser" parameterType="com.scott.domain.User">
<!--配置插入操作后,获取插入数据的id
keyProperty="id" 实体类的属性名称
keyColumn="id" 对应表的列名
resultType="int" 返回值类型
order="AFTER" 执行顺序
-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
3, 测试
/**
* 测试保存用户并将id封装到实体类中
* @throws IOException
*/
@Test
public void testSaveUser() throws IOException {
User user = new User();
user.setUsername("山本武大郎 测试获取插入后的id");
user.setSex("M");
user.setBirthday(new Date());
user.setAddress("北京三文鱼海鲜市场");
System.out.println("保存操作之前:"+user);
userDao.saveUser(user);
System.out.println("保存操作之后:"+user);
}
delete
1, UserDao接口新增方法void deleteUser(int id);
2, 配置文件
<!--删除用户,
这里的parameterType由于是基础类型所以这里可以填int,INt, INteger, java.lang.Integer 等等
由于是基础类型且只有一个参数,所以占位符里面可以随便写 UId, banannana,XXX 都行
-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{uid}
</delete>
3, 测试
/**
* 测试删除用户
* @throws IOException
*/
@Test
public void testDeleteUser() throws IOException {
userDao.deleteUser(52);
}
update
1, UserDao接口新增方法void updateUser(User user);
2, 配置文件
<!--更新-->
<update id="updateUser" parameterType="com.scott.domain.User">
update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where id = #{id}
</update>
3, 测试
/**
* 测试更新用户
* @throws IOException
*/
@Test
public void testUpdateUser() throws IOException {
User user = new User();
user.setId(52);
user.setUsername("毛利小武郎");
user.setSex("W");
user.setBirthday(new Date());
user.setAddress("北京三文鱼海鲜市场");
userDao.updateUser(user);
}
retrieve
查一般以下方法:
- 根据id查询单个
- 查询所有
- 模糊查询
- 由多个对象组成的条件查询
- 分页查询
- 查询总记录数
1. 根据id查询
1, UserDao接口新增方法User findById(Integer id);
2, 配置文件
<select id="findById" parameterType="java.lang.Integer" resultType="com.scott.domain.User" >
select * from user where id = #{uid}
</select>
3, 测试
/**
* 测试根据id查询用户
* @throws IOException
*/
@Test
public void testFindUserById() throws IOException {
User user = userDao.findById(50);
System.out.println(user);
}
2. 查询所有
1, UserDao接口新增方法List<User> findAll();
2, 配置文件
<!--配置查询所有-->
<!--id不能乱写,是接口的方法名-->
<!--resultType告诉mabatis把结果封装到哪里去-->
<select id="findAll" resultType="com.scott.domain.User">
select * from user
</select>
3, 测试
/**
* test findAll()
*/
@Test
public void testFindAll() throws IOException {
List<User> users = userDao.findAll();
for (User u : users) {
System.out.println(u);
}
}
3. 2种模糊查询方式
1, UserDao接口新增2个方法 List<User> findByName(String username);
List<User> findByName1(String username);
2, 配置文件
<!--模糊查询1-->
<select id="findByName" parameterType="string" resultType="com.scott.domain.User">
select * from user where username like #{username}
</select>
<!--模糊查询2 这里的key必须为value-->
<select id="findByName1" parameterType="string" resultType="com.scott.domain.User" >
select * from user where username like '%${value}%'
</select>
注意:模糊查询中 这里的key必须为value
3, 测试
/**
* 测试更具username模糊查询用户
* @throws IOException
*/
@Test
public void testFindUsersByName() throws IOException {
List<User> users = userDao.findByName("%王%");
for (User u: users) {
System.out.println(u);
}
}
/**
* 测试根据username模糊查询用户
* @throws IOException
*/
@Test
public void testFindUsersByName1() throws IOException {
List<User> users = userDao.findByName1("王");
for (User u: users) {
System.out.println(u);
}
}
4. 查询总记录数
1, UserDao新增方法
//mabatis也支持聚合函数,查询用户总记录数
int findUsers();
2, 配置文件
<select id="findUsers" resultType="int">
select count(id) from user
</select>
3, 测试
/**
* 测试查询有多少用户
* @throws IOException
*/
@Test
public void testFindUsers() throws IOException {
int count = userDao.findUsers();
System.out.println(count);
}
5,由多个对象组成的条件查询
domain包下创建 QueryVo.java
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
1, UserDao新增方法
//把实体类再包装一层,在实际开发中被广泛使用,由多个对象组成一个查询条件来实现数据的查询
List<User> findByQueryVo(QueryVo vo);
2, 配置文件
<!--OGNL表达式会把占位符里面的东西看成是parameterType里的属性,可以看到只有user-->
<select id="findByQueryVo" parameterType="com.scott.domain.QueryVo" resultType="com.scott.domain.User" >
select * from user where username like #{user.username}
</select>
3, 测试
/**
* 测试通过username模糊查询用户
* 把实体类再包装一层,在实际开发中被广泛使用,由多个对象组成一个查询条件来实现数据的查询
* @throws IOException
*/
@Test
public void testFindUsersByVo() throws IOException {
QueryVo vo = new QueryVo();
User u = new User();
u.setUsername("%王%");
vo.setUser(u);
List<User> users = userDao.findByQueryVo(vo);
for (User user: users) {
System.out.println(user);
}
}