重拾mybatis(入门级)

一:环境搭建

  1. 引入jar包
    这里写图片描述
  2. 在classpath(本文所指的classpath一律为src目录下)新建
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>

</configuration>
  1. 添加log4g日志配置(关于日志的添加方式在mybatis开发文档中有详细说明)
    在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

在sqlMapConfig.xml中配置使用log4j日志文件

<settings>
    <setting name="logImpl" value="LOG4J"/>  
</settings>
  1. 添加数据源配置
    在classpath下新增jdbcInfo.properties数据库链接配置文件,名称可任意(注意这里可能需要导入驱动包)
jdbc.driverName = oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@localhost:1521:XE
jdbc.user = tiketsystem
jdbc.password =a7633050

在sqlMapConfig.xml中加载数据源properties

   <!-- 加载jdbc配置文件-->
    <properties resource="jdbcInfo.properties"></properties>

配置数据源信息

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${bdcj.driverName}"/>
                <property name="url" value="${bdcj.url}"/>
                <property name="username" value="${bdcj.user}"/>
                <property name="password" value="${bdcj.password}"/>
            </dataSource>
        </environment>
    </environments>

二:接口开发

mybatis有多种形式的使用方式,这里仅列出实际开发中的接口开发方式

  1. 开发规范
    1、 mapper接口的全限定名要和mapper映射文件的namespace的值相同。
    2、 mapper接口的方法名称要和mapper映射文件中的statement的id相同;
    3、 mapper接口的方法参数只能有一个,且类型要和mapper映射文件中statement的parameterType的值保持一致。
    4、 mapper接口的返回值类型要和mapper映射文件中statement的resultType值或resultMap中的type值保持一致;

通过规范式的开发mapper接口,可以解决原始dao开发当中存在的问题:
1、 模板代码已经去掉;
2、 剩下去不掉的操作数据库的代码,其实就是一行代码。这行代码中硬编码的部分,通过第一和第二个规范就可以解决。

  1. 基础配置
    别名配置(配置了别名的包,在mapper文件中引用该包中的pojo类的时候可以不用写具体的包路径,另外忽略大小写):
    <!--配置可用别名的包目录-->
    <typeAliases>
        <package name="com.let.ano.mapper"></package>
        <package name="pojo"></package>
    </typeAliases>

引入mapper文件(写在该路径下的mapper文件,将会自动被引入)

    <!--引入mapper文件的包路径-->
    <mappers>
        <package name="com.let.ano.mapper"></package>
    </mappers>
  1. 增删改查实例代码
    接口类:
package com.let.ano.mapper;

import pojo.GridExt;
import pojo.User;

import java.util.List;

/**
 * Created by Administrator on 2017-12-26.
 */
public interface UsersMapper {
    /**
     *通过id查询用户
     * @param users
     * @return Users
     */
    public Users getUserById(Users users);

    /**
     *通过用户名模糊查询用户
     * @param users
     * @return Users
     */
    public List<Users> getUsersByUserName(Users users);

    /**
     * 通过用户id查询用户
     * @param users
     */
    public void deleteUserById(Users users);

    /**
     * 更新用户信息
     * @param users
     */
    public void updateUser(Users users);

    /**
     * 通过条件查询用户
     * @param users
     * @return
     */
    public Users getUserByCondition(Users users);

    /**
     * 根据用户ids查询所有满足条件的用户
     * @param usersEx
     * @return User
     */
    public List<Users> getUserInIds(UsersEx usersEx);

    /**
     * 通过网格id获取网格信息及其下的建筑物信息
     * @param gridExt
     * @return GridExt
     */
    public GridExt getGridAndAllJzwByGridId(GridExt gridExt);
}

