目录
1.原始jdbc操作的分析
原始jdbc开发存在的问题如下:
- 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
- sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码
- 查询操作时,需要手动将结果集中的数据手动封装到实体中,插入操作时,需要手动将实体的数据设置到sql语句的占位符位置
应对上述问题给出的解决方案:
- 使用数据库连接池初始化连接资源
- 将sql语句抽取到xml配置文件中
- 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
2.什么是Mybatis
- mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
- mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql的动态参数进行映射生成最终执行的sql语句
- 最后mybatis框架执行sql并将结果映射为java对象并返回,采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。
3.Mybatis开发步骤
- 添加MyBatis坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
</dependencies>
- 创建user数据表
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
`username` varchar(20) DEFAULT NULL,
`PASSWORD` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3
- 编写User实体类
package com.caoyan.domain;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "{" +
" id='" + getId() + "'" +
", username='" + getUsername() + "'" +
", password='" + getPassword() + "'" +
"}";
}
}
- 编写映射文件UserMapper.xml
- 编写核心文件SqlMapConfig.xml
- 编写测试类
4.Mybatis的增删改查操作
4.1插入数据
<!-- 插入操作 -->
<insert id="save" parameterType="com.caoyan.domain.User">
insert into user values(#{id},#{username},#{password})
</insert>
@Test
public void test2() throws IOException {
// 模拟user对象
User user = new User();
user.setUsername("lucy");
user.setPassword("666666");
// 获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql语句 参数:namespace+id
sqlSession.insert("userMapper.save", user);
// mybatis执行更新操作,提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
应注意的问题:
- 插入语句使用insert标签
- 在映射文件中使用parameterType属性指定要插入的数据类型
- Sql语句中使用#{实体属性名}方式引用实体中的属性值
- 插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象)
- 插入操作涉及数据库数据变化,所以要是用sqlSession对象显示的提交事务,即sqlSession.commit()
4.2修改操作
<!-- 修改操作 -->
<update id="update" parameterType="com.caoyan.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
@Test
// 更新操作
public void test3() throws IOException {
// 模拟user对象
User user = new User();
user.setId(5);
user.setUsername("zhaoyun");
user.setPassword("abc");
// 获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql语句 参数:namespace+id
sqlSession.update("userMapper.update", user);
// mybatis执行更新操作,提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
应注意的问题:
- 修改语句使用update标签
- 修改操作使用的API是sqlSession.update("命名空间.id",实体对象)
4.3删除操作
<!-- 删除操作 -->
<delete id="delete" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
@Test
// 删除操作
public void test4() throws IOException {
// 获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql语句 参数:namespace+id
sqlSession.delete("userMapper.delete", 7);
// mybatis执行更新操作,提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
应注意的问题:
- 删除语句使用delete标签
- Sql语句中使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete("命名空间.id",Object)
4.4查询操作
<!-- 查询操作 -->
<select id="findAll" resultType="com.caoyan.domain.User">
select * from user
</select>
@Test
// 查询操作
public void test1() throws IOException {
// 获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql语句
List<User> userList = sqlSession.selectList("userMapper.findAll");
// 打印结果
System.out.println(userList);
// 释放资源
sqlSession.close();
}