MyBatis的基础知识and(增,删,改,多条件(模糊)查)的demo

来源:互联网 发布:大数据关键技术图谱 编辑:程序博客网 时间:2024/06/03 07:44

基础知识:

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对象)映射成数据库中的记录。



第一步创建核心配置文件

第二步创建数据库表对应的实体类

第三步创建Mapper配置文件,再加入核心配置文件

第四步加载核心配置文件,创建SqlSessionFactory,使用工厂产生SqlSession

第五步使用MyBatis的各种方法完成增删查改操作



 * 在MyBatis中执行事务的方式(执行完毕某个操作成功后以后不进行数据回滚)

 * 第一种方式:直接在openSession方法中添加参数true,自动提交的方式

 * 第二种方式:在完成整个逻辑操作后,添加代码session.commit();,完成事务的手动提交

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编程中对结果的解析处理过程。

输出映射(返回的结果集可以有哪些类型)

1)基本类型

2)pojo类型

3)List类型

动态sql:动态的拼接sql语句,因为sqlwhere条件有可能多也有可能少

1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字

2)if:判断传入的参数是否为空

3)foreach:循环遍历传入的集合参数

4)sql:封装查询条件,以达到重用的目的

 

对单个对象的映射关系:

1)自动关联(偷懒的办法):可以自定义一个大而全的pojo,然后自动映射其实是根据数据库总的字段名称和

pojo中的属性名称对应.

2)手动关联:需要指定数据库中表的字段名称和javapojo类中的属性名称的对应关系.

使用association标签

 

对集合对象的映射关系

只能使用手动映射:指定表中字段名称和pojo中属性名称的对应关系

使用collection标签

springmybatis整合

整合后会话工厂都归spring管理

1)原生Dao实现:

需要在spring配置文件中指定dao实现类

dao实现类需要继承SqlSessionDaoSupport超类

dao实现类中不要手动关闭会话,不要自己提交事务.

2)Mapper接口代理实现:

spring配置文件中可以使用包扫描的方式,一次性的将所有mapper加载

 

逆向工程:自动生成Pojo,还可以自动生成Mapper接口和映射文件

注意:生成的方式是追加而不是覆盖,所以不可以重复生成,重复生成的文件有问题.

如果想重复生成将原来生成的文件删除


具体代码:


结果:

架构、


首先 我们先导jar包

pom.xml中的

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>cn.happy</groupId>  <artifactId>MyBatis03</artifactId>  <packaging>war</packaging>  <version>1.0-SNAPSHOT</version>  <name>MyBatis03 Maven Webapp</name>  <url>http://maven.apache.org</url>  <dependencies>  <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.31</version>  </dependency>  <dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis</artifactId>    <version>3.2.2</version>  </dependency>  <dependency>    <groupId>log4j</groupId>    <artifactId>log4j</artifactId>    <version>1.2.17</version>  </dependency>  <dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.12</version>  </dependency>    <dependency>      <groupId>javaee</groupId>      <artifactId>javaee-api</artifactId>      <version>5</version>    </dependency></dependencies>  <build>    <finalName>MyBatis03</finalName>  </build></project>
然后我们该弄大配置了
MyBatis-config.xml
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <properties resource="jdbc.properties"></properties>    <settings>        <setting name="autoMappingBehavior" value="PARTIAL"/>    </settings><typeAliases><!--    <typeAlias type="cn.happy.entity.UserInfo" alias="userinfo"></typeAlias>--><package name="cn.happy.entity"></package></typeAliases>    <!--环境-->    <environments default="development">        <environment id="development">            <!--事务处理setAutoCommmit(false)-->            <transactionManager type="JDBC" />            <!--数据源 DBCP C3P0            POOLED            UNPOOLED            JNDI(jsp JAVA Naming and Dirtory Interface JAva命名和目录接口)            -->            <dataSource type="POOLED">                <property name="driver" value="${jdbc.driver}" />                <property name="url" value="${jdbc.url}" />                <property name="username" value="${jdbc.username}" />                <property name="password" value="${jdbc.password}" />            </dataSource>        </environment>    </environments>    <mappers>        <mapper resource="userinfo.xml"></mapper>    </mappers></configuration>


