Mybatis的配置和演示增删改查的操作
一、Mybatis介绍:
1、MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
2、Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
二、Mybatis下载:
Mybatis下载:https://github.com/mybatis/mybatis-3/releases
Mybatis所需要的jar包可以通过这个地址:https://search.maven.org/ 进行下载
三、导包
创建好工程之后在WEB-INF下的lib里导入mybatis核心包、依赖包、数据驱动包。
四、创建几个所需要的文件
1、先给一个文件夹config(source folder类型),存放待会儿所需要的文件
1、配置文件
在config下面放入log4j.properties、SqlMapConfig.xml、sql映射文件User.xml
1、创建log4j.properties:右击config—>new—>Other—>找到-file-创建,随后将下面内容复制即可(mybatis默认使用log4j作为输出日志信息。)
# 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
2、创建SqlMapConfig.xml:右击config—>new—>Other—>找到-XML File-创建,复制以下内容(SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。)
<?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/db_test1?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
3、创建一个User类,同时再创建一个sql数据库
4、再来一个sql映射文件User.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语句的作用;
-----------------目前为止,准备工作已经ok,接下来是演示增删改查
五、先演示一个查找,搞清楚是怎么操作的
1、在SqlMapConfig.xml里的environments后面添加一个mappers,随后在mappers里面放入映射文件User.xml
2、在User.xml配置根据id获取用户信息
parameterType:定义输入到sql中的映射类型,
#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。
3、测试程序
package com.xh.test;
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 org.junit.Before;
import org.junit.Test;
import com.xh.user.Student;
import com.xh.user.User;
public class Test001 {
SqlSessionFactory ssf = null;
//获得一个会话工厂
@Before
public void creatFactory(){
InputStream input = null;
try {
input = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
ssf = new SqlSessionFactoryBuilder().build(input);
}
/** 通过id查找(一个结果集使用:session.selectOne())*/
//打开一个会话
@Test
public void testFindUserById(){
SqlSession session =ssf.openSession();
//System.out.println(session);
User user = session.selectOne("test.findUserById", 2);
System.out.println(user.getName());
session.close();
}
}
六、演示增删改查
1、映射文件User.xml
<mapper namespace="test">
<!-- 按照id查找——————查(注意:parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。一般用在=之后) -->
<select id="findUserById" parameterType="int" resultType="com.xh.user.User">
select * from test001 where id=#{id}
</select>
<!-- 按照用户名模糊查找——————查(注意:parameterType传输单个简单类型值,${}括号中只能是value。一般用在like之后)-->
<!-- 注意:如果结果是一个集合,resultType写集合中元素的类型 -->
<select id="findUserByName" parameterType="string" resultType="com.xh.user.User">
select * from test001 where name like "%${value}%"
</select>
<!-- 添加用户(拿取到当前插入数据的ID)——————增 -->
<insert id="insertUser" parameterType="com.xh.user.User">
<!-- 返回最近插入数据的id号 参数1:把查出来的ID给到了javaBea的ID 参数2:(AFTER)在插入之后再执行 参数3:结果集的类型 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into test001(name,password,sex,age) values(#{name},#{password},#{sex},#{age})
</insert>
<!-- 删除用户(根据ID删除指定用户)——————删 -->
<delete id="deleteUserById" parameterType="int">
delete from test001 where id=#{id}
</delete>
<!-- 添加用户(根据ID修改指定用户)——————改 -->
<update id="updateUser" parameterType="com.xh.user.User">
update test001 set name=#{name},password=#{password},sex=#{sex},age=#{age} where id=#{id}
</update>
</mapper>
2、测试
package com.xh.test;
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 org.junit.Before;
import org.junit.Test;
import com.xh.user.Student;
import com.xh.user.User;
public class Test001 {
SqlSessionFactory ssf = null;
//获得一个会话工厂
@Before
public void creatFactory(){
InputStream input = null;
try {
input = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
ssf = new SqlSessionFactoryBuilder().build(input);
}
/** 通过id查找(一个结果集使用:session.selectOne())*/
//打开一个会话
@Test
public void testFindUserById(){
SqlSession session =ssf.openSession();
//System.out.println(session);
User user = session.selectOne("test.findUserById", 2);
System.out.println(user.getName());
session.close();
}
/** 通过用户名模糊查找(多个结果集需要用到:session.selectList()) */
@Test
public void testFindUserByName(){
SqlSession session =ssf.openSession();
//System.out.println(session);
List<User> user = session.selectList("test.findUserByName", "老");
for (User x : user) {
System.out.println(x.getName()+","+x.getSex());
}
session.close();
}
/**用户添加(自增ID)*/
@Test
public void testInertOne() {
//创建数据库会话实列
SqlSession session = ssf.openSession();
//添加用户信息
User user = new User();
user.setName("董明珠");
user.setPassword("password");
user.setSex("女");
user.setAge(17);
session.insert("test.insertUser",user);
//拿到当前插入数据的id号
System.out.println(user.getId());
//提交事务
session.commit();
//关闭资源
session.close();
}
/**用户删除*/
@Test
public void testDeleteById() {
//创建数据库会话实列
SqlSession session = ssf.openSession();
session.delete("test.deleteUserById",10);
//提交事务
session.commit();
//关闭资源
session.close();
}
/**用户修改*/
@Test
public void testUpdateID() {
//创建数据库会话实列
SqlSession session = ssf.openSession();
User user = new User();
user.setId(5);
user.setName("老五");
user.setPassword("password");
user.setSex("男");
user.setAge(18);
session.update("test.updateUser", user);
//提交事务
session.commit();
//关闭资源
session.close();
}
}