X  
登录

还没有账号?立即注册

忘记密码?
登陆
X  
注册

已经有账号?马上登陆

获取验证码
重新获取(60s)
立即注册
统计
  • 建站日期:2021-03-10
  • 文章总数:518 篇
  • 评论总数:155 条
  • 分类总数:32 个
  • 最后更新:4月20日
文章 MyBatis

Mybatis全面需要注意的事项和知识点,复习必备

梦幻书涯
首页 MyBatis 正文

   jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8
jdbc.username=root
jdbc.password=8438031100


测试类


 private InputStream in;
    private IAcountDao iAcountDao;
    private SqlSession session;

    @Before
    public void init() throws IOException {
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // SqlSession session = factory.openSession(true);自动提交事务,就不需要手动session.commit();
        session = factory.openSession(false);//默认为false
        iAcountDao = session.getMapper(IAcountDao.class);
    }

    @After
    public void destory() throws IOException {
        //提交事务
        session.commit();
        //释放资源
        session.close();
        //关闭流
        in.close();
    }

    @Test
    public void TestFindAll() {
        List<Acount> all = iAcountDao.findAll();
        for (Acount acount : all) {
            System.out.println(acount);
        }
    }

    @Test
    public void TestFindByid() {
        Acount byId = iAcountDao.findById(4);
        System.out.println(byId);

    }


注解形式的daoimpl



@Select("select * from user")
    @Results(id = "UserBeanMap", value = {
            @Result(column = "acountidd", property = "acountid")
    })
    List<UserBean> FindAll();


    @Select("select * from user where userid = #{uid} ")
    @ResultMap("UserBeanMap")
    UserBean findById(Integer userId);


    /**
     * 保存用户
     *
     * @param user
     */
    @Insert(" insert into user values(null,#{username},#{password},#{address},#{acountid})")
    @SelectKey(keyColumn = "userid", keyProperty = "userid", resultType = Integer.class, before = false, statement = {"select last_insert_id()"})
    int saveUser(UserBean user);//int 代表变动多少行





 @Select("select * from acount")
    @Results(id = "acountMap", value = {
            @Result(id = true, property = "acountid", column = "acountid"),
            @Result(property = "name", column = "name"),
            @Result(property = "money", column = "money"),
            @Result(property = "userid", column = "userid"),
            @Result(property = "userBean", column = "userid",
                    one = @One(select = "com.sise.dao.IUserDao.findById", fetchType = FetchType.LAZY))

    })
    List<Acount> findAll();

    @Select("select * from user")
    @Results(id = "UserBeanMap", value = {
            @Result(id = true, property = "userid", column = "userid"),
            @Result(property = "username", column = "username"),
            @Result(property = "password", column = "password"),
            @Result(property = "address", column = "address"),
            @Result(property = "acountid", column = "acountidd"),
            @Result(property = "list", column = "acountidd",
                    many = @Many(select = "com.sise.dao.IAcountDao.findById", fetchType = FetchType.LAZY))

    })
    List<UserAcount> findAllAU();


    @Select("select * from acount where userid = #{uid} ")
    Acount findById(Integer acountid);

    //个人理解就是使用自己自定义的Provider类,用该类的办法构造该sql语句
    //type:类的字节码
    //method:构造sql语句的办法
    //一些参数接受遇到再解决
    @SelectProvider(type = UserDaoProvider.class, method = "findUserByValues")
    @Results(value = {@Result(property = "acountid",column = "acountidd")})
    List<UserBean> findByValues(UserBean userBean);

    class UserDaoProvider {
        public String findUserByValues(UserBean userBean) {
            String sql = "SELECT * FROM user where 1=1 ";
            if (userBean.getUsername() != null && userBean.getUsername() != "") {
                sql += " and username LIKE CONCAT('%',#{username},'%')";
            }
            if (userBean.getAddress() != null && userBean.getAddress() != "") {
                sql += " and address LIKE CONCAT('%',#{address},'%')";
            }
            System.out.println("sql=" + sql);
            return sql;
        }
    }
}





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>
<!--
 <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
        <property name="username" value="root"/>
        <property name="password" value="8438031100"/>
    </properties>

