黑马程序员技术交流社区

标题: 【郑州校区】MyBatis 入门开发 —-基础入门 [打印本页]

作者: 我是楠楠    时间: 2017-12-6 09:59
标题: 【郑州校区】MyBatis 入门开发 —-基础入门
MyBatis 本是apache的一个开源项目iBatis,Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
MyBatis入门步骤————基于xml文件开发
[AppleScript] 纯文本查看 复制代码
<?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>

        <environments default="development">
            // 配置一个数据库连接
            <environment id="development">
                <transactionManager type="JDBC"/>
                <!-- 配置数据库连接信息 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/userdb"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>

        </environments>

        </configuration>



通常命名规范为. 实体类名mapper.xml (Usermapper.xml)
[AppleScript] 纯文本查看 复制代码
<?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="test1">

     // 这里写sql语句   
    <!--根据id 查询-->
    <select id="findUserById" parameterType="int" resultType="cn.fy.domain.User">
    SELECT id,username,birthday,sex,address  FROM USER WHERE id = #{id}
    </select>   

    </mapper>
[AppleScript] 纯文本查看 复制代码
<configuration>
        ...
        // 加载mapper.xml配置文件
        <mappers>
        <!-- 注册userMapper.xml文件, userMapper.xml位于cn.fy.mapping这个包下,所以resource写成cn/fy/mapping/userMapper.xml -->
        <mapper resource="cn/fy/mapping/userMapper.xml"/>
        </mappers>

        </configuration>



[AppleScript] 纯文本查看 复制代码
public class MyBatisTest {

    @Test
    public void test1(){
        SqlSession session = MyBatisUtil.getSession();
        // 命名空间.id值
        User user = session.selectOne("test1.findUserById", 10);
    }

    }



工具类:


[AppleScript] 纯文本查看 复制代码
public class MyBatisUtil {
    public static SqlSession getSession() {

        /**
         *  注意:
         *  1. "SqlMapConfig.xml" 在cn.itcast.test 包下找文件. 由于我使用的是maven开发,SqlMapConfig.xml放在了resource中,所以不加 / 也能正常读取
         *  2. "/SqlMapConfig.xml" 在class路径下找
         */
        String config = "SqlMapConfig.xml";
        //InputStream is = Resources.getResourceAsStream(config)
        InputStream is = MyBatisUtil.class.getClassLoader()
                .getResourceAsStream(config);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

        SqlSession session = factory.openSession();
        return session;

    }

    }


添加
在user.xml中添加sql
[AppleScript] 纯文本查看 复制代码
<!-- 添加用户 -->
    <insert id="insertUser" parameterType="cn.fy.domain.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address})
    </insert>
    // 测试

     @Test
    public void insert(){
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setUsername("knight");
        user.setAddress("河南郑州");
        user.setSex("1");

        session.insert("test1.insertUser", user);
        session.commit();
    }
—主键的返回—
第一种: mysql 自增主键返回
[AppleScript] 纯文本查看 复制代码
<insert id="insertUser" parameterType="实体类">
        //after 因为自增的主键是在执行完 insert语句后产生的
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
        </selectKey>
        insert into user(username,birthday,sex,address)
        values(#{username},#{birthday},#{sex},#{address});
        </insert>

第二种: Mysql使用 uuid实现主键.
[AppleScript] 纯文本查看 复制代码
<insert  id="insertUser" parameterType="实体类">
    <selectKey resultType="java.lang.String" order="BEFORE"
    keyProperty="id">
    select uuid()
    </selectKey>
    insert into user(id,username,birthday,sex,address)
             values(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
第三种: Oracle使用序列生成主键
[AppleScript] 纯文本查看 复制代码
<insert  id="insertUser" parameterType="实体类">
    <selectKey resultType="java.lang.Integer" order="BEFORE"
    keyProperty="id">
    SELECT 自定义序列.NEXTVAL FROM DUAL
    </selectKey>
    insert into user(id,username,birthday,sex,address)
             values(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
删除
在user.xml中添加sql
[AppleScript] 纯文本查看 复制代码
 <!-- 删除用户 -->
        <delete id="deleteUserById" parameterType="int">
            delete from user where id=#{id}
        </delete>


        @Test
        public void delete(){
            SqlSession session = MyBatisUtil.getSession();
            session.delete("test1.deleteUserById", 31);
            session.commit();
        }
修改
在user.xml中添加sql
[AppleScript] 纯文本查看 复制代码
 <!-- 更新用户 -->
    <update id="updateUser" parameterType="cn.fy.domain.User">
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
        where id=#{id}
    </update>

     @Test
    public void update(){
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setId(38);
        user.setUsername("fy");
        user.setAddress("zz");
        user.setSex("1");

        session.insert("test1.updateUser", user);
        session.commit();
    }
模糊查询
在user.xml中添加sql
[AppleScript] 纯文本查看 复制代码
  <!-- 模糊查询 -->
    <select id="findUserByUsername" parameterType="java.lang.String"
            resultType="cn.fy.domain.User">
        select * from user where username like '%${value}%'
    </select>

    <!--
    根据用户名称模糊查询用户信息列表
    resultType:不管结果集记录的数量有多少,resutType指定单条记录所映射的java对象
    resultType映射规则是sql查询列名和pojo的属性名必须一致方可完成映射
    ${}:表示一个sql拼接符号,相当于字符串的拼接:
    “SELECT * FROM USER WHERE username LIKE '%” + ${}表示的串 + “%'”
    ${}:如果接收输入参数是一个简单类型,${} 中只能写value

    ${}实现sql拼接是无法防止sql注入的。

     -->


       @Test
    public void dimFind() {
        SqlSession session = MyBatisUtil.getSession();

        List<User> list = session.selectList("test1.findUserByUsername", "关键字");
        System.out.println(list);

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



【郑州校区】Python3 创建虚拟环境
【郑州校区】python基础之基本指令汇总
【郑州校区】Ubuntu 如何创建快捷方式

【郑州校区】python基础班之Linux 终端命令格式
【郑州校区】python基础班笔记之python操作系统
【郑州校区】subline 取消自动更新提示
【郑州校区】常用 Linux 命令的基本使用
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出


作者: 小小的人儿    时间: 2017-12-6 10:23
入门干货  
作者: 我是媛媛    时间: 2017-12-7 11:35
期待更多的更新




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2