A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

MyBatis 本是apache的一个开源项目iBatis,Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
MyBatis入门步骤————基于xml文件开发
  • 第一步:在classpath下配置SqlMapConfig.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文件
通常命名规范为. 实体类名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>
  • 第三步:加载mapper.xml文件,将配置文件配置到SqlMapConfig.xml中.
[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>
  • 添加selectKey实现将主键返回
  • keyProperty:返回的主键存储在pojo中的哪个属性
  • order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
  • resultType:返回的主键是什么类型
  • LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。

第二种: 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{某列}



传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

2 个回复

倒序浏览
入门干货  
回复 使用道具 举报
期待更多的更新
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马