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)的更多相关文章

  1. MyBatis 学习记录5 MyBatis的二级缓存

    主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...

  2. MyBatis 学习记录3 MapperMethod类

    主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...

  3. MyBatis 学习记录7 一个Bug引发的思考

    主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...

  4. MyBatis 学习记录6 TypeHandler

    主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景 如上图所示,观察下接口方法就能明白.TypeHandler主要用于 ...

  5. MyBatis 学习记录4 MyBatis的一级缓存

    主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...

  6. mybatis 学习记录1

    起因 以前刚学习java三大框架的时候持久层框架我是自学的是hibernate..感觉蛮好用的,so easy..后来大三实习公司用的是jpa(hibernate外包装一层)...再后来工作1年多用的 ...

  7. mybatis学习记录六——一对一、一对多和多对多查询

    9       订单商品数据模型 9.1     数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...

  8. Mybatis学习记录(六)----Mybatis的高级映射

    1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders. ...

  9. Mybatis学习记录(五)----Mybatis的动态SQL

    1.  什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...

  10. MyBatis 学习记录1 一个简单的demo

    主题 最近(N个月前)clone了mybatis的源码..感觉相比于spring真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比 ...

随机推荐

  1. Unity3d 5.3.5使用sqlite3

    http://blog.csdn.net/glunoy/article/details/52037598 国内讲的乱七八糟,更有故作神秘提供Mono.Data.Sqlite.dll System.Da ...

  2. jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)

    题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\pr ...

  3. 【微信小程序】开发实战 之 「数据缓存API」解析

    每个小程序都可以有自己的本地缓存,可以通过 数据缓存的API 实现对本地缓存进行 设置.获取和清理.本地缓存最大为10M.localStorage是永久存储的,但我们不建议将关键信息都放在localS ...

  4. 【ZJOI2007】捉迷藏 小小的总结

    2019-01-09 22:56:33 终于终于把这道题目做掉了... 做了两个晚上..不知道为什么自己如此之笨.. 在洛谷上断断续续一共交了24次,感觉自己都要被封号了. 昨天花半个晚上从零开始研究 ...

  5. Eclipse中各图标含义

    Eclipse中定义很多小图标,在平时的开发工作中,熟悉这些小图标还是很有意义的.那具体意义大家又知道多少呢? 首先,通过在搜索“eclipse icon meaning”,找到了一个比较有用的链接, ...

  6. JMeter(2) 集成jmeter+ant+jenkins

    一.ant安装 $su root $vi /etc/bashrc 插入两行(i+enter插入) export ANT_HOME=/usr/local/apache-ant-1.9.3 export ...

  7. ES6入门教程---变量和常量

    ES6提出了两个新的声明变量的命令:let 和 const 1. 建议不再使用var,而使用let 和const .优先使用const. 在定义之后值是固定不变的,即为常量 常量的值不能修改,但是如果 ...

  8. 解决git commit报错问题

    参考: https://stackoverflow.com/questions/3239274/git-commit-fails-due-to-insufficient-permissions 问题 ...

  9. Memcache未授权访问漏洞利用及修复

    Memcached是一套分布式的高速缓存系统.它以Key-Value(键值对)形式将数据存储在内存中,这些数据通常是应用读取频繁的.正因为内存中数据的读取远远大于硬盘,因此可以用来加速应用的访问.本文 ...

  10. ExpandoObject的使用

    IDictionary<string, object> obj = new System.Dynamic.ExpandoObject(); obj.Add(); dynamic obj2 ...