Mybatis详解

来源:互联网 发布:淘宝上的死飞耐用吗 编辑:程序博客网 时间:2024/04/28 11:42

Mybatis详解

关于Mybatis的具体介绍请参考http://www.mybatis.org/mybatis-3/zh/

创建Mybatis程序的大致步骤是:

1.添加Mybatis 的配置文件Configuration.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">                <property name="" value="" />            </transactionManager>            <dataSource type="UNPOOLED">                <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="" />            </dataSource>        </environment>    </environments></configuration>

2.创建实体类User和定义操作users 表的sql 映射文件userMapper.xml
在这里定义了一个select语句。

<?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="mybatis.test1.userMapper">    <!--根据id查询到一个uesr对象 -->    <select id="getUser" parameterType="int" resultType="mybatis.test1.User">        select * from users where id=#{id}    </select></mapper>

resultType表示的是返回值类型

3.在Configuration.xml文件中注册userMapper.xml 文件

<mappers>    <mapper resource="mybatis/test1/userMapper.xml" /></mappers>

4.执行定义的select 语句

    String resource = "Configuration.xml";    //加载mybatis 的配置文件(它也加载关联的映射文件)    Reader reader = Resources.getResourceAsReader(resource);    //构建sqlSession 的工厂    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);    //创建能执行映射文件中sql 的sqlSession    SqlSession session = sessionFactory.openSession();    //映射sql 的标识字符串    String statement = "mybatis.test1.userMapper"+".getUser";    //执行查询返回一个唯一user 对象的sql    User user = session.selectOne(statement, 1);    System.out.println(user);

这是的statementuserMapper.xmlmappernamespace属性,加上selectid属性

增删改查操作

XML实现

添加数据

添加数据要使用insert标签,如下:

<insert id="addUser" parameterType="mybatis.test2.User">    insert into users(name, age) values(#{name}, #{age})</insert>

parameterType使用的是User对象的全类名。
values(#{name}, #{age}#{}括号中对应的是User类的属性

编写测试类,测试下:

@Testpublic void testAdd() {    int insert = session.insert("mybatis.test2.userMapper.addUser", new User(-1, "xiaozhao", 23));    System.out.println(insert);}

insert表示受影响的行数,此时提示是1,表示是成功的,但是此时去查看数据库,会发现并没有插入的数据。是因为session = sessionFactory.openSession();是手动提交事务的,所以需要使用如下的方式:

int insert = session.insert("mybatis.test2.userMapper.addUser", new User(-1, "xiaozhao", 23));session.commit();

设置自动提交

session = sessionFactory.openSession(true);

删除数据

删除数据使用delete标签

<delete id="deleteUser" parameterType="int">    delete from users where id=#{id}</delete>

测试如下:

int delete = session.delete("mybatis.test2.userMapper.deleteUser", 6);session.commit();

修改数据

修改数据使用update标签

<update id="updateUser" parameterType="mybatis.test2.User">    update users set name=#{name}, age=#{age} where id=#{id}</update>

测试如下:

int insert = session.update("mybatis.test2.userMapper.updateUser", new User(4, "xiaowang", 30));session.commit();

查询数据

查询单个对象
在xml中的配置如下:

<!--根据id查询到一个uesr对象 --><select id="getUser" parameterType="int" resultType="mybatis.test2.User">    select * from users where id=#{id}</select>

获取查询的对象:

    User user = session.selectOne("mybatis.test2.userMapper.getUser", 1);    session.commit();    System.out.println(user);

查询所有对象
在xml中配置如下:

<select id="getAllUsers" resultType="mybatis.test2.User">    select * from users</select> 

测试如下:

    List<User> users = session.selectList("mybatis.test2.userMapper.getAllUsers");    session.commit();    System.out.println(users);

注解实现

基于注解实现,先写一个接口,把所有的sql语句写到接口中

package mybatis.test3;import java.util.List;import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update;import mybatis.test2.User;public interface UserMapper {    @Insert("insert into users(name, age) values(#{name}, #{age})")    public int add(User user);    @Delete("delete from users where id=#{id}")    public int deleteById(int id);    @Update("update users set name=#{name}, age=#{age} where id=#{id}")    public int update(User user);    @Select("select * from users where id=#{id}")    public User getById(int id);    @Select("select * from users")    public List<User> getAll();}

将接口文件添加到Configuration.xmlmappers

<mappers>    <mapper class="mybatis.test3.UserMapper" /></mappers>

测试添加如下:

    UserMapper mapper = session.getMapper(UserMapper.class);    int add = mapper.add(new User(-1, "xiaoqian", 23));    session.commit();    System.out.println(add);

优化

数据库连接单独放在一个文件

创建db.properties文件

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mybatisusername=rootpassword=

Configuration.xml中导入文件

<properties resource="db.properties"></properties>

dataSource标签中引用这些值:

        <dataSource type="UNPOOLED">            <property name="driver" value="${driver}" />            <property name="url" value="${url}" />            <property name="username" value="${username}" />            <property name="password" value="${password}" />        </dataSource>

为实体类定义别名,简化sql 映射xml 文件中的引用

配置别名

<!-- 配置实体类的别名 --><typeAliases>    <typeAlias type="mybatis.test2.User" alias="_User"/></typeAliases>

使用别名

<select id="getAllUsers" resultType="_User">    select * from users</select> 

可以在src 下加入log4j 的配置文件,打印日志信息

log4j.properties配置信息如下:

log4j.properties,log4j.rootLogger=DEBUG, Console#Consolelog4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%nlog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG

解决字段名与实体类属性名不相同的冲突

创建如下的orders表:

CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no VARCHAR(20),order_price FLOAT);INSERT INTO orders(order_no, order_price) VALUES('aaaa', 23);INSERT INTO orders(order_no, order_price) VALUES('bbbb', 33);INSERT INTO orders(order_no, order_price) VALUES('cccc', 22);

创建orders表对应的实体类,Order:

package mybatis.bean;public class Order {    private int id;    private String orderNo;    private float price;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getOrderNo() {        return orderNo;    }    public void setOrderNo(String orderNo) {        this.orderNo = orderNo;    }    public float getPrice() {        return price;    }    public void setPrice(float price) {        this.price = price;    }    public Order() {    }    public Order(int id, String orderNo, float price) {        super();        this.id = id;        this.orderNo = orderNo;        this.price = price;    }    @Override    public String toString() {        return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price + "]";    }}

可以发现,字段名和属性名并不一致。

创建orderMapper.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"><mapper namespace="mybatis.test4.orderMapper">    <!--根据id查询到一个order对象 -->    <select id="getOrder" parameterType="int" resultType="mybatis.bean.Order">        select * from orders where order_id=#{id}    </select></mapper>

使用如下方式来获取order对象:

    Order order = session.selectOne("mybatis.test4.orderMapper.getOrder", 1);    System.out.println(order);

会发现输出结果为null

如何显示order的查询呢?
1.通过在sql 语句中定义别名

<select id="getOrder" parameterType="int" resultType="mybatis.bean.Order">    select order_id id, order_no orderNo, order_price price from orders where order_id=#{id}</select>

2.通过<resultMap>

<!-- resultMap封装映射关系 --><resultMap type="mybatis.bean.Order" id="orderMap">    <!-- 针对主键 -->    <id property="id" column="order_id"/>    <result property="orderNo" column="order_no"/>    <result property="price" column="order_price"/></resultMap><select id="getOrder" parameterType="int" resultMap="orderMap">    select * from orders where order_id=#{id}</select>
0 0
原创粉丝点击