MyBatis 入门开发

来源:互联网 发布:midaspro3离线编辑软件 编辑:程序博客网 时间:2024/06/01 18:59

MyBatis 入门开发 —-基础入门

                        ONE Goal , ONE Passion !

MyBatis 本是apache的一个开源项目iBatis,Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。


MyBatis入门步骤————基于xml文件开发

  • 第一步:在classpath下配置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>        <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)

<?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中.
<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>
  • 第四步: 测试
public class MyBatisTest {    @Test    public void test1(){        SqlSession session = MyBatisUtil.getSession();        // 命名空间.id值        User user = session.selectOne("test1.findUserById", 10);    }    }

工具类:

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

 <!-- 添加用户 -->    <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 自增主键返回

<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>
  1. 添加selectKey实现将主键返回
  2. keyProperty:返回的主键存储在pojo中的哪个属性
  3. order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
  4. resultType:返回的主键是什么类型
  5. LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。

第二种: Mysql使用 uuid实现主键.

<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使用序列生成主键

<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

 <!-- 删除用户 -->        <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

    <!-- 更新用户 -->    <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

    <!-- 模糊查询 -->    <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类型转换, pojoparameterType{}括号中只能是value。

建议使用#{}. 但有时必须使用.:ORDERBY{某列}