mapper.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">
<mapper namespace="com.let.ano.mapper.UsersMapper">
    <sql id="select_users_where">

        <if test="id!=null">
            and id = #{id}
        </if>
        <if test="username!=null">
            and username like '%${username}%'
        </if>
        <if test="sex !=null">
            AND sex = #{sex}
        </if>

    </sql>
    <!--定义users的映射mapper,用于在sql查询过程中匹配修改了或增加了列名的字段-->
    <resultMap id="userMap" type="users">
        <id column="id" property="id"></id>
        <result column="username_" property="username"></result>
        <result column="sex_" property="sex"></result>
    </resultMap>
    <!--通过用户id获取用户-->
    <select id="getUserById" parameterType="users" resultMap="userMap">
        select username username_,sex sex_  from users where id = #{id}
    </select>
    <!--通过用户名模糊查询用户,在这里如果参数为简单类型 则需要写死username为value,另外这里是#不是$是按原样输出-->
    <select id="getUsersByUserName" resultType="users" parameterType="users">
        select * from users where username LIKE '%${username}%'
    </select>
    <!--通过用户id删除用户-->
    <delete id="deleteUserById" parameterType="users">
        DELETE  FROM  users WHERE  id = #{id}
    </delete>
    <!--更新用户新i-->
    <update id="updateUser" parameterType="users" keyColumn="id">
        UPDATE  users set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
    </update>
    <!--新增用户-->
    <insert id="insertUser" parameterType="users">
        /*在插入前先获取索引值*/
        <selectKey keyProperty="id" resultType="String" order="BEFORE">
            select sec_users.nextval from dual
        </selectKey>
        insert into users (id,username,birthday,sex,address) values (#{id}, #{username}, #{birthday}, #{sex}, #{address})
    </insert>
    <!--根据条件查询用户-->
    <select id="getUserByCondition" resultType="users" parameterType="users">
        SELECT  * FROM USERS
        <where>
            <include refid="select_users_where"></include>
        </where>
    </select>
   <!-- 查询所有id在ids中的用户列-->
    <select id="getUserInIds" parameterType="usersEx" resultType="users">
        select * from users
        <where>
            <foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>
    <resultMap id="gridAndJzws" type="gridExt">
        <id column="land_pre_grid_id" property="land_pre_grid_id"></id>
        <result column="lcs_task_id" property="lcs_task_id"></result>
        <result column="grid_code" property="grid_code"></result>
        <result column="grid_no" property="grid_no"></result>
        <association property="landTask" javaType="LandTask">
            <id column="lcs_task_id" property="lcs_task_id"></id>
            <result column="task_name" property="task_name"></result>
        </association>
        <collection property="jzwList" ofType="Jzw">
            <id property="lpw_id" column="lpw_id"></id>
            <result column="bldg_no" property="bldg_no"></result>
            <result column="land_pre_grid_id" property="land_pre_grid_id"></result>
            <result column="survey_type" property="survey_type"></result>
        </collection>
    </resultMap>
    <select id="getGridAndAllJzwByGridId" parameterType="gridExt" resultMap="gridAndJzws" >
        select * from land_pre_grid grid,land_pre_jzw jzw where grid.land_pre_grid_id = jzw.land_pre_grid_id and grid.land_pre_grid_id = #{land_pre_grid_id}
    </select>

</mapper>

这里包含了增删改查的基本示例,多对一,一对多的查询示例包括collection ,和association的使用方式,动态sql中where if foreach的基本使用。
这里推荐一种编码风格,可以吧各个表需要显示的列名,已sql片段的形式单独拿出来,这样每次写sql的时候直接引用即可

username,password,sex

<select id="getUsersByUserName" resultType="users" parameterType="users">
    select
     <include refid="users"></include>
     from users where username LIKE '%${username}%'
</select> 

java调用

 InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        try {

            Users users = new Users();
            users.setAddress("怀化");
            users.setUsername("王六");
            users.setBirthday(new Date());
            users.setSex("2");
            users.setId("13");
            Users findUser = session.selectOne("getUserById",users);
            System.out.println("getUserById***********"+findUser);

三:逆向工程

个人觉得逆向工程这个东西可谓是大大简化了开发成本,也降低了人工可能产生的错误率。不过机器的东西也有不足,它只是完成了单表查询的基本配置,对于关系型查询,多表查询它的sql并不能完成,还需要人工书写。
http://blog.csdn.net/h3243212/article/details/50778937

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值