-->
<!--
可以以绝对路径的文件导入相关属性   ${}引用,前面必须加file:///,三个///一个是转义字符
-->
    <!-- 配置properties-->
<!--    <properties resource="jdbcConfig.properties"></properties>-->
    <properties url="file:///D:Idea_ItemSSMZhengHesrcmainresourcesjdbcConfig.properties">
    </properties>


<!--
在主配置文件配置了别名就可以在映射配置文件中直接用
配置别名
    <typeAlias type="com.ssm.domain.UserBean" alias="userbean"/>
            以后写userbean就代表com.ssm.domain.UserBean


     <package name="com.ssm.domain"/>
            代表该文件夹下的所有类名就是别名,也就是UserBean代表com.ssm.domain.UserBean,不区分大小写


-->
    <typeAliases>
        <package name="com.ssm.domain"/>
<!--        <typeAlias type="com.ssm.domain.UserBean" alias="userbean"/>-->
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <!--
                POOLED:连接池的思想
                UNPOOLED:非连接池的思想,每次连接都创建connection对象jndi
                -->
<!--

  <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>*/

-->
                <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:映射文件的位置

-->
    <mappers>
<!--        XML配置形式,resource="com/ssm/dao/IUserDao.xml"    /分割
            注解形式:class="com.ssm.dao.IUserDao"              .分割
            两种配置都支持
                    <package name="com.ssm.dao"/>
-->
        <package name="com.ssm.dao"/>
    </mappers>
</configuration>








<?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">
<!--namespace写的是全路径与数据库有关的接口-->
<mapper namespace="com.ssm.dao.IAcountDao">

<resultMap id="userBeanMap" type="acount">
    <id property="acountid" column="acountid"></id>
    <result property="userid" column="userid"/>
    <result property="name" column="name"/>
    <result property="money" column="money"/>
    <association property="userBean" column="userid" javaType="UserBean">
        <id property="userid" column="userid"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="address" property="address"></result>
        <result column="acountid" property="acountid"></result>
    </association>
</resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="userBeanMap" >
     SELECT a.*,u.* FROM acount a ,USER u WHERE a.`userid`=u.`userid`
    </select>

