简单运用orm框架mybatis
mybatis 全中文注释版源码
前言
ORM全称Object/Relation Mapping:表示对象-关系映射的缩写 ORM完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,程序员既可以利用面向 对象程序设计语言的简单易用性,又可以利用关系数据库的技术优势。ORM把关系数据库包装成面向对 象的模型。ORM框架是面向对象设计语言与关系数据库发展不同步时的中间解决方案。采用ORM框架 后,应用程序不再直接访问底层数据库,而是以面向对象的放松来操作持久化对象,而ORM框架则将这 些面向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象的保存、修改、删除 等 操作,转换为对数据库的操作。常见的orm框架主要有半自动的mybatis和全自动的hibernate。hibernate因为是全自动的,学习成本较高,并且sql自动生成,因此sql调优比较麻烦和复杂,而半自动的mybatis因其学习成本较低,容易理解能自定义sql,因此本文主要介绍mysql的由来和实现流程与原理。
一、mybatis是什么?
Mybatis是一个优秀的半自动的ORM框架,它对JDBC操作数据库的过程进行封装,原来我们使用JDBC去操作数据库时,需要手动的写代码去注册驱动、获取connection、获取statement等硬编码的方式去实现与数据库的交互,现在Mybaits帮助我们把这些事情做了,使我们只需要关注我们的业务sql即可,能大大提高我们的开发效率。
二、怎么用?
1.在maven中导入mybatis相关依赖
<!--引入依赖-->
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.在mysql数据库中创建user表并插入数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`age` int(0) NULL DEFAULT NULL,
`id` bigint(0) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('李四', 3, 2);
INSERT INTO `user` VALUES ('王五', NULL, 3);
INSERT INTO `user` VALUES (NULL, 10, 4);
INSERT INTO `user` VALUES ('在找车', 1, 5);
INSERT INTO `user` VALUES ('张三风', 100, 9);
SET FOREIGN_KEY_CHECKS = 1;
3.创建实体类user
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private Integer age;
private String username;
}
4.创建user的mapper接口类 UserDao
public interface UserDao {
//查询所有用户
public List<User> findAll() throws Exception;
//根据条件进行用户查询
public User findByCondition(User user) throws Exception;
int update(User user) throws Exception;
int insert(User user) throws Exception;
int delete(User user) throws Exception;
}
5.创建user的xml UserMapper.xml文件
@Data
@AllArgsConstructor
@NoArgsConstructor
// namespace 必须是对应UserDao的路径
<mapper namespace = "com.my.dao.UserDao">
<!--通过条件查询数据 id是UserDao中的方法 在底层会生成对应关系 namespace.id=UserDao.方法 在调用的时候通过对应关系找到 mappedSattement对象 拿出sql语句和需要赋值的属性进行sql参数填入 然后提交mysql执行-->
<select id="findByCondition" resultType="com.my.pojo.User" parameterType="com.my.pojo.User">
select * from user where id = #{id} and username = #{username}
</select>
<!--查询所有数据-->
<select id="findAll" resultType="com.my.pojo.User" parameterType="com.my.pojo.User">
select * from user
</select>
<!--插入新数据-->
<insert id="insert" resultType="int" parameterType="com.my.pojo.User">
insert into user (username,age) values( #{username},#{age})
</insert>
<!--修改数据-->
<update id="update" resultType="long" parameterType="com.my.pojo.User">
update user set age=#{age} where id = #{id}
</update>
<!--删除数据-->
<delete id="delete" resultType="long" parameterType="com.my.pojo.User">
delete from user where id = #{id}
</delete>
</mapper>
6.编写配置文件sqlMapConfig配置mybatis的一些核心信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--加载外部的properties文件--数据库的配置信息-->
<properties resource="jdbc.properties"></properties>
<!--给实体类的全限定类名给别名-->
<typeAliases>
<!--给单独的实体起别名-->
<!-- <typeAlias type="com.my.pojo.User" alias="user"></typeAlias>-->
<!--批量起别名(推荐):该包下所有的类的本身的类名:别名还不区分大小写 比如user类 在返回值获取参数时直接可以些user不需要再写类的全路径-->
<package name="com.my.pojo"/>
</typeAliases>
<!--environments:运行环境-->
<environments default="development">
<environment id="development">
<!--当前事务交由JDBC进行管理-->
<transactionManager type="JDBC"></transactionManager>
<!--当前使用mybatis提供的连接池-->
<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>
<!-- 单个文件进行配置 -->
<!-- <mapper resource="UserMapper.xml"></mapper>-->
<!-- 直接配置需要扫描的包(推荐)底层解析时会根据包的全路径找到对应那mamespace的xml 根据方法找到 id与方法相同的进行关系映射 -->
<package name="com.my.dao"/>
</mappers>
</configuration>
7.调用
sqlSessionFactory.openSessio默认是手动提交事务,如果设置为true则会改为自动提交,sqlSession.getMappe通过动态代理方式去执行对应的方法
/**
* 通过手动提交并定义statement的方法去调用查询
* @throws IOException
*/
@Test
public void test1() throws IOException {
//1.Resources工具类,配置文件的加载,把配置文件加载成字节输入流
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//2.解析了配置文件,并创建了sqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//3.生产sqlSession
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();
}
/**
* 通过自动提交并定义statement的方法去调用新增
* @throws IOException
*/
@Test
public void test2() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);//事务自动提交
User user = new User();
user.setId(6);
user.setUsername("tom");
sqlSession.insert("com.my.dao.IUserDao.insert",user);
sqlSession.close();
}
/**
* 修改
* @throws IOException
*/
@Test
public void test3() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(4);
user.setUsername("lucy");
sqlSession.update("com.my.dao.IUserDao.update",user);
sqlSession.commit();
sqlSession.close();
}
/**
* 删除
* @throws IOException
*/
@Test
public void test4() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("com.my.dao.IUserDao.delete",6);
sqlSession.commit();
sqlSession.close();
}
/**
* 通过代理方式
* @throws IOException
*/
@Test
public void test5() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
IUserDao mapper = sqlSession.getMapper(IUserDao.class);
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
}
@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);
}
}
}
总结
单纯使用mysql的步骤
①添加MyBatis的坐标
②创建user数据表
③编写User实体类
④编写映射文件UserMapper.xml
⑤编写核心文件SqlMapConfig.xml
⑥编写测试类