项目结构: mybaits的代码由github.com管理,地址: https://github.com/mybatis/mybatis-3/releases。 我们也可以在创建一个maven项目之后直接在maven项目中下载mybatis的依赖包,pom.xml文件代码如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.com</groupId> <artifactId>DemoToBoke2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- 导入mybatis需要的jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> </dependencies> <!-- 将maven中的servlet版本改为3.1并将jdk更新为1.8 --> <build> <finalName>DemoToBoke2</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>导入依赖包之后我们还需要在classpath下创建log4j.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%nmybatis默认使用log4j作为输出日志信息。最后,在classpath下创建mybatis-config.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/mydb?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> </configuration>mybatis-config.xml是mybatis 核心配置文件,上面文件的配置内容为数据源、事务管理。 配置好配置文件之后,我们就开始写我们的项目了: 数据库建表: 在数据库中建立user表,代码如下:
-- 如果存在用户表则删除 DROP TABLE IF EXISTS user; -- 建立数据库表 CREATE TABLE user( userId VARCHAR(50) PRIMARY KEY, username VARCHAR(50), password VARCHAR(50), age INT ); -- 插入数据 INSERT INTO user VALUES('S101','jack','123',18); INSERT INTO user VALUES('S102','lucy','456',18); INSERT INTO user VALUES('S103','王铁蛋','abc',20); INSERT INTO user VALUES('S104','mike','789',19);创建pojo类: pojo类作为mybatis进行sql映射使用,pojo类通常与数据库表对应,User.java如下:
package cn.com.demo.pojo; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ public class User { private String userId; private String username; private String password; private Integer age; public User() { super(); } public User(String userId, String username, String password, Integer age) { super(); this.userId = userId; this.username = username; this.password = password; this.age = age; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [userId=" + userId + ", username=" + username + ", password=" + password + ", age=" + age + "]"; } }映射文件: 在resources下 的mappers目录下创建sql映射文件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"> <mapper namespace="test"> </mapper>namespace: 命名空间,用于隔离sql语句,还有一层非常重要的作用后面会说到 mybatis框架需要加载映射文件,创建好usermapper.xml文件之后我们需要将它添加在mybatis-config.xml中,代码如下:
<mappers> <mapper resource="mappers/usermapper.xml"/> </mappers>添加好之后我们就可以在usermapper中写需要进行的操作了,例如:
<!-- 根据id获取用户信息 --> <select id="selectUserById" parameterType="java.lang.String" resultType="cn.com.demo.pojo.User"> select * from user where userId = #{userId} </select> <!-- 根据username模糊查询用户 --> <select id="selectUserByUsername" parameterType="java.lang.String" resultType="cn.com.demo.pojo.User"> select * from user where username like '%${value}%' </select>注意: 上面的代码需要写在mapper节点之内,其中:
parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设 置占位符号并将输入变量id传到sql。resultType:定义结果映射类型。测试代码:
package cn.com.demo.test; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ import java.io.IOException; import java.io.InputStream; 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 cn.com.demo.pojo.User; public class Test { public static void main(String[] args) { //会话工厂 SqlSessionFactory sqlSessionFactory = null; SqlSession session = null; try { //配置文件地址 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开会话 session = sqlSessionFactory.openSession(); // //通过用户id查询用户信息 // User user = session.selectOne("test.selectUserById","S102"); // System.out.println(user); //通过用户username模糊查询用户 List<User> list = session.selectList("test.selectUserByUsername", "k"); System.out.println(list); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //关闭会话 if(session!=null){ session.close(); } } } }运行结果,通过id查找用户: 通过username模糊查找用户
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java 类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括 号中可以是value或其它名称。 ${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
parameterType:指定输入参数类型,mybatis 通过ognl从输入对象中获取参数值拼接在sql中。 resultType:指定输出结果类型,mybatis将sql 查询结果的一行记录数据映射为resultType指定类型的对象。
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常: selectList可以查询一- 条或多条记录。
SqISessionFactoryBuilder用于创建SqISessionFacoty, SqISessionFacoty 一旦创建完成就不需要SqISessionFactoryBuilder了,因为SqISession 是通过SqISessionFactory生产,所以可以将SqISessionFactoryBuilder当成一一个 工具类使用,最佳使用范围是方法范围即方法体内局部变量。
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理Sq|SessionFactory。
SqlSession是一-个面向用户的接口,sqlSession 中定义了数据库操作,默认使用DefaultSq|Session实现类。
usermapper中的代码:
<!-- 添加用户 --> <insert id="insertUser" parameterType="cn.com.demo.pojo.User"> insert into user(userId,username,password,age) values(#{userId},#{username},#{password},#{age}) </insert>测试代码:
package cn.com.demo.test; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ import java.io.IOException; import java.io.InputStream; import java.util.List; 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 cn.com.demo.pojo.User; public class Test { public static void main(String[] args) { //会话工厂 SqlSessionFactory sqlSessionFactory = null; SqlSession session = null; try { //配置文件地址 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开会话 session = sqlSessionFactory.openSession(); User user = new User("S105", "TOM", "159", 20); session.insert("test.insertUser", user); //提交事务 session.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(session!=null){ session.close(); } } } }从运行结果中可以看到添加成功:
usermapper中的代码:
<!-- 修改用户信息 --> <update id="updateUser" parameterType="cn.com.demo.pojo.User"> update user set userId=#{userId},username=#{username},password=#{password},age=#{age} where userId=#{userId} </update>测试类代码:
package cn.com.demo.test; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ import java.io.IOException; import java.io.InputStream; import java.util.List; 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 cn.com.demo.pojo.User; public class Test { public static void main(String[] args) { //会话工厂 SqlSessionFactory sqlSessionFactory = null; SqlSession session = null; try { //配置文件地址 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开会话 session = sqlSessionFactory.openSession(); User user = new User("S105", "TOM", "XXX", 21); session.update("test.updateUser", user); //提交事务 session.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(session!=null){ session.close(); } } } }由运行结果即可看出操作成功:
usermapper中的代码:
<!-- 删除用户信息 --> <delete id="deleteUserById" parameterType="java.lang.String"> delete from user where userId=#{userId} </delete>测试类代码:
package cn.com.demo.test; /* 原创作者:清风不渡 博客地址:https://blog.csdn.net/WXKKang */ import java.io.IOException; import java.io.InputStream; import java.util.List; 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 cn.com.demo.pojo.User; public class Test { public static void main(String[] args) { //会话工厂 SqlSessionFactory sqlSessionFactory = null; SqlSession session = null; try { //配置文件地址 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //使用SqlSessionFactoryBuilder从xml配置文件中创建sqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //打开会话 session = sqlSessionFactory.openSession(); //删除用户 session.delete("test.deleteUserById", "S105"); //提交事务 session.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(session!=null){ session.close(); } } } }由运行结果即可看出操作成功:
下面我们就来总结一下MyBatis是如何解决JDBC编程的问题: 1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 解决: 在mybatis-config.xml中配置数据链接池,使用连接池管理数据库链接。 2、Sql 语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql 变动需要改变java代码。 解决: 将Sql语句配置在XXXXmapper.xml文件中与java代码分离。 3、向sql语句传参数麻烦,因为sql语句的where条件不一-定, 可能多也可能少,占位符需要和参数一一-对 应。 解决: Mybatis 自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。 4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。 解决: Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定 义输出结果的类型。
好啦,上面就是我们的第一个mybaits小程序——简单实现用户信息的增删改查,下一篇我们会学习mybatis中的动态代理问题,那么我们下篇再见吧 好啦,今天的学习就到这里吧!记录学习,记录生活,我还是那个java界的小学生,一起努力吧!! 如果有什么缺陷欢迎各位看官评论探讨哟 ~ ~ 小生在此谢过了 ~ ~