MyBatis
1.MyBatis简介
之前叫iBatis 之后google改名为MyBatis(新版本)
作用:封装了JDBC操作,简化数据库访问
封装功能如下:
封装了获取连接,执行SQL,释放连接
封装了SQL参数设置(参数Emp)
insert into emp(name,age) values(#{name},#{age})
封装了记录映射成实体对象过程就是 RowMapper
实体类属性名与查询结果集ResultSet中列名保持一致
用别名的话以别名为准。就是说以显示出来的为准.
开发者的主要工作:写SQL和实体类,然后使用SqlSession对象执行SQL操作.
2.MyBatis主要结构
引入jar包(驱动包+mybatis包)
还要引入SqlMapConfig.xml 配置文件
如果再来个表,再写个实体类,加个xml文件
3.MyBatis使用方法
导入包。导入配置文件。
写实体类。注意要和数据库中字段名要一致。
写Mapper.xml SQL语句文件
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 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/jsd1507db" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 指定加载SQL定义文件 -->
<mappers>
<!-- 指向sql语句xml文件 -->
<mapper resource="entity/EmpMapper.xml" />
</mappers>
</configuration>
实体类
package entity;
import java.io.Serializable;
public class Emp implements Serializable{
private Integer id;
private String name;
private Double salary;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
SQL语句Mapper.xml
EmpMapper.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">
<!--等价于dao接口的实现 namespace必须和接口的类路径一样 -->
<mapper namespace="empsql">
<!-- 这个针对的命名空间是empsql 这个select查询出来的结果映射成enity下的Emp类型 -->
<select id="findAll" resultType="entity.Emp">select * from emp</select>
<!-- 如果要有值传入sql语句。那么就可以把?换成#{属性名} 然后在select属性写传入值的类型 -->
<select id="findlikeName" parameterType="String" resultType="entity.Emp">select * from emp where name like #{name}</select>
</mapper>
测试类(创建SqlSession对象)
package test;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class TestMybatisEmp {
public static void main(String[]args) throws IOException{
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//加载SqlMapConfig.xml文件
String conf = "SqlMapConfig.xml";
InputStream configStream = TestMybatisEmp.class.getClassLoader().getResourceAsStream(conf);
//获取SqlSessionFactory
SqlSessionFactory factory =builder.build(configStream);
//获取SqlSession
SqlSession session = factory.openSession();
System.out.println("使用SqlSession操作");
//操作完要释放session
session.close();
}
}
要注意细节。我就是遇到有的地方少写了字母。就导致了错误。但是针对报错进行修改还是容易些。
要是想使用Mapper.xml文件的sql语句
例如:查询所有:
List<Emp> list = session.selectList("findAll");
for(Emp emp :list){
System.out.println("id: "+emp.getId()+" name: "+emp.getName());
}
如果是查询单行就是selectOne()
有参数的:
Emp emp = session.selectOne("findlikeName","lue");
System.out.println("id: "+emp.getId()+" name: "+emp.getName());
其Mapper.xml 的对应配置是:
<!-- 如果要有值传入sql语句。那么就可以把?换成#{属性名} 然后在select属性写传入值的类型 -->
<select id="findlikeName" parameterType="string" resultType="entity.Emp">select * from emp where name = #{name}</select>
千万不要忘了写返回类型
resultType="entity.Emp"
同理:根据id查询:
<select id="findById" parameterType="int" resultType="entity.Emp" >select * from emp where id=#{id}</select>
对测试中如果返回为null。那么就是返回说未查询到!
删除是
<delete id=”delete” parameterType=”int”>
delete from emp where id=#{id}
<delete/>
更新是
<update id=”updateSalary” parameterType=”entity.Emp”>
update emp set salary=${salary} where id=#{id}
</update>
还是用这个Emp。但是使用salary这个属性和id属性
!!!!!!!!!!!!!!!!!!!!!!!
我遇到了问题:::
插入数据库,而数据库的表中显示为null!!!
<insert id="save" parameterType="entity.Emp">
insert into emp (name,salary,age) values (#{name},#{salary},#{age})
</insert>
Emp emp1=new Emp();
emp.setName("Recar");
emp.setSalary(8000.0);
emp.setAge(30);
session.insert("empsql.save",emp1);
//这里的操作必须要进行事务提交,要不运行过后数据表并没有插入到信息,数据表的增删改都需要提交事务
session.commit();
session.close();
研究了一晚上也不知道是怎么回事?求解答。我自己也在寻找解决办法。找到了更新。
恩,复习的时候重新写了一遍就可以用了!!!就可以了就没有NULL了。。。。
好灵异!