23 Mybatis

Mybatis

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>

<!--导入配置文件jdbcConfig.properties,<property>可以直接用${}调用配置文件内的属性-->
<properties resource="jdbcConfig.properties"></properties>
<settings>
    <!--设置支持二级缓存(默认是true)-->
    <setting name="cacheEnabled" value="true"/>
    <!--设置延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!--设置别名-->
<typeAliases>
    <!--给domain包内所有类设置了别名。引用domain包内所有类时,不用再写全限定类名,可以直接写类名-->
    <package name="cn.domain"></package>
</typeAliases>

<!--设置环境变量-->
<environments default="mysql">
    <environment id="mysql">
        <!--设置事务-->
        <transactionManager type="JDBC"></transactionManager>
        <!--设置连接数据库的信息-->
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"></property>     <!--${}内写配置文件对于的属性-->
            <property name="url" value="${url}"></property>
            <property name="username" value="${username}"></property>
            <property name="password" value="${password}"></property>
        </dataSource>
    </environment>
</environments>
<!--告知mybatis接口配置文件位置-->

<mappers>
    <!--  <mapper resource="cn/dao/UserDao.xml"></mapper>    -->
    <!--导入cn.dao包内所有接口对于的配置文件-->
    <package name="cn.dao"></package>
</mappers>
</configuration>

UserDao.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="cn.dao.UserDao">
<!--设置二级缓存支持-->
<cache></cache>

<!-- 建立User实体与数据库表的对应关系 -->
<resultMap id="userMap" type="User">
    <id property="id" column="id"></id>
    <result column="username" property="username"></result>
    <result column="birthday" property="birthday"></result>
    <result column="sex" property="sex"></result>
    <result column="address" property="address"></result>
    <collection property="accounts" column="id" ofType="Account" select="cn.dao.AccountDao.findById">
    </collection>
</resultMap>

<select id="findAll" resultMap="userMap" useCache="true">    <!--设置了缓存支持-->
    select * from user
</select>
<insert id="save" parameterType="cn.domain.User">

    <selectKey order="AFTER" resultType="int" keyColumn="id" keyProperty="id">    <!-- 获取保存该数据后,数据库自动获得的id -->
        select last_insert_id();
    </selectKey>
    insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<update id="update" parameterType="cn.domain.User">
    update user set sex=#{sex} where id=#{id}
</update>

<delete id="deleteById" parameterType="Integer">
    delete from user where id=#{id}
</delete>
<select id="findOneByName" parameterType="String" resultType="cn.domain.User">
    select * from user where username=#{s}
</select>
<select id="find" parameterType="String" resultType="User">
    select * from user where username like #{aa}
</select>
<select id="getCount" resultType="Integer">
    select count(*) from user
</select>
<select id="findByCondition" resultType="User" parameterType="user">
    select * from user
    <where>                                                                     <!-- where的使用 -->
        <if test="sex!=null and sex!=''">                                       <!-- if的使用 -->
            and sex like #{sex}
        </if>
        <if test="id!=null and id!=''">
            and id like #{id}
        </if>
        <if test="username!=null and username!=''">
            and username like #{username}
        </if>
    </where>
</select>
<select id="findByIds" parameterType="queryvo" resultType="user">
    select * from user 
    <where>
        <if test="ids!=null and ids.size>0">
            <foreach collection="ids" open="id in (" close=")" item="id" separator=",">         <!-- foreach的使用 -->
<!---->            #{id}
            </foreach>
        </if>
    </where>
</select>
</mapper>

oracle

1. oracle会为每一个用户,默认创建数据库,在下面可以创建表
2. Oracle不会自动提交,执行后要按commit.
3. 在本地,通过客户端远程连接Oracle   报:error , 15241,not lisenner
    原因:监听服务没有启动(假启动)
    Oracle的核心服务有两个:
        * 监听服务 OracleOraDb10g_home1TNSListener
        * 服务器核心 OracleServiceORCL
    解决步骤:
        步骤一:找到监听对应的配置文件,修改一下即可
        C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN:
        listener.ora: 修改配置文件的ip 和 windowsserver2003的ip一样
        tnsnames.ora:修改配置文件的ip 和 windowsserver2003的ip一样
        步骤二:查找 windowsserver2003的ip: 在cmd--dos命令行:ipconfig/all
        步骤三:找到步骤二说的两个服务,重启服务即可      鼠标右键点 电脑图标-------管理---服务和应用程序---服务 :点击重启
                【打开服务管理dos命令: services.msc】
