MyBatis入门教程及基础进阶
2016-05-03 17:31
1056 查看
转载请注明出处:http://blog.csdn.net/qq_15002323/article/details/51306354
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类—-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
下载相关jar包(mybatis-3.1.1.jar,mysql-connector-java-5.1.6-bin.jar)
新建libs文件夹,将上面的两个jar包添加进来,然后add to build path:
model中新建User类:
mapper中添加userMapper.xml:
conf.xml:
在test包下新建测试类Test.java:
完成了的效果就是这样滴:
那么调用语句随之也会改变:
那么传递多个参数咧,有几种方法,但是适合自己就是最好的,我比较喜欢用map:
同时修改调用代码:
测试通过:
这样我们用的时候就不用写全称了,直接写这个别名就行:
可能,我们编写的model与数据库字段不对应,这样还能正常运行程序吗?一试便知,修改User代码:
就只是将age换成了score了,运行程序:
很明显score这个属性没有被正常赋值,这个时候我们就需要用resultMap了,修改mapper下的userMapper.xml:
运行程序,期待结果吧:
这样就完美解决了表字段与类属性不对应的情况了。嗯嗯~~
那么数据库配置就这样写在xml里面是不是有失妥当,额,新建一个db.properties:
同时需要修改conf.xml配置文件:
完美运行啊有木有,目前就知道这么多了,我也是小白一枚,第一次学就写这个当笔记吧,要是有错误的地方读者一定要吐槽下,定当改正。拜拜(^__^) 嘻嘻……
MyBatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类—-Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
MyBatis之初体验
1.准备工作
创建“初体验”数据库(MySQL),设计简单表结构,填充测试数据:下载相关jar包(mybatis-3.1.1.jar,mysql-connector-java-5.1.6-bin.jar)
2.创建工程
新建一个普通Java工程新建libs文件夹,将上面的两个jar包添加进来,然后add to build path:
3.编码实现
在src目录新建三个package:model,mapper,test;model中新建User类:
package model; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
mapper中添加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的唯一,通常包名+文件名 --> <mapper namespace="mapper.userMapper"> <select id="findAll" resultType="model.User"> select * from user </select> </mapper>
conf.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/mybatis-tutorial" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- resource需要写成路径的形式 --> <mappers> <mapper resource="mapper/userMapper.xml"/> </mappers> </configuration>
在test包下新建测试类Test.java:
package test; import java.io.InputStream; import java.util.List; import model.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test { public static void main(String[] args) { String resource = "mapper/conf.xml"; InputStream is = Test.class.getClassLoader().getResourceAsStream( resource); // build接受不同的参数,可采取其他方法创建SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder() .build(is); SqlSession session = sessionFactory.openSession(); String statement = "mapper.userMapper.findAll"; // session拥有多个方法,可以自行研究 List<User> users = session.selectList(statement); for (User user : users) { System.out.println(user); } } }
完成了的效果就是这样滴:
4.激情测试
运行Test.java,观看控制台输出:提高
虽然只是个入门篇,但我们都有颗求知的心。嗯,学习学习= ̄ω ̄=参数传递
修改上述userMapper.xml,添加单个查询:<!-- 查询参数用#{}表示,注明parameterType类型 --> <select id="findUserByName" parameterType="String" resultType="model.User"> select * from user where name = #{name} </select>
那么调用语句随之也会改变:
String statement = "mapper.userMapper.findUserByName"; List<User> users = session.selectList(statement, "科比");
那么传递多个参数咧,有几种方法,但是适合自己就是最好的,我比较喜欢用map:
<select id="findUserByNameAndAge" parameterType="Map" resultType="model.User"> select * from user where name = #{name} and age = #{age} </select>
同时修改调用代码:
String statement = "mapper.userMapper.findUserByNameAndAge"; Map<String, String> params = new HashMap<String, String>(); params.put("name", "科比"); params.put("age", "18"); List<User> users = session.selectList(statement, params);
测试通过:
配置优化
程序猿都是非常懒的,反正我就这样。。上面mapper里面每次用到User类时,都需要写出全名resultType="model.User"。若是工程大了,写的地方多了,忒累了啊。我们可以给这个类起一个别名,这个需要在conf.xml的
<configuration></configuration>里面配置:
<typeAliases> <typeAlias alias="user" type="model.User"/> </typeAliases>
这样我们用的时候就不用写全称了,直接写这个别名就行:
<select id="findAll" resultType="user"> select * from user </select>
可能,我们编写的model与数据库字段不对应,这样还能正常运行程序吗?一试便知,修改User代码:
package model; public class User { private int id; private String name; private int score; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", score=" + score + "]"; } }
就只是将age换成了score了,运行程序:
很明显score这个属性没有被正常赋值,这个时候我们就需要用resultMap了,修改mapper下的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的唯一,通常包名+文件名 --> <mapper namespace="mapper.userMapper"> <resultMap type="user" id="user"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="score"/> </resultMap> <select id="findAll" resultMap="user"> select * from user </select> </mapper>
运行程序,期待结果吧:
这样就完美解决了表字段与类属性不对应的情况了。嗯嗯~~
那么数据库配置就这样写在xml里面是不是有失妥当,额,新建一个db.properties:
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis-tutorial username=root password=123456
同时需要修改conf.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> <!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". --> <properties resource="db.properties" /> <typeAliases> <typeAlias alias="user" type="model.User" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- resource需要写成路径的形式 --> <mappers> <mapper resource="mapper/userMapper.xml" /> </mappers> </configuration>
完美运行啊有木有,目前就知道这么多了,我也是小白一枚,第一次学就写这个当笔记吧,要是有错误的地方读者一定要吐槽下,定当改正。拜拜(^__^) 嘻嘻……
相关文章推荐
- Extjs4.0 最新最全视频教程
- OpenERP 的XML-RPC的实例+many2many,one2many,many2one...
- CSS3属性教程与案例分享
- jquery教程靠边站,一分钱不花让你免费学会jquery
- autoit入门教程小结第1/5页
- 用Photoshop 制作草地效果简明教程
- 比较完整简洁的Flash处理XML文档数据教程 上篇第1/3页
- VBS基础编程教程 (第1篇)
- SQLite教程(十一):临时文件
- VBS基础编程教程 (第3篇)
- PostgreSQL新手入门教程
- VBS教程:运算符-运算符(+)
- PostgreSQL教程(十):性能提升技巧
- PostgreSQL教程(二):模式Schema详解
- PostgreSQL教程(十三):数据库管理详解
- PostgreSQL教程(八):索引详解
- PostgreSQL教程(三):表的继承和分区表详解
- XML简易教程之三
- 如何使用jquery easyui创建标签组件
- ruby 数组使用教程