1、 概念
持久层框架,apache项目
通过mybatis映射方式,自动灵活的生成满足需要的sql语句。
可将我们向prepareStatement输入参数,mybatis可以将餐宿自动输入到映射中,将我们查询出的结果集灵活的映射到java对象中。
全局配置文件:sqlMapConfig.xml
会话工厂:SqlSessionFactory
会话:sqlSession
执行器:Executor
底层封装对象:mappedstatement
各模块功能如图:
2、 mybatis入门案例
- 创建项目,导入jar包
- 创建表user表
- 添加日志文件配置log4j.properties以及mybatis全局配置文件SqlMapConfig.xml
- 创建entity、dao、daoimpl
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>
<!-- environments-用于获取连接池连接,将来与spring整合时,这个就不要啦,由spring来配置数据库连接 -->
<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/jdbc_user"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- mappers-用于引用映射文件 -->
<mappers>
<mapper resource="user.xml"/>
</mappers>
</configuration>
实体类:
public class User {
private int id;
private String name;
private int age;
private String nickname;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
@Override
public String toString() {
return "User [age=" + age + ", id=" + id + ", name=" + name
+ ", nickname=" + nickname + "]";
}
}
dao层:
public interface UserDao {
//根据id查找用户
public User findUserById(int id) throws Exception;
//查询所有用户
public List<User> findAllUsers() throws Exception;
//增加用户
public void inserUser(String name,int age,String nickname) throws Exception;
//根据id删除用户
public void deleteUser(int id) throws Exception;
//修改用户昵称
public void updateNickname(int id,String nickname) throws Exception;
//查询姓x的用户的个数
public int selectCount(String name) throws Exception;
}
dao实现层:
public class UserDaoImpl implements UserDao {
//根据id查找用户
public User findUserById(int id) throws Exception {
//1、得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过工厂得到会话
SqlSession session = factory.openSession();
//4、执行sql
//第一参数是namespace的id.select标签的id
//第二个参数就是传入参数,类型必须与parameterType指定的类型一致
User user = session.selectOne("user.findUserById", id);
//5、释放资源
session.close();
return user;
}
//查询所有用户
public List<User> findAllUsers() throws Exception {
//1、得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过工厂得到会话
SqlSession session = factory.openSession();
//4、执行sql
List<User> users = session.selectList("user.findAllUser");
//5、释放资源
session.close();
return users;
}
//添加用户
public void inserUser(String name, int age, String nickname)
throws Exception {
//1、得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过工厂得到会话
SqlSession session = factory.openSession();
//4、执行sql
User user = new User();
user.setName(name);
user.setAge(age);
user.setNickname(nickname);
session.insert("user.insertUser", user);
//增删改,要提交
session.commit();
//5、释放资源
session.close();
}
//根据id删除用户
public void deleteUser(int id) throws Exception {
//1、得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过工厂得到会话
SqlSession session = factory.openSession();
//4、执行sql
session.delete("user.deleteUser",id);
//增删改,要提交
session.commit();
//5、释放资源
session.close();
}
public void updateNickname(int id, String nickname) throws Exception {
//1、得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过工厂得到会话
SqlSession session = factory.openSession();
//4、执行sql
User user = new User();
user.setId(id);
user.setNickname(nickname);
session.update("user.updateNickname", user);
//增删改,要提交
session.commit();
//5、释放资源
session.close();
}
//查询姓x的用户的个数
public int selectCount(String name) throws Exception {
//1、得到配置文件流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//3、通过工厂得到会话
SqlSession session = factory.openSession();
//4、执行sql
int count = session.selectOne("user.selectCount", name);
//5、释放资源
session.close();
return count;
}
}
user.xml
<!-- mapper标签需要指定namespace属性,项目中属性值唯一 -->
<mapper namespace="user">
<!-- 根据id查找用户 -->
<!-- id:代表当前文件中查询的id,id在当前文件中唯一;
parameterType:用于指定输入参数的类型,可不写;
resultType:用于指定返回参数的类型,可不写 -->
<select id="findUserById" parameterType="int" resultType="com.mybatis.entity.User">
select * from user where id = #{id}
</select>
<!-- 查询所有用户 -->
<select id="findAllUser" resultType="com.mybatis.entity.User">
select * from user
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.mybatis.entity.User">
insert into user(name,age,nickname) values(#{name},#{age},#{nickname})
</insert>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<!-- 配置用户昵称 -->
<update id="updateNickname" parameterType="com.mybatis.entity.User">
update user set nickname=#{nickname} where id=#{id}
</update>
<!-- /查询姓x的用户的个数 -->
<select id="selectCount" parameterType="String" resultType="int">
<!-- 解析时候,name传入李,#会自动加上单引号'李'
name' and pwd='123
$ 李 update set name=''-->
<!--#占位符,可以接受输入参数,类型可以是简单类型、hashmap、pojo类
$可以接受输入参数,类型可以是简单类型、hashmap、pojo类
${}表示拼接符号,可能引起sql注入,不建议使用
-->
select count(id) from user where name like #{name}"%"
</select>
</mapper>
3、 主键的返回
- 自增的主键返回
先插入数据,再获取插入的自增id
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.mybatis.entity.User">
<!-- 将插入的主键返回,返回到输入参数的对象中 -->
<!-- keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性
order:是相对于insert语句来说它的执行顺序
resultType:用于指定返回参数的类型 -->
<selectKey keyProperty="id" order="AFTER" resultType="int">
<!-- 获取刚刚插入的记录的主键 -->
select LAST_INSERT_ID()
</selectKey>
insert into user(name,age,nickname) values(#{name},#{age},#{nickname})
</insert>
- 非自增主键的返回(mysql自动生成uuid)
先获取uuid主键,再将主键输入到sql语句中
<!-- 添加用户 -->
<insert id="insertPerson" parameterType="com.mybatis.entity.Person">
<!-- keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性
order:是相对于insert语句来说它的执行顺序
resultType:用于指定返回参数的类型 -->
<selectKey keyProperty="id" order="BEFORE" resultType="String">
<!-- 获取uuid -->
SELECT REPLACE(UUID(),'-','')
</selectKey>
insert into person(id,name,age,nickname) values(#{id},#{name},#{age},#{nickname})
</insert>