4. 报错误:连接到空闲列程
    原因:之前使用oracle没有正常关闭
    解决步骤:
        步骤一: sqlplus  sys/root  as sysdba
        步骤二: shutdown abort
        步骤三: startup

mybtis插件:PageHelper的使用

1. 介绍
    PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。
2. 所需jar包目标
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
    </dependency>
3. 配置注意事项
    特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor 。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
4. mybatis.xml配置 [ssm可在applicationContext.xml中配置,见第5点]
    <!--
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?,
    typeAliases?, typeHandlers?,
    objectFactory?,objectWrapperFactory?,
    plugins?,
    environments?, databaseIdProvider?, mappers?
    -->
    <plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
    <property name="参数名称" value="参数值"/>
    </plugin>
    </plugins>
5. 在 ApplicationContext.xml配置文件中配置拦截器插件      [ssm项目中使用]
    * 使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注意其他配置 -->
            <property name="plugins">
                <array>
                    <bean class="com.github.pagehelper.PageInterceptor">
                        <property name="properties">
                            <!--使用下面的方式配置参数,一行配置一个 -->
                            <props>
                                <prop key="helperDialect">oracle</prop>
                                <prop key="reasonable">true</prop>
                            </props>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>
6. 分页插件参数介绍
    1. helperDialect :分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect 属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:oracle , mysql , mariadb , sqlite , hsqldb ,postgresql , db2 , sqlserver , informix , h2 , sqlserver2012 , derby特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012 ,否则会使用 SqlServer2005 的方式进行分页。你也可以实现 AbstractHelperDialect ,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
    2. offsetAsPageNum :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
    3. rowBoundsWithCount :默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,使用 RowBounds 分页会进行 count 查询。
    4. pageSizeZero :默认值为 false ,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit =0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
    5. reasonable :分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages (超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询。
    6. params :为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable ,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
    7. supportMethodsArguments :支持通过 Mapper 接口参数来传递分页参数,默认值 false ,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和ArgumentsObjTest 。
    8. autoRuntimeDialect :默认值为 false 。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择 sqlserver2012 ,只能使用 sqlserver ),用法和注意事项参考下面的场景五。
    9. closeConn :默认值为 true 。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认 true 关闭,设置为false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
7.  PageHelper.startPage 静态方法调用
    * 使用方法
        这种方式是我们要掌握的 在你需要进行分页的 MyBatis 查询方法前调用PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
    * 代码 :
        //参数pageNum是页码值     参数pageSize代表是每页显示条数
        PageHelper.startPage(1,5);
        return ordersDao.findAll();
8. PageInfo类使用
    作用: 类中包含页面所需的分页的详细信息,如总页数,总记录数等等。
    构造方法 : PageInfo pageInfo = new PageInfo(List<数据类>)    【可以将查询到的数据集合封装到pageInfo,一起传到页面】

注解的使用

1. @Insert:实现新增
2. @Update:实现更新
3. @Delete:实现删除
4. @Select:实现查询
5. @Result:实现结果集封装
6. @Results:可以与@Result 一起使用,封装多个结果集
7. @ResultMap:实现引用@Results 定义的封装
8. @One:实现一对一结果集封装
9. @Many:实现一对多结果集封装
            @Results({
                @Result(id=true,property = "id",column = "id"),
                @Result(property="username",column = "username"),
                @Result(property="email",column = "email"),
                @Result(property="phoneNum",column = "phoneNum"),
                @Result(property="status",column = "status"),
                @Result(property="roles",column = "id",javaType =List.class,many =
                @Many(select = "cn.itheima.dao.RoleDao.findRoleByUserId"))
    
             })
10. @CacheNamespace:实现注解二级缓存的使用
11. @Param 多个参数时,用于指定参数对应引用
    @Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
       void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容