mybatis开发之基本流程

来源:互联网 发布:java api文档怎么看 编辑:程序博客网 时间:2024/05/20 13:08

一、mybatis介绍

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取

结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)

映射成数据库中的记录。说来说去mybatis本身只是一个数据库的操作工具(框架),他的优点就是通过配置XML文件以及映射的方式来对数据库进行

操作。

二、准备工作

1.首先还是准备一下需要的jar包,mybatis需要jar包合集进行下载。本文使用IDEA开发工具,相较于eclipse本人还是喜欢这个新一点的开发工具,界面

什么的要更养眼一些吐舌头

2.首先创建一个javaEE文件


直接下一步,


这一步可以不需要打对号,因为没有用到web内容。紧接着下一步


至此java工程创建完毕,创建以后的工程目录如下


我们需要创建一个lib根目录,创建完成以后,需要对工程结构进行配置,点击快捷工具栏project structure,选择左侧的library如下图,把lib文件夹作为

工程java依赖文件目录。


下一步需要创建一个作为resource文件的根目录,这里面我创建了一个config的目录,作为resource文件目录,如下图修改过程


到此,目录结构就完成了,需要将mybatis需要的所有jar包放到lib文件夹下面。完成以后的工程目录如下图:


三、开始开发

1.首先在config目录下面创建一个sqlmap文件夹,用来存放数据库属性(*.properties)文件以及映射文件(.xml)。

数据库属性配置文件mysql.properties如下

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/testdb1jdbc.username=rootjdbc.password=123456

配置一些数据库的基本参数,即数据库地址,使用的账户的用户名,密码。

映射文件取名为user.xml(因为我要操作一个user表),待我们把下一步配置mybatis全局文件配置好以后再来说这个文件。

2.然后在config目录下创建一个XML配置文件,取名SqlMapConfig.xml,这是mybatis框架的全局配置文件,内容如下:

<?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>    <!-- 引入外部配置文件 -->    <properties resource="./sqlmap/mysql.properties"></properties>    <!-- 为JAVA Bean起类别名 -->    <typeAliases>        <!-- 别名方式1,一个一个的配置 type中放置的是类的全路径,alias中放置的是类别名        <typeAliase type="com.cy.mybatis.beans.UserBean" alias="UserBean"/> -->        <!-- 别名方式2,批量定义别名,自动扫描包中的po类,将JAVA类的类名作为类的类别名(常用此方式) -->        <package name="com.test.po"/>    </typeAliases>    <!-- 配置mybatis运行环境 -->    <environments default="development">        <environment id="development">            <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->            <transactionManager type="JDBC"/>            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->            <!-- POOLED 表示支持JDBC数据源连接池 -->            <!-- UNPOOLED 表示不支持数据源连接池 -->            <!-- JNDI 表示支持外部数据源连接池 -->            <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>        <!--加载映射文件方式1,一个一个的配置-->        <mapper resource="./sqlmap/User.xml"/>        <!-- 加载映射文件方式2,自动扫描包内的Mapper接口与配置文件         规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,而且必须在一个文件夹中,并且接口使用的是mapper代理方法-->        <!--<package name="com.test.mapper"/>-->    </mappers></configuration>
顺便把log4j.properties文件配置一下(config下创建此文件,目的是使用log),内容如下:

# Global logging configurationlog4j.rootLogger=DEBUG, stdout # MyBatis logging configuration...log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
需要注意的是log4j.rootLogger=DEBUG,测试的时候使用debug生产环境改为error.

3.映射文件的配置(user.xml)

这种方式是普通接口开发方式,即写dao接口和dao的实现类,另一种是mapper代理开发的方式(具体在另一篇博客讲述)