这里我们引用jdbc.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/empdbjdbc.username=rootjdbc.password=


这个是里面写SQL 的xml文件ider需要放resource中
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.happy.dao">    <resultMap id="userMap" type="UserInfo">        <result column="name" property="name"></result>    </resultMap>    <select id="selectAll"  resultMap="userMap">        select * from department    </select></mapper>
实体类
测试类 
关于添加,修改,删除 多条件查询的 所有测试类中代码
   @Test    //使用session.getMapper()执行 SQL    //添加    public void insertOne()throws Exception{        String resource="mybatis-config.xml";        InputStream inputStream= Resources.getResourceAsStream(resource);        //获得会话工厂        SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(inputStream);        //会话        SqlSession session=sf.openSession();        //Class<T>  和Class  的区别        //动态代理        //构建接口的实现类        IUserInfoDao userinfoDAOImpl=session.getMapper(IUserInfoDao.class);       int count=userinfoDAOImpl.insertInfo(new UserInfo("wqueiiuower"));        session.commit();        System.out.println(count);        session.close();    }

  @Test    //使用session.getMapper()执行 SQL    //查询单个    public void selectOneMapper()throws Exception{        String resource="mybatis-config.xml";        InputStream inputStream= Resources.getResourceAsStream(resource);        //获得会话工厂        SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(inputStream);        //会话        SqlSession session=sf.openSession();        //Class<T>  和Class  的区别        //动态代理        //构建接口的实现类        IUserInfoDao userinfoDAOImpl=session.getMapper(IUserInfoDao.class);        UserInfo userInfo=userinfoDAOImpl.selectOneUserInfo(1);       System.out.println(userInfo.getName());        session.close();    }


  //修改    @Test    //使用session.getMapper()执行 SQL    //添加    public void updateOne1()throws Exception{        String resource="mybatis-config.xml";        InputStream inputStream= Resources.getResourceAsStream(resource);        //获得会话工厂        SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(inputStream);        //会话        SqlSession session=sf.openSession();        //Class<T>  和Class  的区别        //动态代理        //构建接口的实现类        IUserInfoDao userinfoDAOImpl=session.getMapper(IUserInfoDao.class);        int count=userinfoDAOImpl.updateInfo(8,"苏苏最美");        session.commit();        System.out.println(count);        session.close();    }

@Test//删除    public void delsele()throws Exception{        String resource="mybatis-config.xml";        InputStream inputStream= Resources.getResourceAsStream(resource);        //获得会话工厂        SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(inputStream);        //会话        SqlSession session=sf.openSession();        IUserInfoDao uoDAOImpl=session.getMapper(IUserInfoDao.class);       int count=uoDAOImpl.delInfo(9);        System.out.println(count);    session.commit();    }


SQL映射文件中的  具体SQL语句
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.happy.dao.IUserInfoDao">    <sql id="columns">        id,name    </sql>    <resultMap id="userMap" type="UserInfo">        <result column="name" property="name"></result>    </resultMap>    <select id="selectAll"  resultMap="userMap">        select * from department    </select>    <!--????????-->    <select id="selectOneUserInfo"  resultType="UserInfo">        select <include refid="columns"></include> from department where id=#{id}    </select>         <!--??????-->    <insert id="insertInfo" >     insert into department(name) values(#{name})    </insert>    <!--??-->    <update id="updateInfo" >        update department set name=#{name} where id=#{id}    </update><!--????-->    <select id="selectPart" resultType="UserInfo">        select <include refid="columns"></include>  from department where 1=1        <if test="name!=null">            and name=#{name}        </if>    </select>    <!--????-->    <select id="selectUserInfo"  resultType="UserInfo">        <!-- select * from department where name like '%' #{name} '%'-->         select * from department where name like '%${name}%'        <!--select <include refid="columns"></include>  from department where name like concat('%',#{uname},'%')-->    </select>    <delete id="delInfo">        DELETE from department where id=#{id}    </delete></mapper>

接口名与对应的 SQL映射文件中的id必须保持一致

 
原创粉丝点击