<!--    新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相-->
<!--    当于我们要在新增后将自动增长 auto_increment 的值返回。-->

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="UserBean">
        <!--这个作用就是当插入成功后(later),就执行查询最新插入的数据id,然后返回来,最终将id复制到该对象上-->
        <selectKey keyProperty="userid" keyColumn="userid" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user values(null,#{username},#{password},#{address},#{acountid})
    </insert>


    <!-- 更新用户 -->
    <update id="updateUser" parameterType="UserBean">
      update user set username=#{username},password=#{password},address=#{address},acountid=#{acountid} where userid=#{userid}
    </update>


    <!-- 删除用户-->
    <!--#{id}代表办法的参数,因为只有一个参数,名字随意写-->
    <delete id="deleteUser" parameterType="int">
    delete from user where userid=#{id}
</delete>


    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="int" resultMap="userBeanMap">
    select * from user where userid=#{id}
</select>


    <!-- 根据名称模糊查询 -->
    <select id="findByName" parameterType="string" resultMap="userBeanMap">
        <!--

                select * from user where username like #{name}
                            这样写就需要传的值带有   %王%
                 select * from user where username like '%${value}%'
                            这样写就需要传的值带有   王

        -->
        select * from user where username like #{name}
    </select>


    <select id="findTotal" resultType="int">
        select count(userid) from user
--         select count(*) from user
    </select>


    <!-- 根据queryVo的条件查询用户 -->
    <select id="findUserByVo" parameterType="com.ssm.domain.QueryVo" resultMap="userBeanMap">
        select * from user
        <where>
            <if test="user!=null">
                and username like #{user.username}
            </if>
        </where>
    </select>


</mapper>













<?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">

<!--

细节:
parameterType 属性:

代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

sql 语句中使用#{}字符:

它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。

具体的数据是由#{}里面的内容决定的。

#{}中内容的写法:
由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。
它用的是 ognl 表达式。
ognl 表达式:
它是 apache 提供的一种表达式语言,全称是:
Object Graphic Navigation Language 对象图导航语言
它是按照一定的语法格式来获取数据的。
语法格式就是使用 #{对象.对象}的方式

#{user.username}
它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用

getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.

而直接写 username。


#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
型值,#{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简
单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。


resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类
型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。

id 标签:用于指定主键字段标签
result 标签:用于指定非主键字段标签
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称


properties(属性)
property
settings(全局配置参数)
setting

-typeAliases(类型别名)
-typeAliase

-package
-typeHandlers(类型处理器)
-objectFactory(对象工厂)
-plugins(插件)
-environments(环境集合属性对象)
-environment(环境子属性对象)
-transactionManager(事务管理)
-dataSource(数据源)
-mappers(映射器)
-mapper
-packag


properties 标签配置
 配置连接数据库的信息
resource 属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下
resource="jdbcConfig.properties"
url 属性:
URL: Uniform Resource Locator 统一资源定位符
http://localhost:8080/mystroe/CategoryServlet URL
协议 主机 端口 URI
URI:Uniform Resource Identifier 统一资源标识符
/mystroe/CategoryServlet
它是可以在 web 应用中唯一定位一个资源的路径

<properties url=
            file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.prop
        erties">
        </properties>

-->
<!--namespace写的是全路径与数据库有关的接口-->
<mapper namespace="com.ssm.dao.IUserDao">
    <!--    -->
    <resultMap id="userBeanMap" type="userbean">
        <!--      主键
        上面的Type="JavaBean类的名字,不区分大小写,而且property="username"
        其中的username就是该类的属性名称
        -->
        <id property="userid" column="userid"></id>
        <!--      非主键-->
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
        <result property="address" column="address"></result>
        <result property="acountid" column="acountid"></result>
    </resultMap>

    <!--   当在SqlMapConfix配置了别名这里就可以引用-->
    <!--    <select id="FindAll" resultMap="userBeanMap">   记得是resultMap而不是resultType

    为何这样写,当数据库的列名和javabean的属性名不一样时候,就要这样配置,导致一一对应,然后就可以直接引用

          parameterType="Javabean或者int,String,Double...."
          resultType="int/String或者javaBean"
    -->

    <!-- 查询所有 -->
    <select id="FindAll" resultMap="userBeanMap"
    >select * from user;
    </select>

<!--    新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相-->
<!--    当于我们要在新增后将自动增长 auto_increment 的值返回。-->

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="UserBean">
        <!--这个作用就是当插入成功后(later),就执行查询最新插入的数据id,然后返回来,最终将id复制到该对象上-->
        <selectKey keyProperty="userid" keyColumn="userid" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user values(null,#{username},#{password},#{address},#{acountid})
    </insert>


    <!-- 更新用户 -->
    <update id="updateUser" parameterType="UserBean">
      update user set username=#{username},password=#{password},address=#{address},acountid=#{acountid} where userid=#{userid}
    </update>


    <!-- 删除用户-->
    <!--#{id}代表办法的参数,因为只有一个参数,名字随意写-->
    <delete id="deleteUser" parameterType="int">
    delete from user where userid=#{id}
</delete>


    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="int" resultMap="userBeanMap">
    select * from user where userid=#{id}
</select>


    <!-- 根据名称模糊查询 -->
    <select id="findByName" parameterType="string" resultMap="userBeanMap">
        <!--

                select * from user where username like #{name}
                            这样写就需要传的值带有   %王%
                 select * from user where username like '%${value}%'
                            这样写就需要传的值带有   王

        -->
        select * from user where username like #{name}
    </select>


    <select id="findTotal" resultType="int">
        select count(userid) from user
--         select count(*) from user
    </select>


    <!-- 根据queryVo的条件查询用户 -->
    <select id="findUserByVo" parameterType="com.ssm.domain.QueryVo" resultMap="userBeanMap">
        select * from user
        <where>
            <if test="user!=null">
                and username like #{user.username}
            </if>
        </where>
    </select>


</mapper>




 <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>compile</scope>
    </dependency>


版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2020-8-6,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
SpringMVC 和 Struts2 的优略分析
« 上一篇
Spring全面需要注意的事项和知识点,复习必备
下一篇 »

发表评论

HI ! 请登录
注册会员,享受下载全站资源特权。
登陆 注册
永远的少年,永远的梦

热门文章