<?xml version="1.0" encoding="UTF-8"?><!-- 不写会报错 --><!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离注意:使用mapper代理开发方法,namespace有特殊重要的作用--><mapper namespace="test">    <!--在映射文件中配置很多sql语句-->    <!--需求:通过id查询用户表的记录-->    <!--通过select查询数据库-->    <!--id:标志映射文件中的sql,讲sql封装到mappedStatement对象中,所以将id成为statement的id-->    <!--parameterType指定输入参数的类型-->    <!--resultType指定sql输出映射结果的java对象类型-->    <select id="findUserById" parameterType="int" resultType="com.test.po.User" >      SELECT * FROM USER WHERE id = #{id}    </select>    <!--带有${}这种形式的是将传入的参数不加修饰的直接加入sql语句,但是要注意sql注入的问题,所以必须写value这个名称-->    <select id="findUserByName" parameterType="String" resultType="com.test.po.User">        SELECT * FROM USER WHERE username LIKE CONCAT(CONCAT('%', #{value}), '%');    </select>    <!--插入用户-->    <insert id="insertUser" parameterType="com.test.po.User">--     将插入的最后一条数据的主键返回给要插入的对象user中,此方法只对主键自增有效        <selectKey keyProperty="id" order="AFTER" resultType="int">            SELECT LAST_INSERT_ID()        </selectKey>        INSERT INTO USER(username,password,sex,address) VALUES (#{username},#{password},#{sex},#{address})    </insert>    <!--插入用户 针对于主键非自增的表格 需要用UUID()方法将主键返回添加到user对象中-->    <!--<insert id="insertUser" parameterType="com.test.po.User">-->        <!----     将插入的最后一条数据的主键返回给要插入的对象user中,此方法只对主键自增有效-->        <!--<selectKey keyProperty="id" order="BEFORE" resultType="String">-->            <!--SELECT UUID()-->        <!--</selectKey>-->        <!--INSERT INTO USER(id,username,password,sex,address) VALUES (#{id},#{username},#{password},#{sex},#{address})-->    <!--</insert>-->    <!--删除用户记录-->    <delete id="deleteUserByName" parameterType="String">        DELETE FROM USER WHERE username = #{username}    </delete>    <!--删除用户记录通过id-->    <delete id="deleteUserById" parameterType="int">        DELETE FROM USER WHERE id = #{id}    </delete>    <!--更新用户信息-->    <update id="updateUser" parameterType="com.test.po.User">        UPDATE USER SET username=#{username},password=#{password},sex=#{sex},address=#{address} WHERE id=#{id}    </update></mapper>
对应的user类

public class User {    private int id;    private String username;    private String password;    private String sex;    private String address;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }    @Override    public String toString() {        return "User{" +                "id=" + id +                ", username='" + username + '\'' +                ", password='" + password + '\'' +                ", sex='" + sex + '\'' +                ", address='" + address + '\'' +                '}';    }}
dao接口以及实现类

public interface UserDao {    /**     * 根据id查询User表记录     * @param id     * @return     * @throws Exception     */    public User findUserById(int id) throws Exception;    /**     * 向User表添加记录     * @param user     * @throws Exception     */    public void insertUser(User user) throws Exception;    /**     * 删除user表中的记录     * @param id     * @throws Exception     */    public void deleteUser(int id) throws Exception;}
实现类

public class UserDaoImp implements UserDao{    private final SqlSessionFactory sessionFactory;    //需要向dao接口实现类中注入SqlSessionFactory,通过构造方法注入    public UserDaoImp(SqlSessionFactory sessionFactory) {        this.sessionFactory = sessionFactory;    }    @Override    public User findUserById(int id) throws Exception {        SqlSession sqlSession = null;        try {            sqlSession = sessionFactory.openSession();            User user = sqlSession.selectOne("test.findUserById",id);            return user;        } catch (Exception e) {            e.printStackTrace();        }finally {            sqlSession.close();        }        return null;    }    @Override    public void insertUser(User user) throws Exception {        SqlSession sqlSession = null;        try {            sqlSession = sessionFactory.openSession();            sqlSession.insert("test.insertUser",user);            sqlSession.commit();        } catch (Exception e) {            e.printStackTrace();        }finally {            sqlSession.close();        }    }    @Override    public void deleteUser(int id) throws Exception {        SqlSession sqlSession = null;        try {            sqlSession = sessionFactory.openSession();            sqlSession.delete("test.deleteUserById",id);            sqlSession.commit();        } catch (Exception e) {            e.printStackTrace();        }finally {            sqlSession.close();        }    }}
小结:以上就是对一个user表使用mybatis框架开发的小案例,其中代理接口使用实现类来操作,下一篇紧接着本篇写另外

一种mapper接口,不需要实现类的操作方法.(详情请移步:使用mapper接口开发,无需实现类操作增删改查).