使用IDEA和Mybatis实现CRUD(一)
2016-12-10 00:08
309 查看
1、新建一个Maven工程,在pom.xml中加入如下的配置,为了下载相关jar包
2、在resources目录下添加log4j.properties文件:为了记录信息,选择DEBUG模式
3、在resources目录下添加SqlMapConfig.xml文件:配置数据源的一些信息和映射文件的路径(相对路径),environments 采用development,transactionManager 采用JDBC,并使用连接池
4、在resources目录下添加Map文件:User.xml(在resources中新建一个Mapper文件夹,然后将User.xml放在此下)CRUD的xml配置都在这里
配置说明
namespace :命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。
parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
keyProperty:返回的主键存储在pojo中的哪个属性
order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
LAST_INSERT_ID():是mysql的函数
resultType:返回的主键是什么类型
5、在main.java中新建POJO文件:(新建po包):
6、在数据库中的表为:
7、新建测试文件:(test.java下)
项目结构如下
Mybatis解决jdbc编程的问题
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句。
4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
与hibernate不同
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
使用NameSpace新特性来实现CRUD请参考:使用IDEA和Mybatis实现CRUD(二)使用了NameSpace特性
<dependencies> <!-- mybatis核心包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <!-- mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.29</version> </dependency> <!-- junit测试包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- 日志文件管理包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> </dependencies>
2、在resources目录下添加log4j.properties文件:为了记录信息,选择DEBUG模式
# 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
3、在resources目录下添加SqlMapConfig.xml文件:配置数据源的一些信息和映射文件的路径(相对路径),environments 采用development,transactionManager 采用JDBC,并使用连接池
<?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?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/User.xml"></mapper> </mappers> </configuration>
4、在resources目录下添加Map文件:User.xml(在resources中新建一个Mapper文件夹,然后将User.xml放在此下)CRUD的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"> <!-- resultType使用注意:select查询出来 列名要和resultType指定的类型属性名对应。 #{},表示占位符,形如? --> <select id="findUserById" parameterType="int" resultType="po.User"> SELECT * FROM user WHERE id = #{value} </select> <insert id="addUser" parameterType="po.User"> <!-- 因为id是自增的,所以为了使用正确的id,需要使用到LAST_INSERT_ID()这个函数来查询出主键ID --> <!-- selectKey将主键返回,需要再返回 --> <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user VALUES (#{id},#{username},#{age}) </insert> <!-- 更新时,需要传入ID和更新的值,所以参数类型为User类型 --> <update id="updateUser" parameterType="po.User"> UPDATE user SET username=#{username} where id = #{id} </update> <delete id="deleteUser" parameterType="po.User"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
配置说明
namespace :命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。
parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
keyProperty:返回的主键存储在pojo中的哪个属性
order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
LAST_INSERT_ID():是mysql的函数
resultType:返回的主键是什么类型
5、在main.java中新建POJO文件:(新建po包):
package po; import java.io.Serializable; /** * Created by JasonTang on 09/12/2016. */ public class User implements Serializable{ private int id; private String username; private int age; 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + '}'; } }
6、在数据库中的表为:
CREATE TABLE user ( id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, age INT NOT NULL );
7、新建测试文件:(test.java下)
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import po.User; import java.io.IOException; import java.io.InputStream; /** * Created by JasonTang on 09/12/2016. */ public class MybatisTest { private static SqlSessionFactory sqlSessionFactory; private static SqlSession sqlSession; @Before public void init() throws IOException { //mybatis配置文件 String resource = "SqlMapConfig.xml"; InputStream input = Resources.getResourceAsStream(resource); //使用SqlSessionFactoryBuilder创建sessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input); //通过session工厂获取一个Sqlsession,sqlsession中包括了对数据库操作的sql方法 sqlSession = sqlSessionFactory.openSession(); } //查询需要数据库中有书库 @Test public void select(){ User user = sqlSession.selectOne("test.findUserById",1); System.out.println(user); } //插入时注意主键冲突 @Test public void insert(){ User user = new User(); user.setUsername("西瓜7"); user.setAge(17); sqlSession.insert("test.addUser", user); sqlSession.commit(); } @Test public void update(){ User u = new User(); u.setUsername("喇叭花"); u.setId(7); sqlSession.update("test.updateUser", u); sqlSession.commit(); } @Test public void delete(){ User u = new User(); u.setId(6); sqlSession.delete("test.deleteUser", u); sqlSession.commit(); } @After public void close(){ if(sqlSession != null) { sqlSession.close(); } } }
项目结构如下
Mybatis解决jdbc编程的问题
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句。
4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
与hibernate不同
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
使用NameSpace新特性来实现CRUD请参考:使用IDEA和Mybatis实现CRUD(二)使用了NameSpace特性
相关文章推荐
- 使用IDEA和Mybatis实现CRUD(二)使用了NameSpace特性
- 使用MyBatis对表执行CRUD操作——基于XML的实现
- 008 使用MyBatis,easyUI实现CRUD操作样例-CUD(CRUD完毕)
- 使用mybatis实现CRUD
- 使用MyBatis对表执行CRUD操作——基于XML的实现
- MyBatis中的动态SQL,实现不确定条件的CRUD-----使用Map来传递查询的参数
- 使用MyBatis配置方式实现CRUD
- 使用MyBatis对表执行CRUD操作——基于注解的实现
- 007 使用MyBatis,easyUI实现CRUD操作样例-R操作(重构)
- Mybatis Generator Configuration Eclipse自动生成代码工具使用及实现基本crud
- 使用MyBatis对表执行CRUD操作——基于XML的实现
- SpringBoot-使用Mybatis实现完整的CRUD和分页
- mybatis与spring的整合(使用接口实现crud)
- MyBatis 1章 入门(使用MyBatis完成CRUD)
- 使用c3p0技术实现对数据库crud操作的自定义封装
- Mybatis使用OSCache和EHcache实现二级缓存
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- 第十七天3月12日之一句代码实现crud操作(手动写的,没使用其他jar包和框架)
- Mybatis使用OSCache和EHcache实现二级缓存
- MyBATIS使用CRUD