ORM -对象/关系数据库映射
ORM全称Object/Relation Mapping:表示对象-关系映射的缩写。ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,程序员既可以利用面向对象程序设计语言的简单易用性,又可以利用关系数据库的技术优势。ORM把关系数据库包装成面向对
象的模型。ORM框架是面向对象设计语言与关系数据库发展不同步时的中间解决方案。采用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的放松来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象的保存、修改、删除 等操作,转换为对数据库的操作。
Mybatis简介
MyBatis是一款优秀的基于ORM的半自动轻量级持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO (Plain Old Java Objects,普通老式Java对 象)为数据库中的记录。
mybatis 简介
Mybatis是一个半自动化的持久层框架,对开发人员开说,核心sql还是需要自己进行优化,sql和java编码进行分离,功能边界清晰,一个专注业务,一个专注数据。
mybatis 开发
开发步骤
①添加MyBatis的坐标
使用maven来构建项目,需要将坐标导入到pom.xml文件中。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
除了添加Mybatis坐标,还需要添加mysql驱动坐标,这个是对数据库进行驱动的,根据自己的数据库类型进行添加。我这主要是链接mysql数据库。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
②创建user数据表
create table t_user (
id INT not null primary key,
username VARCHAR(42),
userpassword varchar(42)
);
③编写User实体类
public class User {
private int id;
private String username;
private String userpassword;
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 getUserpassword() {
return userpassword;
}
public void setUserpassword(String userpassword) {
this.userpassword = userpassword;
}
}
④编写映射文件UserMapper.xml
<?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="user">
<select id="findAll" resultType="com.th.User">
select * from t_user
</select>
</mapper>
⑤编写核心文件SqlMapConfig.xml
<!--根标签-->
<configuration>
<!-- 方式一:直接写配置环境-->
<!--环境配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://115.183.28.98:4343/tanghuan_test?characterEncoding=UTF-8"/>
<property name="username" value="wanwan"/>
<property name="password" value="wanwan1234"/>
</dataSource>
</environment>
</environments>
<!--方式二: 提取jdbc为外部配置文件,方便修改的方式,生产环境推荐此方式-->
<!-- 引入外部配置文件 Property是子标签-->
<properties resource="database.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
database.properties 文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://115.183.28.98:4343/tanghuan_test?characterEncoding=UTF-8
user=root
password=Hope@2018
⑥编写测试类
public class MybatisTest {
@Test
public void findAll() throws IOException {
//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession 对象
SqlSession sqlSession =sqlSessionFactory.openSession();
//执行sql语句
List<User> userList =sqlSession.selectList("user.findAll");
//打印结果
System.out.println(userList);
//释放资源
sqlSession.close();
}
}
注意点:
- 执行sql的时候,需要写mapper的namespace; 格式为namespace.id
2.mapper需要在mybatis的主配置文件中配置
- mapper文件中的执行sql中用的是表名,不是实体
插入数据
① 编写UserMapper映射文件
<insert id="addUser" parameterType="com.th.User">
insert into t_user (id,username,userpassword) values (#{id},#{username},#{userpassword})
</insert>
② 编写插入实体User的代码
public void addUser() throws IOException {
//加载核心配置文件
InputStream resourceAsStream=Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSession工厂对象
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
//获取sqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
User user = new User();
user.setUsername("王洪明");
user.setUserpassword("test1234");
int insertResult =sqlSession.insert("user.addUser",user);
//事务提交
sqlSession.commit();
//释放资源
sqlSession.close();
}
结果:
③ 插入操作注意问题
-
插入语句使用insert标签
-
在映射文件中使用parameterType属性指定要插入的数据类型
-
Sql语句中使用#{实体属性名}方式引用实体中的属性值
-
插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象);
-
插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()
mybatis的修改操作
① 编写UserMapper映射文件
<update id="updateUser" parameterType="com.th.User">
update t_user set username=#{username},userpassword=#{userpassword}where id =#{id};
</update>
② 编写修改实体User的代码
@Test
public void updateUser() throws IOException {
//加载配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//加载sqlsessionFactroy对象
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(resourceAsStream);
//加载sqlSession对象
SqlSession sqlSession =sqlSessionFactory.openSession();
User user =new User();
user.setUsername("豆豆");
user.setUserpassword("qwe123");
user.setId(1);
int updateResut = sqlSession.update("user.updateUser",user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
结果:
修改操作注意问题:
- 修改语句使用update标签
- 修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);
删除操作
① 编写UserMapper映射文件
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from t_user where id=#{id}
</delete>
② 编写删除实体User的代码
@Test
public void deleteUser() throws IOException {
//加载外部资源
InputStream resoureAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resoureAsStream);
//获取SqlSession对象
SqlSession sqlSession =sqlSessionFactory.openSession();
User user = new User();
user.setId(1);
int deleteResult = sqlSession.delete("user.deleteUser",user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
}
删除操作注意问题
- 删除语句使用delete标签
- Sql语句中使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object);