mybitis 环境搭建和入门程序

1.1    MyBatis介绍

MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

 

 

1.2    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通过MappedStatement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、  Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

 

Mybatis入门程序

第一步:创建java工程

创建工程,并创建数据库

第二步:加入jar包

加入mybatis核心包、依赖包、数据驱动包。

lib下:依赖包

mybatis-3.2.7.jar:核心 包

mybatis-3.2.7.pdf,操作指南

第三步:log4j.properties

在classpath下创建log4j.properties如下:

# Global logging configuration

log4j.rootLogger=DEBUG, stdout

# Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 

mybatis默认使用log4j作为输出日志信息。

第四步:SqlMapConfig.xml

在classpath下创建SqlMapConfig.xml,如下:

 

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

   <!--spring整合后 environments配置将废除-->

   <environmentsdefault="development">

      <environmentid="development">

      <!--使用jdbc事务管理-->

         <transactionManagertype="JDBC"/>

      <!-- 数据库连接池-->

         <dataSourcetype="POOLED">

            <propertyname="driver"value="com.mysql.jdbc.Driver"/>

            <propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>

            <propertyname="username"value="root"/>

            <propertyname="password"value="mysql"/>

         </dataSource>

      </environment>

   </environments>

  

</configuration>

 

SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。

第五步:po类

Po类作为mybatis进行sql映射使用,po类通常与数据库表对应,User.java如下:

 

Public class User {

    private intid;

    private Stringusername;// 用户姓名

    private Stringsex;// 性别

    private Datebirthday;// 生日

    private Stringaddress;// 地址

get/set……

第六步:程序编写

映射文件:

在classpath下的sqlmap目录下创建sql映射文件Users.xml:

 

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mappernamespace="test">

</mapper>

namespace 命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。

加载映射文件

mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,如下:

 

<mappers>

       <mapperresource="sqlmap/User.xml"/>

</mappers>

1.2.1.1.1      测试程序:编写user.xml如下

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEmapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--  namespace 命名空间,作用是对sql进行隔离,理解sql隔离

注意:使用mapper戴丽丽方法,namepace有特殊的重要作用

-->

<mappernamespace="test">

    <!-- 在映射文件中配置很多sql语句 -->

    <!--通过select执行数据库查询

    id:表示映射文件中的sql

    sql语句封装到mappedstatement对象中,所以将id称为statementid

    parameterType指定输入数据类型,这里指定int

    resultType   指定sql输出结果的所影射的java对象类型,select指定resulttype表示将单条记录映射成java对象

     #{}表示一个占位符?

     #{id}: id表示接收的输入参数,参数名就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以value或其他名称

     -->

<selectid="findUserById"parameterType="int"resultType="cn.hpu.mybatis.po.User">

    SELECT* FROM USER WHERE id=#{id}

    </select>

<!-- 根据用户名称模糊查询用户

        resultType:指定单条记录映射的java对象

        ${}表示拼接sql串,借接收的内容不加修饰拼接在Sql,传入简单类型那么$中只能写value

        使用${}可能会引起sql注入,or 1=1

        -->

<selectid="findUserByName"parameterType="String"resultType="cn.hpu.mybatis.po.User">

    SELECT* FROM USER WHERE username LIKE '%${value}%'

    </select>

        <!--

        添加用户

        #{}中指定pojo的属性名,接收到对象的属性值,mybatis通过OGNL获取对象属性值-->

<insertid="insertUser"parameterType="cn.hpu.mybatis.po.User">

        <!--

         将插入数据的主键返回到user对象中

         select last_insert_id() 得到刚执行插入的记录信息的主键值,只适用自增主键;

         keyProperty 将查询到的主键值设置到parameterType指定的对象的那个属性

         order  相对于insert的执行顺序

         resultType 指定结果类型

         -->

<selectKeykeyProperty="id"order="AFTER"resultType="int">

            selectlast_insert_id()

         </selectKey>

    insertinto user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})           

    </insert>

<!-- uuid  返回非自增主键,主键需要是String -->

        <!-- <insert id="insertUseruuid"parameterType="cn.hpu.mybatis.po.User"> -->

       

        <!--

        使用MYsqluuid()生成主键

        执行过程首先通过uuid()得到主键,将主键设置到user对象的id属性中

        其次在insert执行时,从user对象中取出id属性值    

         -->

        <!-- 

        <selectKeykeyProperty="id" order="BEFORE"resultType="java.long.int">

            selectuuid()

         </selectKey>

       

        insertinto user (id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})         

        </insert>

         -->

