通过XML配置文件连接到数据库以及配置执行SQL语句的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 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/mybatis" />
<property name="username" value="root" />
<property name="password" value="20001101pyj" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="EmployeeMapper.xml" />
<mapper resource="EmployeeMapperPlus.xml" />
</mappers>
</configuration>
<mapper>标签中的XML文件是写SQL语句的
通过接口的方式创建操作数据库的规范
public interface EmployeeMapper {
public Employee getEmpById(int id);
public List<Employee> getEmpByNameLike(@Param("name")String name);
public void addEmp(Employee emp);
public void insert(@Param("lastName")String lastName,@Param("email")String
email,@Param("gender")String gender);
public void update(int id,String lastName,String gender,String email);
public void deleteById(int id);
}
接口对应的XML文件
namespace="com.pyj.mybatis.dao.EmployeeMapper"是与对应的接口建立联系
<?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="com.pyj.mybatis.dao.EmployeeMapper">
<select id="getEmpById"
resultType="com.pyj.mybatis.bean.Employee">
select id,last_name lastName,gender,email from tbl_employee where id = #{id}
</select>
<select id="getEmpByNameLike" resultType="com.pyj.mybatis.bean.Employee">
select id,last_name lastName,gender,email from tbl_employee where last_name like #{name}
</select>
<insert id="insert"
parameterType="com.pyj.mybatis.bean.Employee">
insert into tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
</insert>
<insert id="addEmp"
parameterType="com.pyj.mybatis.bean.Employee">
insert into tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
</insert>
<update id="update">
update tbl_employee
set last_name=#{param2},gender=#{param4},email=#{param3}
where id=#{param1}
</update>
<delete id="deleteById">
delete from tbl_employee where id=#{id}
</delete>
</mapper>
增删改查
增
XML文件中通过<insert>进行增添操作,其中id对应的是接口中对应的方法,parameterType是传入的类型(可写可不写)
<insert id="insert"
parameterType="com.pyj.mybatis.bean.Employee">
insert into tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
</insert>
<insert id="addEmp"
parameterType="com.pyj.mybatis.bean.Employee">
insert into tbl_employee(last_name,email,gender)
values(#{lastName},#{email},#{gender})
</insert>
#{}中对应的是输入的数据
1.接口中的方法通过注解@Param("lastName")为每一个属性创建名字,好应用在#{}中。
public void insert(@Param("lastName")String lastName,@Param("email")String
email,@Param("gender")String gender);
2. 接口中的方法通过传入一个具体的对象,#{}中填入对象具体的属性即可
public void addEmp(Employee emp);
除上述两种方法之外要想通过#{}赋值给SQL语句还可以根据传入值的顺序依次写入param1,param2。具体见更新方法
删
XML文件中通过<delete>进行删除操作
<delete id="deleteById">
delete from tbl_employee where id=#{id}
</delete>
对应接口中的方法
public void deleteById(int id);
如果传入的值只有一个则#{}中可以直接写对应的变量
改
XML文件中通过<update>进行更新操作
<update id="update">
update tbl_employee
set last_name=#{param2},gender=#{param4},email=#{param3}
where id=#{param1}
</update>
对应接口中的方法
public void update(int id,String lastName,String gender,String email);
此时既没有传入一个对象,有没有加注释,所以在#{}中写的是param
查
XML文件中通过<select>进行查询操作
使用resultType
1.查一条数据,resultType是得到的数据类型
注:若数据库表中对应列的名字与java类对应的名字不同,需将对应列起别名
<select id="getEmpByid" resultType="com.pyj.mybatis.bean.Employee">
select id,last_name lastName,gender,email from tbl_employee where id=#{name}
</select>
对应接口中的方法
public Employee getEmpById(int id);
2.查一堆数据
<select id="getEmpByNameLike" resultType="com.pyj.mybatis.bean.Employee">
select id,last_name lastName,gender,email from tbl_employee where last_name like #{name}
</select>
对应接口中的方法
public List<Employee> getEmpByNameLike(@Param("name")String name);
使用resultMap标签
若一个类对象A中的属性还是一个类对象B,那么SQL语句查询到的数据只能是B对象的属性值,并不能将查询到的对象B的数据封装到B对象中(暂时的理解:数据库中的列名与B对象没有对应关系)。此时需用resultMap标签来实现
将上面的resultType标签换成resultMap标签,同时在resultMap中对应好关系
column代表数据库中的列名,property代表java中的类对象的名字
dept就是B类,dname就是他的一个属性
方法一:通过对象.属性为对象赋值
<mapper namespace="com.pyj.mybatis.dao.EmployeeMapperPlus">
<resultMap type="com.pyj.mybatis.bean.EmployeeAndDep" id="Emp">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="name" property="dept.dname"/>
</resultMap>
<select id="getEmpAndDept" resultMap="Emp">
SELECT e.`id`,e.`last_name`,e.`email`,e.`gender`,d.`name` FROM tbl_employee e,development d
WHERE e.`d_id`=d.`id` AND e.`id`= #{id}
</select>
</mapper>
对应接口中的方法(EmployeeAndDep就是类A)
public EmployeeAndDep getEmpAndDept(Integer id);
方法二:
1.为单个对象赋值使用association标签
<resultMap type="com.pyj.mybatis.bean.EmployeeAndDep" id="Emp2">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<!-- property="dept"是B类在A类中的变量名,javaType是B类的路径 -->
<association property="dept" javaType="com.pyj.mybatis.bean.Development">
<!-- B类中的一个属性 -->
<result column="name" property="dname"/>
</association>
</resultMap>
<select id="getEmpAndDept2" resultMap="Emp3">
SELECT e.`id`,e.`last_name`,e.`email`,e.`gender`,d.`name` FROM tbl_employee e,development d
WHERE e.`d_id`=d.`id` AND e.`id`= #{id}
</select>
2.为对象集合赋值使用collection标签
<resultMap type="com.pyj.mybatis.bean.Development" id="Emp3">
<id column="did" property="id"/>
<result column="name" property="dname"/>
<!-- 定义集合 -->
<!-- property="emps"是B类在A类中的变量名,ofType是B类的路径 -->
<collection property="emps" ofType="com.pyj.mybatis.bean.EmployeeAndDep">
<id column="eid" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</collection>
</resultMap>
<select id="getByIdPlus" resultMap="Emp3">
SELECT d.id did,last_name,gender,email,d_id,e.id eid,`name`
FROM tbl_employee e LEFT JOIN development d
ON e.`d_id`=d.`id` WHERE d.id=#{id}
</select>
3.分段赋值
select语句获得根据传入的类A的id,得到类A的所有属性值,association中select是找到B类执行SQL语句的XML文件,也就是DevelopmentMapper.xml文件中方法(select中的id)为getById的执行语句,column是将当前SQL查询到的d_id值传递给找到的方法的SQL语句
若需要传递多个对象写法为column=["d_id",]
<resultMap type="com.pyj.mybatis.bean.EmployeeAndDep" id="Emp3">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<!-- select是找到DevelopmentMapper.xml文件中方法(select中的id)为getById的执行语句,column是将当前SQL查询到的d_id值传递给找到的方法的SQL语句 -->
<association property="dept" select="com.pyj.mybatis.dao.DevelopmentMapper.getById" column="d_id">
</association>
</resultMap>
<select id="getEmpAndDeptStep" resultMap="Emp3">
select * from tbl_employee where id=#{id}
</select>
找到的XML文件中对应的方法将查找到的值赋值给当前A对象中的B对象
<select id="getById" resultType="com.pyj.mybatis.bean.Development">
select name AS dname,id from development where id=#{id}
</select>
具体实现
首先与主的XML文件建立联系,找到所有可以执行SQL语句的XML配置文件,在此基础上创建一个工厂sqlSessionFactory用来创建执行者openSession
openSession.getMapper(EmployeeMapperPlus.class)方法是通过接口的类找到对应的接口
而执行SQL语句的XML文件在这篇文章最开始的地方通过namespace="com.pyj.mybatis.dao.EmployeeMapper"与对应的接口建立联系
mapper就是接口的实现类,通过mapper.接口中的方法就能执行SQL语句了
如果执行增删改操作可能需要提交
public void test() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
EmployeeAndDep ead=mapper.getEmpAndDept(1);
}finally {
openSession.close();
}
}