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语句之前执行。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容