Mybatis实现 CRUD 操作相关
基于前一个入门项目传送门
- 在IUserdao接口中添加方法
public interface IUserDao {
/**
* 查找所有方法
* @return
*/
List<User> findAll();
/**
* 通过id查找用户
* @param id
* @return
*/
User findUserById(Integer id);
/**
* 保存用户操作
* @param user
*/
void saveUser(User user);
/**
* 修改用户操作
* @param user
*/
void updateUser(User user);
/**
* 删除用户
* @param id
*/
void deleteUser(Integer id);
}
- 在IUserDao.xml中添加数据库代码
注意:
resultType 属性:
用于指定结果集的类型。
parameterType 属性:
用于指定传入参数的类型。
sql 语句中使用#{}字符:
它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。 具体的数据是由#{}里面的内容决定的。
parameterType 属性:
代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
<?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">
<mapper namespace="com.ymz.dao.IUserDao">
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.ymz.entity.User">
select * from user;
</select>
<!--通过Id查找用户操作-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.ymz.entity.User">
select * from user where id = #{id}
</select>
<!--保存用户操作-->
<insert id="saveUser" parameterType="com.ymz.entity.User">
insert into user(username,birthday,sex,address) values(#{username},
#{birthday},#{sex},#{address});
</insert>
<!--更新用户操作-->
<update id="updateUser" parameterType="com.ymz.entity.User">
update user set username=#{username},birthday=#{birthday},
sex=#{sex},address=#{address} where id = #{id}
</update>
<!--删除用户操作-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
</mapper>
- 创建测试类
注意:session.commit();使用来实现事务提交。
public class MybatisTest {
private InputStream is;
private SqlSession session;
private SqlSessionFactory build;
private IUserDao userDao;
@Before
public void init() throws IOException {
// 1. 获取配置文件
is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 创建SqlSessionFactory对象
build = new SqlSessionFactoryBuilder().build(is);
// 3. 使用构建者创建工厂对象SqlSession
session = build.openSession();
// 4. 使用对象SqlSession创建dao接口的代理对象
userDao = session.getMapper(IUserDao.class);
}
@After
public void close(){
session.commit();
// 6. 释放资源
try {
session.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void findAll(){
// 查询所有用户方法
List<User> users = userDao.findAll();
for(User user:users){
System.out.println(user);
}
}
@Test
public void saveUser(){
User user = new User();
user.setUsername("柳飘飘");
user.setSex("女");
user.setBirthday(new Date());
user.setAddress("北京市朝阳区");
userDao.saveUser(user);
}
@Test
public void updateUser(){
User user = userDao.findUserById(50);
user.setAddress("湖北省武汉市");
userDao.updateUser(user);
}
@Test
public void deleteUser(){
userDao.deleteUser(52);
}
}
Mybatis 与 JDBC 编程的比较
1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:
在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
解决:
将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。
解决:
Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的
类型。
4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对
象解析比较方便。
解决:
Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的
类型。