Mybatis学习记录(1)
1.Mybatis介绍
Mybatis是apache的一个开源项目iBatis,Mybatis是一个优秀的持久层框架,他对jdbc的操作数据库的过程进行封装,使开发者只需要关注sql本身,不需要花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集检索等jdbc复杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement,preparedStatement,CallableStatement)配安置起来,并通过java对象和statement中的sql进行映射生成最终执行sql语句,最后由mybatis框架执行sql,并将结果映射成java对象返回。
2.jdbc编程问题
(1)数据库连接创建,释放频繁造成系统资源浪费,从而影响系统性能。(使用连接池可以解决此问题)
(2)Sql语句在代码中硬编码,造成代码不亦伟乎,实际应用中sql变化的可能较大,sql变动需要改变java代码。
(3)使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
(4)对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护。(将数据库记录封装成pojo对象解析比较方便)
3.Mybatis架构

(1)mybatis配置SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。
此文件需要在SqlMapConfig.xml中加载。
(2)通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
(3)由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
(4)mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
(5)Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
(6)Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,
输入参数映射就是jdbc编程中对preparedStatement设置参数。
(7)Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中
对结果的解析处理过程。
4.使用Mybatis的入门程序
先配置核心文件sqlMapConfig.xml
<?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>
<!-- 和spring整合后 environments配置将废除 链接Mysql时,spring管理连接 jdbcTemplate c3p0-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/javaweb_mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments> <!-- Mapper的位置 -->
<mappers>
<mapper resource="sqlMap/User.xml"/>
</mappers>
</configuration>
建立pojo对象
package com.javaweb.mybatis.model;
import java.io.Serializable;
public class User implements Serializable{
/**
* user表的pojo对象
*/
private static final long serialVersionUID = 1L;
private String id;
private String userName;
private String userAge;
private String userSex;
private String userAddress;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "User [id=" + id + ", username=" + userName + ", sex=" + userSex
+ ", userAge=" + userAge + ", userAddress=" + userAddress + "]";
}
}
配置sql映射文件User.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">
<!-- 写sql语句 -->
<mapper namespace="test">
</mapper>
(1)根据id查询用户
/*
* 根据id查询用户
*/
@Test
public void testmybatis() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", "1"); System.out.println(user);
}
User.xml
<mapper namespace="test">
<!-- 通过id查询用户 -->
<select id="findUserById" parameterType="String" resultType="com.javaweb.mybatis.model.User">
select * from mybatis_user where id= #{v}
</select>
</mapper>
(2)根据用户名模糊查询用户列表
/*
* 根据用户名模糊查询用户列表
*/
@Test
public void testmybatis2() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
List<User> userlist = sqlSession.selectList("test.findUserByUserName", "王"); for(User user2 :userlist){
System.out.println(user2);
}
}
User.xml
<!-- 根据用户名模糊查询用户列表
#{}表示占位符 select * from mybatis_user where id= ?
${}表示字符串拼接 select * from mybatis_user where username like
-->
<select id="findUserByUserName" parameterType="String" resultType="com.javaweb.mybatis.model.User">
select * from mybatis_user where username like '%${value}%'
</select>
(3)添加用户
/*
* 添加用户
*/
@Test
public void testmybati3() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql语句
User user =new User();
user.setId("4");
user.setUserName("李四");
user.setUserAge("22");
user.setUserSex("男");
user.setUserAddress("芜湖");
int i = sqlSession.insert("test.addUser",user);
sqlSession.commit();
}
User.xml
<!-- 添加用户 -->
<insert id="addUser" parameterType="com.javaweb.mybatis.model.User">
insert into mybatis_user (id,userName,userSex,userAge,userAddress)
values(#{id},#{userName},#{userSex},#{userAge},#{userAddress})
</insert>
(4)更新用户
/*
* 更新用户
*/
@Test
public void testmybati4() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql语句
User user =new User();
user.setId("2");
user.setUserName("张三2");
user.setUserAge("22");
user.setUserSex("男");
int i = sqlSession.update("test.updateUserById",user);
sqlSession.commit();
}
User.xml
<!-- 更新用户 -->
<update id="updateUserById" parameterType="com.javaweb.mybatis.model.User">
update mybatis_user
set username= #{userName},userAge = #{userAge},userSex =#{userSex}
where id = #{id}
</update>
(5)删除用户
/*
* 删除用户
*/
@Test
public void testmybati5() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql语句
User user=new User();
user.setId("4");
int i = sqlSession.delete("test.deleteUserById",user);
sqlSession.commit();
}
User.xml
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="String">
delete from mybatis_user
where id = #{id}
</delete>
Mybatis学习记录(1)的更多相关文章
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录3 MapperMethod类
主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...
- MyBatis 学习记录7 一个Bug引发的思考
主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...
- MyBatis 学习记录6 TypeHandler
主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景 如上图所示,观察下接口方法就能明白.TypeHandler主要用于 ...
- MyBatis 学习记录4 MyBatis的一级缓存
主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...
- mybatis 学习记录1
起因 以前刚学习java三大框架的时候持久层框架我是自学的是hibernate..感觉蛮好用的,so easy..后来大三实习公司用的是jpa(hibernate外包装一层)...再后来工作1年多用的 ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...
- Mybatis学习记录(六)----Mybatis的高级映射
1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders. ...
- Mybatis学习记录(五)----Mybatis的动态SQL
1. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...
- MyBatis 学习记录1 一个简单的demo
主题 最近(N个月前)clone了mybatis的源码..感觉相比于spring真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比 ...
随机推荐
- Unity开发Android应用优化指南(下)
http://forum.china.unity3d.com/thread-27044-1-1.html 在Unity开发Android应用优化指南(上)一文中,从游戏性能,脚本等方面进行了分析和总结 ...
- js组件化(转载)
今天想着开始封装自己的UI库和组件库,从网上看到一篇很好的关于js组件化的文章,现在分享一下. 转载地址:https://blog.csdn.net/Prince_fmx/article/detail ...
- 黑马SSM练习中 Oracle SQL代码
-- 10张表 product member orders traveller order_traveller users role permission users_role role_permis ...
- day5字典作业详解
1.day5题目 1.有如下变量(tu是个元祖),请实现要求的功能 tu = ("alex", [11, 22, {"k1": 'v1', "k2&q ...
- Codeforces 185B(数学结论)
要点 有不等式\(x^ay^bz^c=a^ab^bc^c(\frac{x}{a})^a(\frac{y}{b})^b(\frac{z}{c})^c<=a^ab^bc^c(\frac{x+y+z} ...
- GIT使用笔记一:GIT初始化配置
本人系统环境:centos6.5 下 LNMP centos下git安装很简单sudo yum install gitOK 可先进行git 的全局配置 用户信息 git config --global ...
- hadoop分布式存储(2)-hadoop的安装
总共分三步:1.准备linux环境 租用“云主机”,阿里云,unitedStack等,云主机不受本机性能影响(或者直接安转linux操作系统或者虚拟机也行): PuTTy Configuration ...
- 位运算>>和>>>区别
int a=-1; Integer b=0; Integer c=0; System.out.println(Integer.toBinaryString(a)); b=a>>1; c=a ...
- AD17笔记
1 铺铜修改后自动重铺设置:在最右下角
- poj 2406 Power Strings 后缀数组解法
连续重复子串问题 poj 2406 Power Strings http://poj.org/problem?id=2406 问一个串能否写成a^n次方这种形式. 虽然这题用kmp做比较合适,但是我们 ...