MyBatis开发入门
2016-11-28 21:30
176 查看
总是感觉很多知识在脑子当中没有一个系统化的组织,感觉很难受,希望能通过再系统化的学习一遍,将知识组织起来。
之前JDBC的编程方式存在的问题为存在较多的硬编码,不利于系统的维护,同时,对于数据库的连接频繁;从JDBC到MyBatis后MyBatis借助配置文件以及输入映射和输出映射消除了很多硬编码,提高了系统的维护性,同时借助数据库连接池减少对数据库的频繁连接。
Hibernate是一个ORM框架,自动生成SQL,对SQL优化和修改相对困难,而MyBatis是一个半ORM框架,程序自己编写SQL,这样可以写出效率更高的SQL语句,所以,Hibernate一般用在一些需求变化不多的小型项目中,而MyBatis用在需求变化较多的项目中。
1、SqlMapConfig.xml——mybatis的全局配置文件,用来配置数据源、事务等mybatis的运行环境参数信息。
2、配置映射文件——配置sql语句。
3、SqlSessionFactory——会话工厂,用来根据配置文件创建SqlSession。
4、SqlSession——会话,用来操作数据库。
5、Executor——执行器,SqlSession内部是通过执行器操作数据库。
6、输入参数——传入到sql语句中的输入参数。
7、输出参数——接收sql语句执行返回的结果。
8、mappeed statement——对sql语句、输入参数和输出参数的封装。
组织结构如下图所示:
(2)映射文件User.xml(对于后边介绍的mapper代理开发方式的映射文件命名会有所不同)
认识:
1、namespace(命名空间)对sql进行分类管理
2、id为命名空间中sql语句的标识
3、parameterType指定输入参数的类型
4、resultType为SQL输入结果的映射类型。
5、#{id}占位符,id表示输入参数,与输入参数对应。
(3)通过sqlMapConfig.xml加载User.xml
(4)实现查询
认识:
$(value),$()用来拼接sql语句,如果输入参数为简单类型,$()只能使用value变量
(2)实现查询
认识:
这里输入参数类型为POJO对象类型,Mybatis是通过OGNL获取对象属性的,在SQL中的参数#{}中指定的为POJO的属性值。
(2)实现添加
(3)主键返回
自增主键返回:在我们对两张表操作的过程中,有时会需要获取刚插入到表1中记录的主键。可通过如下代码实现:
认识:
1、keyProperty:将查询的主键设置到parameterType指定对象的那个属性上。
2、order:相对于insert语句的执行顺序。AFTER表示在insert之后执行。
3、resultType:指定selectKey中语句的返回值类型。
非自增主键返回:
这是首先获取uuid再通过这个uuid插入记录。
(2)实现删除
(2)实现更新
分别对应输入映射和输出映射。
2、#()和$()
#()表示一个占位符,$()用来拼接字符串。都可以接受输入参数,输入参数的类型也可以都为简单类型和POJO、Map等参数。#()中的参数名称没有限制,$()的参数名称如果为简单类型只能为value。
4、selectOne和selectList
selectOne查询一条记录映射,selectList查询多条记录进行映射,selectList可以替代selectOne,反之不可以。
一、MyBatis的特点
1、从原生JDBC编程到借助MyBatis
之前JDBC的编程方式存在的问题为存在较多的硬编码,不利于系统的维护,同时,对于数据库的连接频繁;从JDBC到MyBatis后MyBatis借助配置文件以及输入映射和输出映射消除了很多硬编码,提高了系统的维护性,同时借助数据库连接池减少对数据库的频繁连接。
2、MyBatis与Hibernate对比
Hibernate是一个ORM框架,自动生成SQL,对SQL优化和修改相对困难,而MyBatis是一个半ORM框架,程序自己编写SQL,这样可以写出效率更高的SQL语句,所以,Hibernate一般用在一些需求变化不多的小型项目中,而MyBatis用在需求变化较多的项目中。
二、总体认识
Mybatis框架的结构有如下几部分1、SqlMapConfig.xml——mybatis的全局配置文件,用来配置数据源、事务等mybatis的运行环境参数信息。
2、配置映射文件——配置sql语句。
3、SqlSessionFactory——会话工厂,用来根据配置文件创建SqlSession。
4、SqlSession——会话,用来操作数据库。
5、Executor——执行器,SqlSession内部是通过执行器操作数据库。
6、输入参数——传入到sql语句中的输入参数。
7、输出参数——接收sql语句执行返回的结果。
8、mappeed statement——对sql语句、输入参数和输出参数的封装。
组织结构如下图所示:
三、基本CRUD
1、sqlMapConfig.xml
配置mybatis的运行环境、数据源和事务<configuration> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理,事务控制由mybatis--> <transactionManager type="JDBC" /> <!-- 数据库连接池,由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> </configuration>
2、查询
(1)POJO类定义public class User { //属性名和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址
(2)映射文件User.xml(对于后边介绍的mapper代理开发方式的映射文件命名会有所不同)
<mapper namespace="UserMapper"> <select id="findUserById" parameterType="int" resultType="User"> SELECT * FROM USER WHERE id=#{id} </select> </mapper>
认识:
1、namespace(命名空间)对sql进行分类管理
2、id为命名空间中sql语句的标识
3、parameterType指定输入参数的类型
4、resultType为SQL输入结果的映射类型。
5、#{id}占位符,id表示输入参数,与输入参数对应。
(3)通过sqlMapConfig.xml加载User.xml
<!-- 加载 映射文件 --> <mappers> <mapper resource="sqlmap/User.xml"/> </mappers>
(4)实现查询
// 根据id查询用户信息,得到一条记录结果 public void findUserByIdTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过SqlSession操作数据库 // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数 // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象 // selectOne查询出一条记录 User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user); // 释放资源 sqlSession.close(); }
3、模糊查询
(1)映射文件<select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.po.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select>
认识:
$(value),$()用来拼接sql语句,如果输入参数为简单类型,$()只能使用value变量
(2)实现查询
// 根据用户名称模糊查询用户列表 public void findUserByNameTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // list中的user和映射文件中resultType所指定的类型一致 List<User> list = sqlSession.selectOne("test.findUserByName", "小明"); System.out.println(list); sqlSession.close(); }
4、添加用户
(1)映射文件<insert id="insertUser" parameterType="mybatis.po.User"> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert>
认识:
这里输入参数类型为POJO对象类型,Mybatis是通过OGNL获取对象属性的,在SQL中的参数#{}中指定的为POJO的属性值。
(2)实现添加
// 添加用户信息 public void insertUserTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 插入用户对象 User user = new User(); user.setUsername("王小军"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("河南郑州"); sqlSession.insert("test.insertUser", user); // 提交事务 sqlSession.commit(); // 获取用户信息主键 System.out.println(user.getId()); // 关闭会话 sqlSession.close(); }
(3)主键返回
自增主键返回:在我们对两张表操作的过程中,有时会需要获取刚插入到表1中记录的主键。可通过如下代码实现:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert>
认识:
1、keyProperty:将查询的主键设置到parameterType指定对象的那个属性上。
2、order:相对于insert语句的执行顺序。AFTER表示在insert之后执行。
3、resultType:指定selectKey中语句的返回值类型。
非自增主键返回:
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> SELECT uuid() </selectKey> insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) </insert>
这是首先获取uuid再通过这个uuid插入记录。
5、删除用户
(1)映射文件<delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete>
(2)实现删除
// 根据id删除 用户信息 public void deleteUserTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 传入id删除 用户 sqlSession.delete("test.deleteUser", 39); // 提交事务 sqlSession.commit(); // 关闭会话 sqlSession.close(); }
6、更新用户
(1)映射文件<update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update>
(2)实现更新
// 更新用户信息 public void updateUserTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 更新用户信息 User user = new User(); //必须设置id user.setId(41); user.setUsername("王大军"); user.setBirthday(new Date()); user.setSex("2"); user.setAddress("河南郑州"); sqlSession.update("test.updateUser", user); // 提交事务 sqlSession.commit(); // 关闭会话 sqlSession.close(); }
四、总结
1、parameterType和resultType分别对应输入映射和输出映射。
2、#()和$()
#()表示一个占位符,$()用来拼接字符串。都可以接受输入参数,输入参数的类型也可以都为简单类型和POJO、Map等参数。#()中的参数名称没有限制,$()的参数名称如果为简单类型只能为value。
4、selectOne和selectList
selectOne查询一条记录映射,selectList查询多条记录进行映射,selectList可以替代selectOne,反之不可以。
相关文章推荐
- springMvc+ibatis+mybatis入门开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发------------转载
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- struts2+spring+mybatis入门教程一之开发环境
- mybatis之入门到开发(四)之 Mapper动态代理方式
- Mybatis 开发注解快速入门
- mybatis开发入门
- mybatis之入门到开发(二)之核心配置文件+Mapper映射文件详解
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- MyEclipse开发MyBatis入门程序
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- Web框架梳理:第三章:Mybatis入门、Mybatis代理开发、log4j:日志管理工具
- Mybatis入门基础(二)--原始dao的开发和mapper代理开发
- mybatis入门基础(二)----原始dao的开发和mapper代理开发
- MyBatis开发-->入门
- mybatis入门---helloworld程序开发步骤
- mybatis入门--mapper代理方式开发
- mybatis之入门到开发(三)之常用对象SqlSessionFactory和SqlSession,动态sql,输入映射和输出映射