首先回顾一下第一个mybatis程序,这里我们通过分析可以发现,对于第一个mybatis程序中编写的文件,我们可以复用,在后面的编写中,我们只需要修改dao包下的文件,及其对应的测试文件的代码,其他的代码都不用动
这篇博客用于记录怎么使用mybatis对数据库进行CRUD
固定使用步骤
- 编写DAO接口:和原来写JDBC代码的时候一样,使用面向接口编程的思想
- 编写对应mapper.xml文件中的操作节点+节点参数+sql语句
- 测试:测试中我们需要注意,CRUD中,除了查询不需要提交事务之外,其他的都需要提交事务
1、select
选择,即查询语句
-
id属性:对应namespace中对应的Dao接口中的方法名称
-
resultType:SQL语句执行的返回值类型
-
parameterType: id属性对应的方法的参数类型
使用固定步骤
①编写DAO接口package com.thhh.dao; import com.thhh.pojo.User; import java.util.List; //在mybatis中,我们一般不写dao,而将其改写为mapper,其实二者是一样的,只是名字变了 public interface UserDao { //1、查询所有用户 List<User> getUserList(); }
②编写对应mapper.xml文件中的操作节点+节点参数+sql语句
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--mapper节点,mapper 映射器--> <mapper namespace="com.thhh.dao.UserDao"><!--属性namespace,即命名空间,用于绑定一个 mapper/dao 接口--> <!--select:查询语句--> <!--查询所有的用户信息--> <select id="getUserList" resultType="com.thhh.pojo.User"> select * from mybatis.user </select> </mapper>
③测试
package com.thhh; import com.thhh.dao.UserDao; import com.thhh.pojo.User; import com.thhh.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class UserDaoTest { @Test public void test1(){ //1、获取SqlSession对象 SqlSession sqlSession = MyBatisUtils.getSqlSession(); //2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器 UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); }
2、insert
使用步骤都是固定的
//2、通过ID查询用户
User getUserById(int id);
<!--插入一条数据-->
<insert id="insertUser" parameterType="com.thhh.pojo.User">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})
</insert>
注意:这里由于使用的是修改操作,所以需要提交事务,且我们不用像在JDBC中一样去手动的开启事务
@Test
public void test3(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
int result = mapper.insertUser(new User(4, "赵六", "123"));
System.out.println("数据库受影响的行数"+result);
sqlSession.commit();
sqlSession.close();
}
3、update
4、delete
完整的DAO代码
package com.thhh.dao;
import com.thhh.pojo.User;
import java.util.List;
//在mybatis中,我们一般不写dao,而将其改写为mapper,其实二者是一样的,只是名字变了
public interface UserDao {
//1、查询所有用户
List<User> getUserList();
//2、通过ID查询用户
User getUserById(int id);
//3、插入一个新用户
int insertUser(User user);
//4、修改用户信息
int updateUser(User user);
//5、删除用户信息
int deleteUser(int id);
}
完整的mapper.xml代码
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper节点,mapper 映射器-->
<mapper namespace="com.thhh.dao.UserDao"><!--属性namespace,即命名空间,用于绑定一个 mapper/dao 接口-->
<!--select:查询语句-->
<!--查询所有的用户信息-->
<select id="getUserList" resultType="com.thhh.pojo.User">
select * from mybatis.user
</select>
<!--通过id查询指定的用户信息-->
<select id="getUserById" resultType="com.thhh.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>
<!--插入一条数据-->
<insert id="insertUser" parameterType="com.thhh.pojo.User">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})
</insert>
<!--修改一条数据-->
<update id="updateUser" parameterType="com.thhh.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id}
</delete>
</mapper>
完整的测试代码
package com.thhh;
import com.thhh.dao.UserDao;
import com.thhh.pojo.User;
import com.thhh.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test1(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void test2(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = mapper.getUserById(2);
System.out.println(user);
sqlSession.close();
}
@Test
public void test3(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
int result = mapper.insertUser(new User(4, "赵六", "123"));
System.out.println("数据库受影响的行数"+result);
sqlSession.commit();
sqlSession.close();
}
@Test
public void test4(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
int result = mapper.updateUser(new User(2, "李四2", "123"));
System.out.println("数据库受影响的行数"+result);
sqlSession.commit();
sqlSession.close();
}
@Test
public void test5(){
//1、获取SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//2、获取执行SQL的对象,获取的方法就是通过sqlSession.getMapper(),去获取User.class的mapper映射器
UserDao mapper = sqlSession.getMapper(UserDao.class);
int result = mapper.deleteUser(4);
System.out.println("数据库受影响的行数"+result);
sqlSession.commit();
sqlSession.close();
}
}
小结
- 使用MyBatis实现JDBC的CRUD功能确实很简单,对于数据库中的一张表总共就只需要编写3个文件 —— Dao/Mapper接口定义文件、这个接口对应的Mapper.xml文件和测试Dao/Mapper接口功能的文件,其他的文件在"第一个mybatis程序"中已经写过了,不用再修改,这里直接使用即可
这其实也就对应了上面我们总结的实现CRUD的3步:设计DAO/Mapper接口、实现Mapper接口和测试
- UserMapper/UserDao与其对应的UserMapper.xml文件通过mapper节点的namespace属性进行关联,而UserMapper.xml和mybatis核心配置文件通过mapper节点的resources属性进行关联;注意:namespace中填写的必须是对应的UserMapper的全路径,而我们在MyBatis中注册Mapper.xml的时候如果使用的是resource属性对Mapper.xml文件进行注册,才是写的Mapper的"/"全路径(全路径:包名+类名)
- 在Mapper.xml文件中,我们如果要使用参数列表中的属性,直接通过"#{属性名称即可使用}",而对于参数列表传递的是一个对象的引用时,直接在#{ }中写上对象的属性名称即可使用,不用加上传过来的引用
- 对于MyBatis实现的CRUD中,除了查询功能不需要我们手动提交事务之外,其他3个修改操作我们都需要在sqlSession对象关闭的前一句提交事务,否则数据将不会持久化到数据库中