对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM解决的主要问题是对象和关系的映射。它通常将一个类和一张表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据。
让软件开发人员专注于业务逻辑的处理,提高了开发效率。
Mybatis是一个优秀的半自动的ORM框架,它对JDBC操作数据库的过程进行封装,原来我们使用JDBC去操作数据库时,需要手动的写代码去注册驱动、获取connection、获取statement等硬编码的方式去实现与数据库的交互,现在Mybaits帮助我们把这些事情做了,使我们只需要关注我们的业务sql即可,能大大提高我们的开发效率。
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.6version>
<scope>runtimescope>
dependency>
dependencies>
@Data
@AllArgsConstructor // 全参构造函数
@NoArgsConstructor // 无参构造函数
public class User {
private Long id;
private Integer age;
private String username;
}
public interface UserDao {
//查询所有用户
public List<User> findAll() throws Exception;
//根据条件进行用户查询
public User findByCondition(User user) throws Exception;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
// namespace 必须是对应UserDao的路径
<mapper namespace = "com.my.dao.UserDao">
<select id="findAll" resultType="com.my.pojo.User" parameterType="com.my.pojo.User">
select * from user
select>
<select id="findByCondition" resultType="com.my.pojo.User" parameterType="com.my.pojo.User">
select * from user where id = #{id} and username = #{username}
select>
mapper>
DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties">properties>
<typeAliases>
<package name="com.my.pojo"/>
typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
dataSource>
environment>
environments>
<mappers>
<package name="com.my.dao"/>
mappers>
configuration>
/**
* 通过手动提交并定义statement的方法去调用查询
* @throws IOException
*/
@Test
public void test1() throws IOException {
//1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
//2.解析了配置文件,并创建了sqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//3.生产sqlSession
// 默认开启一个事务,但是该事务不会自动提交,在进行增删改操作时,要手动提交事务
// 注:openSession(true) 传入true即为开启自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.sqlSession调用方法:查询所有selectList 查询单个:selectOne 添加:insert 修改:update 删除:delete
List<User> users = sqlSession.selectList("com.my.dao.IUserDao.findAll");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void test6() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserDao mapper = sqlSession.getMapper(IUserDao.class);
User user1 = new User();
user1.setId(4);
user1.setUsername("lucy");
List<User> all = mapper.findByCondition(user1);
for (User user : all) {
System.out.println(user);
}
}