<!-- 通过id删除用户 -->

<deleteid="deleteUser"parameterType="java.lang.Integer">

    deletefrom  user  where id=#{id}

    </delete>

<!-- 通过id更新用户 -->

<updateid="updateUser"parameterType="cn.hpu.mybatis.po.User">

update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}

 where id=#{id};

</update>

</mapper>

1.2.1.1.2      编写程序如下(写程序作为测试加入junit-4.9.jar架包)
1.2.1.1.3      步骤

1  mybatis配置文件

2 创建会话工厂传入mybatis的配置文件信息

3通过工厂得到SqlSession

4通过SqlSession操作数据库

5提交事物//释放资源

/**

 * @author yang 2015 7 21

 */

public classMybatisFirst {

//根据id查询用户信息,得到一条记录结果

         @Test

         public void findUserById()throwsException{

                   //mybatis配置文件

                   Stringresource="SqlMapConfig.xml";

                   InputStreaminputStream=Resources.getResourceAsStream(resource);

                   //创建会话工厂 传入mybatis的配置文件信息

                   SqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

                   //通过工厂得到SqlSession

                   SqlSessionsqlSession=sqlSessionFactory.openSession();

                   //通过SqlSession操作数据库

                   //第一个参数映射文件 statement的id ,等于命名空间加statement的id

                   //第二个参数,指定和映射文件中所匹配的paratertype类型的参数

                   //sqlSeeion.selectOne 结果是与映射文件中所匹配的resulttype类型的对象

                   User  user =sqlSession.selectOne("test.findUserById",1);

                   System.out.println(user);

                   //释放资源

                   sqlSession.close();

         }

         //根据用户名称模糊查询用户列表

         @Test

         public void findUserByName()throws Exception{

                   //mybatis配置文件

                                     Stringresource="SqlMapConfig.xml";

                                     InputStreaminputStream=Resources.getResourceAsStream(resource);

                            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

                                     SqlSessionsqlSession=sqlSessionFactory.openSession();

                                     //sqlSeeion.selectList结果是与映射文件中所匹配的resulttype类型的对象

                                     List<User>  list=sqlSession.selectList("test.findUserByName","小明");

                                     System.out.println(list);

                                     //释放资源

                                     sqlSession.close();

         }

         //添加用户

         @Test

         public void insertUser()throws Exception{

                                     Stringresource="SqlMapConfig.xml";

                                     InputStreaminputStream=Resources.getResourceAsStream(resource);

                            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

                                     SqlSessionsqlSession=sqlSessionFactory.openSession(); 

                                     //用户数据

                                     Useruser=new User();

                                     user.setUsername("王小军");

                                     user.setBirthday(newDate());

                                     user.setSex("1");

                                     user.setAddress("河南焦作");

                                     //通过SqlSession操作数据库

                                     sqlSession.insert("test.insertUser",user);

                                     //提交事物

                                     sqlSession.commit();

                                     //获取用户信息主键  主键返回

                                     System.out.println("id:"+user.getId());

                                     //释放资源

                                     sqlSession.close();

         }

         //根据id删除用户

         @Test

         public void deleteUsertest()throws Exception{

                                     Stringresource="SqlMapConfig.xml";

                                     InputStreaminputStream=Resources.getResourceAsStream(resource);

                            SqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

                                     SqlSessionsqlSession=sqlSessionFactory.openSession();

                                     sqlSession.delete("test.deleteUser",28);                              

                                     sqlSession.commit();

                                     //释放资源

                                     sqlSession.close();

         }

         //更新用户

         @Test

         public void UpdateUserById()throws Exception{

                                     Stringresource="SqlMapConfig.xml";

                                     InputStreaminputStream=Resources.getResourceAsStream(resource);

                            SqlSessionFactorysqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

                                     //通过工厂得到SqlSession

                                     SqlSessionsqlSession=sqlSessionFactory.openSession(); 

                                     //用户数据

                                     Useruser=new User();

                                     user.setId(30);

                                     user.setUsername("安");

                                     user.setBirthday(newDate());

                                     user.setSex("1");

                                     user.setAddress("河南焦作");

                                     //通过SqlSession操作数据库

                                     sqlSession.update("test.updateUser",user);

                                     sqlSession.commit();

                                     //释放资源

                                     sqlSession.close();

         }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值