Mybatis框架入门
刚学习了Spring,肯定不能少了mybatis,两者既有优势又有劣势。MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis 只要简单的配置和原始映射,将接口和 Java 的 POJO( 普通的Java 对象)映射成数据库中的记录.自我感觉使用起来很好。本周主要是学习了mybatis一些简单的使用过程。如mybatis框架原理、mybatis用户的增、删、改、查。mybatis开发dao两种方法:原始dao开发方法(程序需要编写dao接口和dao实现类)、mybaits的mapper接口(相当于dao接口)代理开发方法、mybatis配置文件SqlMapConfig.xml。
mybatis核心:(mybatis输入映射、mybatis输出映射)、mybatis的动态sql。
mybatis对数据库用户的增加、删、改、查
(1)原始dao开发方法:
1、配置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">
<!--
这个xml文件主要是用来配置mybatis的环境、数据源、事物等
-->
<configuration>
<properties resource="config/db.properties">
<!--properties中还可以配置一些属性名和属性值 -->
<!-- <property name="jdbc.driver" value=""/> -->
</properties>
<!-- 批量定义类地址别名 -->
<typeAliases>
<package name="sqlmap"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="config/User.xml"/>
<!--注意在使用接口代理时要配置加载的映射文件-->
<mapper resource="dailiDao/UserMapper.xml"/>
<!-- 批量加载映射文件 -->
<package name="sqlmap"/>
</mappers>
</configuration>
2、创建User类
package mybatisjdbc;
public class User {
//对应数据库定义的字段
private Integer id;
private String mail;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
}
3、代码实现
package mybatisjdbc;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.annotation.Resource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
org.junit.Test;
public class mybatisTest {
//@Test
public void finUserbyid() throws IOException{
//加载配置文件
String resource="config/SqlMapconfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,把mybatis配置信息传入
SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlsession
//SqlSession sqlsession=sqls.openSession();
SqlSession sqlSession = sqls.openSession();
//通过sqlsession操作数据库
/*
* 参数说明:
* 第一个参数为映射文件User.xml的id,其值为namespace.+id
* 第二个参数为映射文件User.xml的parameterType类型的参数
* sqlSession+查询对应的api
* */
User user=sqlSession .selectOne("test.finUser", 1);
System.out.println(user.getMail()+user.getId());
sqlSession.close();
}
//根据用户输入模糊查询
//@Test
public void finUserbyname() throws IOException{
//加载配置文件
String resource="config/SqlMapconfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,把mybatis配置信息传入
SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlsession
//SqlSession sqlsession=sqls.openSession();
SqlSession sqlSession = sqls.openSession();
//通过sqlsession操作数据库
/*
* 参数说明:
* 第一个参数为映射文件User.xml的id,其值为namespace.+id
* 第二个参数为映射文件User.xml的parameterType类型的参数
* */
List<User> user= sqlSession.selectList("test.finUsername", "xiao");
System.out.println(user);
sqlSession.close();
}
//添加用户信息
//@Test
public void addUser() throws IOException{
//加载配置文件
String resource="config/SqlMapconfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,把mybatis配置信息传入
SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlsession
//SqlSession sqlsession=sqls.openSession();
SqlSession sqlSession = sqls.openSession();
User user=new User();
user.setId(6);
user.setName("mybatis");
user.setMail("999999");
//通过sqlsession操作数据库
/*
* 参数说明:
* 第一个参数为映射文件User.xml的id,其值为namespace.+id
* 第二个参数为插入的对象
* 无返回值
* */
sqlSession.insert("test.addUser",user);
//提交事务
sqlSession.commit();
//关闭连接
sqlSession.close();
}
//根据id删除用户
//@Test
public void deleteUser() throws IOException{
//加载配置文件
String resource="config/SqlMapconfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,把mybatis配置信息传入
SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlsession
//SqlSession sqlsession=sqls.openSession();
SqlSession sqlSession = sqls.openSession();
//通过sqlsession操作数据库
/*
* 参数说明:
* 第一个参数为映射文件User.xml的id,其值为namespace.+id
* 第二个参数为插入的对象
* 无返回值
* */
sqlSession.insert("test.deletebyid",4);
//提交事务
sqlSession.commit();
//关闭连接
sqlSession.close();
}
//根据id修改用户信息
@Test
public void updateUser() throws IOException{
//加载配置文件
String resource="config/SqlMapconfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂,把mybatis配置信息传入
SqlSessionFactory sqls=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到sqlsession
//SqlSession sqlsession=sqls.openSession();
SqlSession sqlSession = sqls.openSession();
User user=new User();
user.setId(6);
user.setName("Spring");
user.setMail("999888");
//通过sqlsession操作数据库
/*
* 参数说明:
* 第一个参数为映射文件User.xml的id,其值为namespace.+id
* 第二个参数为插入的对象
* 无返回值
* */
sqlSession.insert("test.update",user);
//提交事务
sqlSession.commit();
//关闭连接
sqlSession.close();
}
mybaits的mapper接口代理开发dao
简单的理解就是把接口方法的实现交给mybatis,即在接口中定义方法即可在应用中直接使用完成对数据库的操作。
(1)定义mapper接口
package dailiDao;
import mybatisjdbc.User;
/**
* 使用mapper代理是注意mapper.java接口中的方法名和mapper.xml 中statement的id一致
* mapper.java接口中的方法输入参数类型和mapper.xml中statement 的parameterType指定的类型一致
* mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致
*
*/
public interface UserMapper {
//根据id查询用户,这里使用mapper代理机制
public User findUserById(int id) throws Exception;
}
(2)定义映射文件(别忘了在全局配置文件中加载此映射文件)
<?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的作用是对SQL进行分类管理
-->
<mapper namespace="test">
<!--
在映射文件中会配置许多sql语句,通过select执行对数据库查询
id:表示映射文件中的SQL语句,通过将SQL语句封装到mapperstatement中,所以将id称为staement的id
-->
<!--
#{}相当于占位符
#{value}其中的value表示传入的参数,括号里面的value可随便取.
parameterType:为输入的参数类型
resultType:为指定数据库查询返回的映射java对象,一般为定义的某个对象的路径
-->
<select id="finUser" parameterType="int" resultType="mybatisjdbc.User">
select * from user where id=#{value}
</select>
<!-- 根据用户输入进行模糊查询 -->
<!--
${}表示拼接sql串,但会引起SQL注入问题
${value}表示接收参数内容,如果传入参数是简单的类型只能用value
-->
<select id="finUsername" parameterType="String" resultType="mybatisjdbc.User">
select * from user where name like '%${value}%'
</select>
<!-- 添加用户信息 -->
<insert id="addUser" parameterType="mybatisjdbc.User" >
<!-- 当参数parameterType为类类型时,查询语句的值为其属性名 -->
insert into user(id,name,mail) value(#{id},#{name},#{mail})
</insert>
<!-- 根据id删除用户 -->
<delete id="deletebyid" parameterType="Int">
delete from user where id=#{vlaue}
</delete>
<update id="update" parameterType="mybatisjdbc.User">
update user set name=#{name},mail=#{mail} where id=#{id}
</update>
</mapper>
(3)测试类
package dailiDao;
import java.io.IOException;
import java.io.InputStream;
import mybatisjdbc.User;
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;
public class dailiTest {
private SqlSessionFactory sqls;
@Before//使用时先执行这个方法
public void init() throws IOException{
String resource="config/SqlMapconfig.xml";
//得到配置文件流
InputStream inputStream=Resources.getResourceAsStream(resource);
//创建会话工厂得到会话SqlSessionFactory,把mybatis配置信息传入
sqls=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test() throws Exception{
//调用工厂会话得到sqlsession
SqlSession sqlsession= sqls.openSession();
//调用UserMapper方法可以直接实现数据库查询,而不用实现这个接口的方法,mapper代理直接实现创建mapper对象
UserMapper usermapper=sqlsession.getMapper(UserMapper.class);
User user=usermapper.findUserById(2);
sqlsession.close();
System.out.println(user.getName());
}
}
以上是两种mybatis开发dao层的方法,可能第二种比较乱一点,但是弄懂了相比第一种方法更容易使用。很多要注意的地方都在代码中写注释了,不懂的可以去查相应的就会容易理解一点。