J2EE进阶学习——Mybatis(二):入门使用(案例)

log4j.properties

# Global logging configuration
# 在开发环境下日志级别要设置成debug,生产环境设置成info或error
log4j.rootLogger=debug, stdout
#Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

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">
            <!-- 使用jdbc事务管理,事务控制由mybatis -->
            <transactionManager type="JDBC"/>
            <!-- 数据库连接池,由mybatis管理  -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="xxxx"/>
                <property name="password" value="xxxxxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>

</configuration>

工程结构

注意:

1.这里要把config这个包设置为source包


否则无法加载包内的xml文件
2.讲一个我一开始遇到的问题,就是我在运行时报了一个isClosed() method is abstract的错误,在查遍全网都没有解决方案的时候,我试着重新下了一个mysql连接的jar包,问题就解决了,我推荐一个下载jar包的网站
http://www.java2s.com/Code/Jar/c/Downloadc3p0095pre4jar.htm

1.根据用户id(主键)查询用户信息

映射文件

mapper代理开发映射文件命名:xxxMapper.xml
在映射文件中配置sql语句

@Test
    public void findUserByIdTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过sqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于namespace+"."statement的id
        //第二个参数:指定映射文件中所匹配的parameterType类型的参数
        //sqlSession.selectOne结果是与映射文件中所匹配的resultType类型的对象
        User user = sqlSession.selectOne("test.findUserById",1);
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }

User.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命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊的重要作用
-->
<mapper namespace="test">
</mapper>

查询时的配置

<select id="findUserById" parameterType="int" resultType="com.TiHom.mybatis.po.User">
        select * from user where id=#{value}
    </select>

注意:

1.id:标识,映射文件中的sql,称为statement的id
2.paramType:指定输入参数的类型,如int、String等等
3.#{}表示一个占位符号
4.#{id}:其中的id表示接收输入的参数,参数名称是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
5.resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成java对象

2.根据用户姓名进行模糊查询

@Test
    public void findUserByNameTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过sqlSession操作数据库
        //list中的user和映射文件中resultType所指定的类型一致
        List<User> userList = sqlSession.selectList("test.findUserByName","as");
        System.out.println(userList);
        sqlSession.close();
    }
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.TiHom.mybatis.po.User">
        SELECT * FROM user WHERE username LIKE '%${value}%'
    </select>

注意:

1.#{}表示一个占位符,#{}接收输入的参数
2.${}表示一个拼接符号,会引用sql注入,所以不建议使用

3.添加用户

<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User">
        INSERT INTO user(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
    </insert>
@Test
    public void insertUserTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setUsername("王小军");
        user.setBirthday(new Date());
        user.setSex("m");
        user.setAddress("广东");
        sqlSession.insert("test.insertUser",user);
        //提交事务
        sqlSession.commit();
        //关闭
        sqlSession.close();
    }

注意:

  1. #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 (pojo——>简单的JavaBean对象)

4.删除用户

<delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM user WHERE id=#{id}
    </delete>
@Test
    public void deleteUserTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.delete("test.deleteUser",5);
        sqlSession.commit();
        sqlSession.close();
    }

5.更新用户

注意:

1.分析:
需要传入用户的id
需要传入用户的更新信息
parameterType指定user对象,包括id和更新信息,注意:id必存在
#{id}:从输入user对象中获取id属性值

<update id="updateUser" parameterType="com.TiHom.mybatis.po.User">
        UPDATE user SET username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} WHERE id=#{id}
    </update>
@Test
    public void updateUserTest() throws IOException {
        //mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂sqlSessionFactory,传入mybatis的配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User();
        user.setId(5);
        user.setUsername("lihua");
        user.setSex("m");
        user.setBirthday(new Date());
        user.setAddress("北京");
        sqlSession.update("test.updateUser",user);
        sqlSession.commit();
        sqlSession.close();
    }

6.总结:

1.selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)
2.selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne
3.#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashMap。如果你接收的是简单类型,#{}中可以写成value或者其他的名称

重点:

自增主键的返回

1.mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键 :LAST_INSERT_ID()
是在insert之后调用,修改insert配置

<insert id="insertUser" parameterType="com.TiHom.mybatis.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            <!--
            将插入数据的主键返回,返回到user对象中
            SELECT LAST_INDEX_ID():得到刚insert进去记录的主键值,只适用于自增主键
            keyProperty:将查询到的主键值设置到parameterType指定的对象的哪个属性
            order:执行顺序,相对insert语句来说
            resultType:指定结果的类型
            -->
            SELECT LAST_INDEX_ID()
        </selectKey>
        INSERT INTO user(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
    </insert>

非自增主键返回(使用uuid())

2.使用mysql的uuid()函数生成主键,需要修改表中id字段类型为String,长度类型设置为35位。

  • 执行思路:先通过uuid()查询到主键,将主键输入到sql语句中。执行uuid()语句顺序相对于insert语句之前执行。

推荐阅读更多精彩内容