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真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比 ...
随机推荐
- Unity3d 5.3.5使用sqlite3
http://blog.csdn.net/glunoy/article/details/52037598 国内讲的乱七八糟,更有故作神秘提供Mono.Data.Sqlite.dll System.Da ...
- jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)
题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\pr ...
- 【微信小程序】开发实战 之 「数据缓存API」解析
每个小程序都可以有自己的本地缓存,可以通过 数据缓存的API 实现对本地缓存进行 设置.获取和清理.本地缓存最大为10M.localStorage是永久存储的,但我们不建议将关键信息都放在localS ...
- 【ZJOI2007】捉迷藏 小小的总结
2019-01-09 22:56:33 终于终于把这道题目做掉了... 做了两个晚上..不知道为什么自己如此之笨.. 在洛谷上断断续续一共交了24次,感觉自己都要被封号了. 昨天花半个晚上从零开始研究 ...
- Eclipse中各图标含义
Eclipse中定义很多小图标,在平时的开发工作中,熟悉这些小图标还是很有意义的.那具体意义大家又知道多少呢? 首先,通过在搜索“eclipse icon meaning”,找到了一个比较有用的链接, ...
- JMeter(2) 集成jmeter+ant+jenkins
一.ant安装 $su root $vi /etc/bashrc 插入两行(i+enter插入) export ANT_HOME=/usr/local/apache-ant-1.9.3 export ...
- ES6入门教程---变量和常量
ES6提出了两个新的声明变量的命令:let 和 const 1. 建议不再使用var,而使用let 和const .优先使用const. 在定义之后值是固定不变的,即为常量 常量的值不能修改,但是如果 ...
- 解决git commit报错问题
参考: https://stackoverflow.com/questions/3239274/git-commit-fails-due-to-insufficient-permissions 问题 ...
- Memcache未授权访问漏洞利用及修复
Memcached是一套分布式的高速缓存系统.它以Key-Value(键值对)形式将数据存储在内存中,这些数据通常是应用读取频繁的.正因为内存中数据的读取远远大于硬盘,因此可以用来加速应用的访问.本文 ...
- ExpandoObject的使用
IDictionary<string, object> obj = new System.Dynamic.ExpandoObject(); obj.Add(); dynamic obj2 ...