框架第十六天

mybatis框架
MyBatis是一个数据持久层(ORM)框架。把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

mybatis的优点:
1.基于SQL语法,简单易学。
2.能了解底层组装过程。
3.SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
4.程序调试方便。

hibernate、MyBatis、JDBC区别:
1)从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。

2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;Hibernate是将数据库中的数据表映射为持久层的Java对象,实现数据表的完整性控制;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,放弃了对数据表的完整性控制,但是获得了更灵活和响应性能更快的优势。

3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。

hibernate、MyBatis区别:
MyBatis
1、是一个SQL语句映射的框架(工具)
2、注重POJO与SQL之间的映射关系。不会为程序员在运行期自动生成 SQL
3、自动化程度低、手工映射SQL,灵活程度高.
4、需要开发人员熟炼掌据SQL语句
Hibernate
1、主流的ORM框架、提供了从 POJO 到数据库表的全套映射机制
2、会自动生成全套SQL语句。
3、因为自动化程度高、映射配置复杂,api也相对复杂,灵活性低.
4、开发人同不必关注SQL底层语句开发

mybatis开发步骤:
1、创建一个java工程或web工程(整合)
2、导入mybatis对应的jar文件
3、开发并配置mybatis-config.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>
    <!-- 配置mysql数据库的连接环境 -->
    <environments default="development">  <!-- 环境  -->
        <environment id="development"><!-- 环境变量  -->
            <transactionManager type="JDBC"/><!-- 事务管理器  -->
            <dataSource type="POOLED"><!-- 数据源  -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/stu?useUnicode=true&characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers><!--  映射器 -->
        <mapper resource=""/>
    </mappers>
</configuration>
4、开发和表中的字段一致的bean 对象
5、开发接口
6、开发SQL映射文件
7、测试

下面就是具体的开发步骤:
1、创建一个java工程或web工程(整合)
2、导入mybatis对应的jar文件
如果不是整合就用两个jar包就行了,如果要整合ssm就需要再加一个jar包如图箭头所示


mybatis的jar包.png

3、开发并配置mybatis-config.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>
<!-- 配置mysql数据库的连接环境 -->
<environments default="development">  <!-- 环境  -->
<environment id="development"><!-- 环境变量  -->
<transactionManager type="JDBC"/><!-- 事务管理器  -->
<dataSource type="POOLED"><!-- 数据源  -->
<property name="driver" value="com.mysql.jdbc.Driver"/><!-- 驱动 -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/stu?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="huayu123"/>
</dataSource>
</environment>
</environments>
<mappers><!--  映射文件-->
<mapper resource="com/hw/mapper/studentDaoMapper.xml"/>
</mappers>
</configuration>

4、开发和表中的字段一致的bean 对象


entity类.png

