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. Unity开发Android应用优化指南(下)

    http://forum.china.unity3d.com/thread-27044-1-1.html 在Unity开发Android应用优化指南(上)一文中,从游戏性能,脚本等方面进行了分析和总结 ...

  2. js组件化(转载)

    今天想着开始封装自己的UI库和组件库,从网上看到一篇很好的关于js组件化的文章,现在分享一下. 转载地址:https://blog.csdn.net/Prince_fmx/article/detail ...

  3. 黑马SSM练习中 Oracle SQL代码

    -- 10张表 product member orders traveller order_traveller users role permission users_role role_permis ...

  4. day5字典作业详解

    1.day5题目 1.有如下变量(tu是个元祖),请实现要求的功能 tu = ("alex", [11, 22, {"k1": 'v1', "k2&q ...

  5. 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} ...

  6. GIT使用笔记一:GIT初始化配置

    本人系统环境:centos6.5 下 LNMP centos下git安装很简单sudo yum install gitOK 可先进行git 的全局配置 用户信息 git config --global ...

  7. hadoop分布式存储(2)-hadoop的安装

    总共分三步:1.准备linux环境 租用“云主机”,阿里云,unitedStack等,云主机不受本机性能影响(或者直接安转linux操作系统或者虚拟机也行): PuTTy Configuration ...

  8. 位运算>>和>>>区别

    int a=-1; Integer b=0; Integer c=0; System.out.println(Integer.toBinaryString(a)); b=a>>1; c=a ...

  9. AD17笔记

    1 铺铜修改后自动重铺设置:在最右下角

  10. poj 2406 Power Strings 后缀数组解法

    连续重复子串问题 poj 2406 Power Strings http://poj.org/problem?id=2406 问一个串能否写成a^n次方这种形式. 虽然这题用kmp做比较合适,但是我们 ...