MyBatis
1)什么是MyBatis
开源的持久层框架
注:MyBatis底层任然是jdbc
jdbc 优点:速度快,容易掌握,缺点:代码繁琐
Hibernate 优点:不用写sql语句,代码简洁 缺点:对于比较复杂的查询,生成的sql性能低下,需要优化,难掌握
MyBatis 优点:速度适中,代码简洁,容易掌握
2)如何使用MyBatis
第一步:导包,在pom.xml中 mybatis(3.2.8版本)和ojdbc (14版本)
第二步:添加配置文件SqlMapConfig.xml 这个文件里面要做相应的修改
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:DHH" /> //这边要写自己数据库的各个参数
<property name="username" value="sa" />
<property name="password" value="dhh1990" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="entity/EmpMapper.xml" /> //这边是映射文件的路劲
</mappers>
</configuration>
第三步:添加一个实体类
注:这个类的成员变量的名字要和表的字段名字一样的,大小写无所谓,添加get和set方法
第四步:添加映射文件
注:主要是一些sql语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="test">
<!-- insert元素:表示往数据库里插入记录
id属性:要求唯一
parameterType属性:参数的类型,如果是类,要写类的全名(包名.类名)
-->
<insert id="save" parameterType="entity.Employee">
insert into t_emp values(t_emp_seq.nextval,#{name},#{salary},#{age}) //这边的#{name}相当于之前的? 这里是调用类中的getName 方法
</insert>
</mapper>
第五步:调用SQLSession提供的方法来访问数据库
首先要创建SQLSession对象
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
InputStream inputStream=TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory ssf=ssfb.build(inputStream);
SqlSession ss=ssf.openSession();
接下来就可以调用相应的方法了
Employee emp=new Employee();
emp.setName("dong");
emp.setSalary(60000);
emp.setAge(27);
ss.insert("test.save", emp); //这个调用的插入的方法 第一个参数是映射文件中的对应方法的id,第二个参数是映射文件中的 //parameterType属性的值对应的类型参数
ss.commit(); //用sqlsession对象,要手动提交事务的
ss.close();
工作原理: 1)配置文件SqlmapConfig.xml包含映射文件的路劲
2)SQLSessionFactory对象读取配置文件,然后创建包含好多预编译的statement语句对象的Map
3)通过调用SQLSessionFactory的openSession方法获得SQLSession对象
4)调用SqlSession的相应的插入,删除等方法,语句映射文件的sqlid找到对应的statement语句对象,再执行
例题:<mapper namespace="test">
<!-- insert元素:表示往数据库里插入记录
id属性:要求唯一
parameterType属性:sql语句中的参数的类型,如果是类,要写类的全名(包名.类名)
-->
<insert id="save" parameterType="entity.Employee">
insert into t_emp values(t_emp_seq.nextval,#{name},#{salary},#{age})
</insert>
<!-- resultType属性:是sql语句执行之后的返回值类型 如果返回值对象是类,要写类的全名(包名.类名) -->
<select id="findAll" resultType="entity.Employee">
select * from t_emp
</select>
<select id="findid" parameterType="int" resultType="entity.Employee">
select * from t_emp where id=#{id}
</select>
<update id="up" parameterType="entity.Employee">
update t_emp set name=#{name},salary=#{salary},age=#{age} where id=#{id}
</update>
<delete id="del" parameterType="int">
delete from t_emp where id=#{id}
</delete>
</mapper>
插入:调用session的insert方法 ss.insert("test.save", emp);
查询所有记录:调用session中的selectlist方法 ss.selectList("test.findAll");
查询一条记录:调用session中的selectOne方法 ss.selectOne("findid", 5);
修改记录:调用session中的update方法 ss.update("up", emp);
删除记录:调用session中的delete方法 ss.delete("del", 5);
解决实体类的属性名与表的字段名不一致的情况
方法一:使用别名
就是在写sql语句的时候,给字段名取别名。别名和实体类的变量名字一样
例如:select id as empNo,name as ename,salary,age from t_emp
方法二:使用resultMap
在sql语句的语句前添加<resultMap>元素
<!-- 告诉Mybatis,实体类的属性名与表的字段名的对应关系 -->
<resultMap type="entity.Emp" id="erm"> //这边的type就是实体类的类名
<result property="empNo" column="id"/> //property 表示的是类中的名字 column 表示的是表中对应的字段的名字
<result property="ename" column="name"/> //只要列出不同的字段就可以了
</resultMap>
然后在结果标签也要变成resultMap 它的值就是上面写的resultMap的id
<select id="findbyid3" parameterType="int" resultMap="erm">
select * from t_emp where id=#{id}
</select>
1、概念 是一个符合映射文件要求的接口
注:MyBatis会自动生成一个符合该接口要求的对象,只需要调用该对象的方法,就可以访问数据库
2、如何写一个Mapper映射器
a、在这个接口中的方法的方法名必须和sql语句的id一样
b、方法中的参数类型必须和parameterType一样
c、方法的返回值必须更resultType一样
d、映射文件namespace必须和接口的名字一样
/*mapper映射器*/
public interface EmpDAO {
public void save(Employee emp); //对应映射文件中的插入sql语句
public List<Employee> findAll(); //对应映射文件中的查询sql语句
public Employee findid(int id); //对应映射文件中的查询指定条件sql语句
public void up(Employee e); //对应映射文件中的修改sql语句
public void del(int i); //对应映射文件中的删除sql语句
}
通过SQLSession的ss.getMapper(EmpDAO.class);方法获得接口的对象,然后在调用相应的方法
1)什么是MyBatis
开源的持久层框架
注:MyBatis底层任然是jdbc
jdbc 优点:速度快,容易掌握,缺点:代码繁琐
Hibernate 优点:不用写sql语句,代码简洁 缺点:对于比较复杂的查询,生成的sql性能低下,需要优化,难掌握
MyBatis 优点:速度适中,代码简洁,容易掌握
2)如何使用MyBatis
第一步:导包,在pom.xml中 mybatis(3.2.8版本)和ojdbc (14版本)
第二步:添加配置文件SqlMapConfig.xml 这个文件里面要做相应的修改
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:DHH" /> //这边要写自己数据库的各个参数
<property name="username" value="sa" />
<property name="password" value="dhh1990" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="entity/EmpMapper.xml" /> //这边是映射文件的路劲
</mappers>
</configuration>
第三步:添加一个实体类
注:这个类的成员变量的名字要和表的字段名字一样的,大小写无所谓,添加get和set方法
第四步:添加映射文件
注:主要是一些sql语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="test">
<!-- insert元素:表示往数据库里插入记录
id属性:要求唯一
parameterType属性:参数的类型,如果是类,要写类的全名(包名.类名)
-->
<insert id="save" parameterType="entity.Employee">
insert into t_emp values(t_emp_seq.nextval,#{name},#{salary},#{age}) //这边的#{name}相当于之前的? 这里是调用类中的getName 方法
</insert>
</mapper>
第五步:调用SQLSession提供的方法来访问数据库
首先要创建SQLSession对象
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
InputStream inputStream=TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory ssf=ssfb.build(inputStream);
SqlSession ss=ssf.openSession();
接下来就可以调用相应的方法了
Employee emp=new Employee();
emp.setName("dong");
emp.setSalary(60000);
emp.setAge(27);
ss.insert("test.save", emp); //这个调用的插入的方法 第一个参数是映射文件中的对应方法的id,第二个参数是映射文件中的 //parameterType属性的值对应的类型参数
ss.commit(); //用sqlsession对象,要手动提交事务的
ss.close();
工作原理: 1)配置文件SqlmapConfig.xml包含映射文件的路劲
2)SQLSessionFactory对象读取配置文件,然后创建包含好多预编译的statement语句对象的Map
3)通过调用SQLSessionFactory的openSession方法获得SQLSession对象
4)调用SqlSession的相应的插入,删除等方法,语句映射文件的sqlid找到对应的statement语句对象,再执行
例题:<mapper namespace="test">
<!-- insert元素:表示往数据库里插入记录
id属性:要求唯一
parameterType属性:sql语句中的参数的类型,如果是类,要写类的全名(包名.类名)
-->
<insert id="save" parameterType="entity.Employee">
insert into t_emp values(t_emp_seq.nextval,#{name},#{salary},#{age})
</insert>
<!-- resultType属性:是sql语句执行之后的返回值类型 如果返回值对象是类,要写类的全名(包名.类名) -->
<select id="findAll" resultType="entity.Employee">
select * from t_emp
</select>
<select id="findid" parameterType="int" resultType="entity.Employee">
select * from t_emp where id=#{id}
</select>
<update id="up" parameterType="entity.Employee">
update t_emp set name=#{name},salary=#{salary},age=#{age} where id=#{id}
</update>
<delete id="del" parameterType="int">
delete from t_emp where id=#{id}
</delete>
</mapper>
插入:调用session的insert方法 ss.insert("test.save", emp);
查询所有记录:调用session中的selectlist方法 ss.selectList("test.findAll");
查询一条记录:调用session中的selectOne方法 ss.selectOne("findid", 5);
修改记录:调用session中的update方法 ss.update("up", emp);
删除记录:调用session中的delete方法 ss.delete("del", 5);
解决实体类的属性名与表的字段名不一致的情况
方法一:使用别名
就是在写sql语句的时候,给字段名取别名。别名和实体类的变量名字一样
例如:select id as empNo,name as ename,salary,age from t_emp
方法二:使用resultMap
在sql语句的语句前添加<resultMap>元素
<!-- 告诉Mybatis,实体类的属性名与表的字段名的对应关系 -->
<resultMap type="entity.Emp" id="erm"> //这边的type就是实体类的类名
<result property="empNo" column="id"/> //property 表示的是类中的名字 column 表示的是表中对应的字段的名字
<result property="ename" column="name"/> //只要列出不同的字段就可以了
</resultMap>
然后在结果标签也要变成resultMap 它的值就是上面写的resultMap的id
<select id="findbyid3" parameterType="int" resultMap="erm">
select * from t_emp where id=#{id}
</select>
Mapper映射器
要用映射器,前面MyBatis的配置,这些都要做的1、概念 是一个符合映射文件要求的接口
注:MyBatis会自动生成一个符合该接口要求的对象,只需要调用该对象的方法,就可以访问数据库
2、如何写一个Mapper映射器
a、在这个接口中的方法的方法名必须和sql语句的id一样
b、方法中的参数类型必须和parameterType一样
c、方法的返回值必须更resultType一样
d、映射文件namespace必须和接口的名字一样
/*mapper映射器*/
public interface EmpDAO {
public void save(Employee emp); //对应映射文件中的插入sql语句
public List<Employee> findAll(); //对应映射文件中的查询sql语句
public Employee findid(int id); //对应映射文件中的查询指定条件sql语句
public void up(Employee e); //对应映射文件中的修改sql语句
public void del(int i); //对应映射文件中的删除sql语句
}
通过SQLSession的ss.getMapper(EmpDAO.class);方法获得接口的对象,然后在调用相应的方法