{entity类.png

5、开发接口

package com.hw.dao;

import java.util.List;

import com.hw.entity.Student;
public interface StudentDao {
    public void addStudent(Student stu);//添加
    public void updateStudent(Student stu);//修改
    public void delStudent(int id);//删除学生
    public Student getStudent(int id);//由id获取单个用户
    public int getCount();//统计总计录数
    public List<Student> listAll();//查询所有
    public List<Student> listPage(int currentPage,int pageSize);//查询所有且有分页
    public List<Student> listLikeAll(String name);//模糊查询指定名
    public List<Student> listLikePage(int currentPage,int pageSize,String name);///模糊查询指定名且有分页
    public int getLikeCount(String name);//统计模糊查询总计录数
}

6、开发SQL映射文件(原来的实现类impl用映射文件代替了)

<?xml version="1.0" encoding="UTF-8"?><!-- 相当于实现impl -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hw.dao.StudentDao"><!-- namespace="qq"如果和spring整合时要用接口全类名 不整合无所谓 -->
<resultMap type="com.hw.entity.Student" id="stuinfo"><!-- id="stuinfo"如果不用resultMap则不写 -->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="money" property="money"/>
<result column="jobtime" property="jobtime" javaType="java.sql.Date" jdbcType="DATE"/>
</resultMap>
<!-- id="listAll"  id要取接口的方法名   这样代码结构清晰 比较规范 不混乱-->
<select id="listAll"  resultMap="stuinfo">
select * from stu
</select>
<!-- resultType返回结果类型 -->
<select id="getCount" resultType="int">
select count(id) from stu
<!-- resultMap返回map集合 -->
</select>
<select id="listLikeAll" resultMap="stuinfo" parameterType="string">
<!-- select * from stu where name like '%${value}%' -->
select * from stu where name like #{name}
</select>
<!-- parameterType参数类型 -->
<insert id="addStudent" parameterType="com.hw.entity.Student">
<!-- #{money}解析成"money" -->
insert into stu values(null,#{name},#{money},#{jobtime})
</insert>
<delete id="delStudent" parameterType="int">
delete from stu where id=#{id}
</delete>
<update id="updateStudent" parameterType="com.hw.entity.Student">
update stu set name=#{name},money=#{money},jobtime=#{jobtime} where id=#{id}
</update>
<select id="getStudent" resultMap="stuinfo">
select * from stu where id=#{id}
</select>
<select id="getLikeCount" resultType="int">
select count(id) from stu where name like #{name}
</select>
<select id="listPage" resultMap="stuinfo" parameterType="map">
select * from stu limit #{currentPage},#{pageSize}
</select>
<select id="listLikePage" resultMap="stuinfo" parameterType="map">
select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}
</select>
</mapper>

上面主要是#和$的区别要注意:

MyBatis/Ibatis中#和$的区别
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.  
6.一般能用#的就别用$. 

还有就是时间转换需要在配置文件中添加javaType="java.sql.Date" jdbcType="DATE"
前面是指数据库查询出来的时间转换成Java类型 后面是数据库连接的类型 一般类型要数据库表中对应得字段类型一致

最后就是测试类了

package com.hw.test;

import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hw.entity.Student;

public class Test3 {
 public static void main(String[] args) throws Exception {
     //mybatis读取配置文件
      Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    // 创建工厂模式SqlSessionFactory
      SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //创建session
      SqlSession session = sessionFactory.openSession();
    
      Map<String ,Object> map=new HashMap<String, Object>();
    /* int currentPage=1;
     int pageSize=3;
     map.put("currentPage", (currentPage-1)*pageSize);
     map.put("pageSize", pageSize);
     List<Student> selectList = session.selectList("listPage", map);
     for (Student stu : selectList) {
        System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
    }*/
     int currentPage=1;
     int pageSize=3;
     map.put("name", "张");
     map.put("currentPage", (currentPage-1)*pageSize);
     map.put("pageSize", pageSize);      
     List<Student> selectList = session.selectList("listLikePage", map);
     for (Student stu : selectList) {
        System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getMoney()+"\t"+stu.getJobtime());
    } 
}
}

分页模糊查询 需要注意的是测试类传入的参数是map

<select id="listLikePage" resultMap="stuinfo" parameterType="map">select * from stu where name like '%${name}%' limit #{currentPage},#{pageSize}</select>

为什么是map 因为我在映射文件里面写的sql语句有三个需要传参的(name,currentPage,pageSize) 所以我在上面写的是 parameterType="map" 就是通过键值对的方式把值传到sql语句里面


map存值.png

sesssion对象查找对应id 并把map对象传到映射文件 再通过键值对的方式给相应的值

List<Student> selectList = session.selectList("listLikePage", map);

相关源码:

链接:http://pan.baidu.com/s/1kVsepwF 密码:rbiq
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • 本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persi...
    大同若鱼阅读 4,300评论 4 27
  • 说起目标,不知道大家什么感觉,我以前更多的是逃避,混乱,或者说是迷茫毫无目标感。那个时候真的很羡慕那些知道自己想要...
    暮夜之歌阅读 873评论 0 1
  • NBN的故事55:装上追踪器 时间:9000年2月25日 地点:宇宙 甲比安快速地回了月球。“我需要追踪器,我...
    我我了阅读 87评论 1 1