MyBatis框架
版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
一、Maven项目中使用MyBatis
项目结构:
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%n
mybatis默认使用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模糊查找用户
二、总结
1、Ognl 表达式#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java 类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。如果parameterType传输单个简单类型值,#{}括 号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
2、parameterType 和resultType
parameterType:指定输入参数类型,mybatis 通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql 查询结果的一行记录数据映射为resultType指定类型的对象。
3、selectOne 和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
selectList可以查询一- 条或多条记录。
4、SqlSessionFactoryBuilder
SqISessionFactoryBuilder用于创建SqISessionFacoty, SqISessionFacoty 一旦创建完成就不需要SqISessionFactoryBuilder了,因为SqISession 是通过SqISessionFactory生产,所以可以将SqISessionFactoryBuilder当成一一个 工具类使用,最佳使用范围是方法范围即方法体内局部变量。
5、SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理Sq|SessionFactory。
6、SqISession
SqlSession是一-个面向用户的接口,sqlSession 中定义了数据库操作,默认使用DefaultSq|Session实现类。
三、添加、修改和删除
1、添加用户信息
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();
}
}
}
}
从运行结果中可以看到添加成功:
2、修改用户信息
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();
}
}
}
}
由运行结果即可看出操作成功:
3、删除用户信息
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();
}
}
}
}
由运行结果即可看出操作成功:
4、总结
下面我们就来总结一下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界的小学生,一起努力吧!!
如果有什么缺陷欢迎各位看官评论探讨哟 ~ ~ 小生在此谢过了 ~ ~