Mybatis基础
mybatis是apache下的顶级项目
让程序主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要的sql语句
mybatis可以向prepareStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
框架搭建步骤
工程目录结构:
数据库表属性:
一、导入jar依赖:mysql驱动包+mybatis包
二、创建log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 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
三、配置SqlMapConfig.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整合后enviroment配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理,事务控制由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 ,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
四、创建pojo类
package cn.mybatis.model;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer deptid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getDeptid() {
return deptid;
}
public void setDeptid(Integer deptid) {
this.deptid = deptid;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", age=" + age + ", deptid=" + deptid + "]";
}
}
五、创建映射文件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="cn.mybatis.dao.UserMapper" >
<!-- 在mapper中配置很多sql语句 -->
<!-- id:标志映射文件中的sql
将sql语句封装到mappedStatement对象中,所以id称为statement的id -->
<!-- parameterType绑定输入参数类型,这里指定int型 -->
<!-- #{}表示占位符 -->
<!-- #{id}其中id表示接收输入的参数,参数名称就是id,如果输入参数为简单类型,#{}中参数名可以任意,可以是value或其他 -->
<!-- resultType指定sql的输出结果所映射的java对象类型,select指定resultType表示单条记录映射成的java对象 -->
<select id="findUserById" parameterType="int" resultType="User">
select * from user where id = #{value}
</select>
<!-- 根据用户名模糊查询用户信息,可能返回多条 -->
<!-- resultType:指定单条记录映射成的java对象类型 -->
<!-- ${}表示拼接sql串,将接收到的参数内容不加任何修饰,拼接在sql中 -->
<!-- 使用${}拼接sql,容易引起sql注入,不安全 -->
<!-- ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value -->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.mybatis.model.User">
select * from user where username like '%${value}%'
</select>
<!-- 添加用户
parameterType:指定输入参数类型是pojo
#{}中指定pojo属性名,接收到pojo的属性值,mybatis通过OGNL获得对象的属性值 -->
<insert id="insertUser" parameterType="cn.mybatis.model.User">
<!-- 将插入数据的主键返回,返回到user对象中
SELECT LAST_INSERT_ID:得到刚insert进去记录的主键值,只适用于自增主键
keyProperty:将查询到的主键值设置到parameterType指定对象的哪个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定SELECT LAST_INSERT_ID()的结果类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(id,username,password,age) value(#{id},#{username},#{password},#{age})
</insert>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
<!-- 更新用户
需要传入用户的id
需要传入用户的更新信息
parameterType指定对象必须包含id否则更新全表
#{id}:从输入的user对象中获得id属性
-->
<update id="updateUser" parameterType="cn.mybatis.model.User">
update user set username = #{username},password = #{password},age = #{age}
where id = #{id}
</update>
</mapper>
六、在SqlMapConfig.xml<configuration>标签中添加以下代码,加载映射文件
<!-- 加载映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
七、创建JUnit测试类
package cn.mybatis.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 cn.mybatis.dao.UserMapper;
import cn.mybatis.model.User;
public class Test {
// 根据id查询用户
@org.junit.Test
public void testFindUserById() throws IOException {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过会话工程获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
// 第一个参数:映射文件中statement的id,等于命名空间+“.”+statement的id
// 第二个参数:制定映射文件中所匹配的parameterType类型的参数
// sqlSession.selectOne结果与映射文件中所匹配的resultType类型的对象
// selectOne查询出一条记录
User user = sqlSession.selectOne("cn.mybatis.dao.UserMapper.findUserById", 1);
System.out.println(user.toString());
// 释放资源
sqlSession.close();
}
// 根据用户名模糊查询用户
@org.junit.Test
public void testFindUserByName() throws IOException {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过会话工程获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
//list中User和映射文件中resultType所指定的类型一致
List<User> list = sqlSession.selectList("cn.mybatis.dao.UserMapper.findUserByName","dd");
System.out.println(list+","+list.size());
sqlSession.close();
}
// 新增用户
@org.junit.Test
public void testInsertUser() throws IOException {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过会话工程获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
User user = new User();
user.setUsername("小胡");
user.setPassword("123456");
user.setAge(21);
user.setDeptid(1);
sqlSession.insert("cn.mybatis.dao.UserMapper.insertUser",user);
// 提交事务
sqlSession.commit();
System.out.println(user.getId());
// 关闭会话
sqlSession.close();
}
// 根据id删除用户信息
@org.junit.Test
public void testdeleteUser() throws IOException {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过会话工程获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
sqlSession.delete("cn.mybatis.dao.UserMapper.deleteUser",14);
// 提交事务
sqlSession.commit();
// 关闭会话
sqlSession.close();
}
// 更新用户
@org.junit.Test
public void updateUser() throws IOException {
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过会话工程获得SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
User user = new User();
user.setId(13);
user.setUsername("aKuang");
user.setPassword("123456");
user.setAge(22);
user.setDeptid(1);
sqlSession.update("cn.mybatis.dao.UserMapper.updateUser",user);
// 提交事务
sqlSession.commit();
// 关闭会话
sqlSession.close();
}
}
属性总结:
parameterType
在映射文件中通过parameterType指定输入参数的类型
resultType
在映射文件中通过resultType指定输出结果的类型
#{}
表示一个占位符号
${}表示一个拼接符号,会引起sql注入,所以不建议使用${}
selectOne
表示查询出一条记录进行映射,如果使用selectOne可以实现,则使用selectList
也可以实现(list中只有一个对象)。
selectList
表示查询出一个列表(多条记录)进行映射,如果使用selectList
查询多条记录,不可以使用selectOne
自增主键返回主键见代码中
下一篇Mybatis Dao开发:https://blog.csdn.net/aKuang_JH/article/details/82683473