1.原始jdbc操作
(1)查询数据
(2)插入数据
2.原始jdbc操作的分析
原始jdbc开发存在的问题如下:
(1)数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
(2)sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码
(3)查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置
应对上述问题给出的解决方案:
(1)使用数据库连接池初始化连接资源
(2)将sql语句抽取到xml配置文件中
(3)使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
3.什么是MyBatis?
(1)mybatis 是一个优秀的基于java的持久层框架, 它内部封装了 jdbc,使开发者只需要关注sq|语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
(2)mybatis通过xm|或主解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sq|语句
(3)最后mybatis框架执行sql拼将结果映射为java对象并返回。 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作
(1)添加MyBaits的坐标
(2)创建user数据表
(3)编写User实体类
(4)编写映射文件UserMapper.xml
(5)编写核心文件SqlMapConfig.xml
(5)编写测试类
代码示例:
//(1)在pom.xml中添加MyBaits的坐标
mysql
mysql-connector-java
5.1.3
org.mybatis
mybatis
3.4.6
junit
junit
4.12
test
log4j
log4j
1.2.17
代码示例:
//(3)编写User实体类
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + ''' +
", password='" + password + ''' +
'}';
}
}
代码示例: //4)编写映射文件UserMapper.xml//表示通过sql语句查询的结果封装到user对象中 select * from user
代码示例: //(5)编写核心文件SqlMapConfig.xml
代码示例:
//(5)编写测试类
//MyBatisTest.java
public class MyBatisTest {
@Test
//查询操作
public void test1() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作,参数:namespace+id
List userList = sqlSession.selectList("userMapper.findAll");
//测试,打印数据
System.out.println(userList);
//释放资源
sqlSession.close();
}
}
测试截图:
数据库中的数据可以正常查询
1.MyBatis的插入数据操作
代码示例:
//UserMapper.xml
insert into user values(#{id},#{username},#{password})
代码示例:
MyBatisTest.java
@Test
//插入操作
public void test2() throws IOException {
//模拟user对象
User user = new User();
user.setUsername("小G");
user.setPassword("abc");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作,参数:namespace+id
sqlSession.insert("userMapper.save",user);
//mybaits默认的事务是不提交的!!!如果执行更新操作,需要最终提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
测试截图:
数据成功插入!
插入操作的注意点
- 插入语句使用insert标签
- 在映射文件中使用parameterType属性指定要插入的数据类型
- Sql语句中使用#{实体属性名}方式引用实体中的属性值
- 插入操作设计数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()
2.MyBatis的修改数据操作
代码示例:
//UserMapper.xml
update user set username=#{username},password=#{password} where id=#{id}
代码示例:
//MyBatisTest.java
@Test
//修改操作
public void test3() throws IOException {
//模拟user对象
User user = new User();
user.setId(5);
user.setUsername("小e");
user.setPassword("abc");
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作,参数:namespace+id
sqlSession.update("userMapper.update",user);
//mybaits默认的事务是不提交的!!!如果执行更新操作,需要最终提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
测试截图:
修改操作注意问题
- 修改语句使用update标签
- 修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象)
- 插入操作设计数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()
3.MyBatis的删除数据操作
代码示例:
//UserMapper.xml
delete from user where id=#{id}
代码示例:
//MyBatisTest.java
@Test
//删除操作
public void test4() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作,参数:namespace+id
sqlSession.delete("userMapper.delete",0);
//mybaits默认的事务是不提交的!!!如果执行更新操作,需要最终提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
测试截图:
删除操作注意的问题
- 删除语句使用delete标签
- Sql语句中使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object)



