查看“入门:入门程序”的源代码
←
入门:入门程序
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Mybatis]] == 需求 == # 根据用户id查询一个用户信息 # 根据用户名称模糊查询用户信息列表 # 添加用户 # 更新用户 # 删除用户 == 创建工程 == == 依赖包 == 包括:mybatis核心包、依赖包、数据驱动包<br/> [[File:Mybatis依赖包.png|300px]] == log4j.properties == 在classpath下创建'''log4j.properties''': * mybatis默认使用log4j作为输出日志信息 <syntaxhighlight lang="properties"> # Global logging configuration 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 </syntaxhighlight> == SqlMapConfig.xml == 在classpath下创建'''SqlMapConfig.xml''': <syntaxhighlight lang="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> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="mysql" /> </dataSource> </environment> </environments> </configuration> </syntaxhighlight> == po类 == Po类作为mybatis进行sql映射使用,po类通常与数据库表对应。<br/> User.java: <syntaxhighlight lang="java"> package cn.itcast.mybatis.po; import java.util.Date; public class User { //属性名和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } } </syntaxhighlight> == 程序编写 == === 查询 === ==== 映射文件 ==== 在classpath下的sqlmap目录下创建sql映射文件'''Users.xml''': <syntaxhighlight lang="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"> <mapper namespace="test"> <!-- 根据id获取用户信息 --> <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User"> select * from user where id = #{id} </select> <!-- 自定义条件查询用户列表 --> <select id="findUserByUsername" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> select * from user where username like '%${value}%' </select> </mapper> </syntaxhighlight> ==== 加载映射文件 ==== mybatis框架需要加载映射文件(在'''SqlMapConfig.xml'''中添加Users.xml),如下: <syntaxhighlight lang="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> ... <mappers> <mapper resource="sqlmap/User.xml"/> </mappers> </configuration> </syntaxhighlight> ==== 测试程序 ==== <syntaxhighlight lang="java"> public class Mybatis_first { //会话工厂 private SqlSessionFactory sqlSessionFactory; @Before public void createSqlSessionFactory() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 根据 id查询用户信息 @Test public void testFindUserById() { // 数据库会话实例 SqlSession sqlSession = null; try { // 创建数据库会话实例sqlSession sqlSession = sqlSessionFactory.openSession(); // 查询单个记录,根据用户id查询用户信息 User user = sqlSession.selectOne("test.findUserById", 10); // 输出用户信息 System.out.println(user); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } // 根据用户名称模糊查询用户信息 @Test public void testFindUserByUsername() { // 数据库会话实例 SqlSession sqlSession = null; try { // 创建数据库会话实例sqlSession sqlSession = sqlSessionFactory.openSession(); // 查询单个记录,根据用户id查询用户信息 List<User> list = sqlSession.selectList("test.findUserByUsername", "张"); System.out.println(list.size()); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } } </syntaxhighlight> === 添加 === ==== 映射文件 ==== 在'''Users.xml'''中添加: <syntaxhighlight lang="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"> <mapper namespace="test"> ... <!-- 添加用户 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <!-- selectKey将主键返回,需要再返回 --> <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> </mapper> </syntaxhighlight> ==== 测试程序 ==== 在'''Mybatis_first.java'''中添加: <syntaxhighlight lang="java"> public class Mybatis_first { ... // 添加用户信息 @Test public void testInsert() { // 数据库会话实例 SqlSession sqlSession = null; try { // 创建数据库会话实例sqlSession sqlSession = sqlSessionFactory.openSession(); // 添加用户信息 User user = new User(); user.setUsername("张小明"); user.setAddress("河南郑州"); user.setSex("1"); user.setPrice(1999.9f); sqlSession.insert("test.insertUser", user); //提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } } </syntaxhighlight> === 修改 === ==== 映射文件 ==== 在'''Users.xml'''中添加: <syntaxhighlight lang="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"> <mapper namespace="test"> ... <!-- 更新用户 --> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper> </syntaxhighlight> ==== 测试程序 ==== 在'''Mybatis_first.java'''中添加: <syntaxhighlight lang="java"> public class Mybatis_first { ... // 更新用户信息 @Test public void testUpdate() { // 数据库会话实例 SqlSession sqlSession = null; try { // 创建数据库会话实例sqlSession sqlSession = sqlSessionFactory.openSession(); // 添加用户信息 User user = new User(); user.setId(16); user.setUsername("张小明"); user.setAddress("河南郑州"); user.setSex("1"); user.setPrice(1999.9f); sqlSession.update("test.updateUser", user); // 提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } } </syntaxhighlight> === 删除 === ==== 映射文件 ==== 在'''Users.xml'''中添加: <syntaxhighlight lang="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"> <mapper namespace="test"> ... <!-- 删除用户 --> <delete id="deleteUserById" parameterType="int"> delete from user where id=#{id} </delete> </mapper> </syntaxhighlight> ==== 测试程序 ==== 在'''Mybatis_first.java'''中添加: <syntaxhighlight lang="java"> public class Mybatis_first { ... // 根据id删除用户 @Test public void testDelete() { // 数据库会话实例 SqlSession sqlSession = null; try { // 创建数据库会话实例sqlSession sqlSession = sqlSessionFactory.openSession(); // 删除用户 sqlSession.delete("test.deleteUserById",18); // 提交事务 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } } </syntaxhighlight> == 入门小结 == === namespace === namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离; * 注意:使用mapper代理方法开发,namespace有特殊重要的作用 === parameterType和resultType === # parameterType:指定输入参数类型,mybatis通过'''ognl'''从输入对象中获取参数值拼接在sql中。 # resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。 === #{}和${} === # <nowiki>#{}</nowiki>:表示一个'''占位符号''',通过<nowiki>#{}</nowiki>可以实现preparedStatement向占位符中设置值,'''自动进行java类型和jdbc类型转换'''; ##<nowiki>#{}</nowiki>可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,<nowiki>#{}</nowiki>括号中可以是value或其它名称。 ## <nowiki>#{}</nowiki>可以有效防止sql注入。 # <nowiki>${}</nowiki>:表示'''拼接sql串''',通过<nowiki>${}</nowiki>可以将parameterType传入的内容拼接在sql中且'''不进行jdbc类型转换'''; ## <nowiki>${}</nowiki>可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,<nowiki>${}</nowiki>括号中只能是value。 * 需要使用字段名而非字段值的情况下,应使用<nowiki>“${}”</nowiki>; *: 如,根据传入的字段名进行排序时:“<syntaxhighlight lang="java" inline>ORDER BY ${columnName}</syntaxhighlight>” === selectOne和selectList === # selectOne:查询一条记录,如果使用selectOne查询多条记录则抛出异常: #: <syntaxhighlight lang="xml"> org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3 at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70) </syntaxhighlight> # selectList:可以查询一条或多条记录。 === mysql自增主键返回 === 通过修改sql映射文件,可以将mysql自增主键返回: <syntaxhighlight lang="xml"> <!-- 添加用户 --> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <!-- selectKey将主键返回,需要再返回 --> <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> </syntaxhighlight> # '''selectKey''':添加selectKey实现将主键返回 # '''keyProperty''':返回的主键存储在pojo中的哪个属性 # '''order''':selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after # '''resultType''':返回的主键是什么类型 # '''LAST_INSERT_ID()''':是mysql的函数,返回auto_increment自增列新记录id值。 === Mysql使用uuid实现主键 === 需要增加通过“select uuid()”得到uuid值: <syntaxhighlight lang="xml"> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <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> </syntaxhighlight> * 注意这里使用的order是“BEFORE” === Oracle使用sequence生成主键 === 首先自定义一个序列(SEQUENCE)且用于生成主键,selectKey使用如下: <syntaxhighlight lang="xml"> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <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> </syntaxhighlight> * 注意这里使用的order是“BEFORE” === 关于Bean管理 === 未整合到spring时,SqlSessionFactory不能交给spring管理,需要自己操作: <syntaxhighlight lang="java"> public class Mybatis_first { //会话工厂 private SqlSessionFactory sqlSessionFactory; @Before public void createSqlSessionFactory() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 使用SqlSessionFactoryBuilder从xml配置文件中创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public void testFindUserById() { // 数据库会话实例 SqlSession sqlSession = null; try { // 创建数据库会话实例sqlSession sqlSession = sqlSessionFactory.openSession(); // SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等 // selectOne User user = sqlSession.selectOne("test.findUserById", 10); // selectList List<User> list = sqlSession.selectList("test.findUserByUsername", "张"); // insert sqlSession.insert("test.insertUser", user); // update sqlSession.update("test.updateUser", user); // delete sqlSession.delete("test.deleteUserById",18); ... } catch (Exception e) { e.printStackTrace(); } finally { if (sqlSession != null) { sqlSession.close(); } } } } </syntaxhighlight>
返回至“
入门:入门程序
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息