MyBatis Generator配置文件table元素的属性useActualColumnNames
useActualColumnNames用于指定生成实体类时是否使用实际的列名作为实体类的属性名。取值true或false:
- true
MyBatis Generator会使用数据库中实际的字段名字作为生成的实体类的属性名。 - false
这是默认值。如果设置为false,则MyBatis Generator会将数据库中实际的字段名字转换为Camel Case风格作为生成的实体类的属性名。
如果明确的使用columnOverride元素指定了字段对应的实体的属性名,那么useActualColumnNames会被忽略。
假设表有一个字段名为start_date,如果这个属性设置为true,则生成的实体类的属性名为start_date,生成的setter/getter为setStart_date/getStart_date。如果useActualColumnNames设置为false,则生成的实体类的属性名为startDate,生成的setter/getter为setStartDate/getStartDate。
那为什么要在数据库表字段中使用Snake Case下划线风格呢?因为大部分数据库服务器对象的命名是不分大小写的,因此使用Snake Case命名风格还是十分有必要的。MyBatis Generator考虑的还真是仔细,将Snake Case转换为Camel Case以与Java风格保持一致。
===
[erq]
MyBatis Generator配置文件context元素的defaultModelType属性
MyBatis Generator配置文件context元素有一个defaultModelType属性,这个属性的值会影响实体类(或叫domain类,model类)的生成。
Eclipse Kepler自动完成时崩溃问题解决
Eclipse突然就开始崩溃不止了,估计与系统升级有关吧,总之又遇到坑了。
Netbeans 7.4 菜单无法使用问题
为什么Java IDE里到处是坑。Eclipse kepler慢吞吞,崩溃不止,好不容易想换Netbeans试试,菜单竟然无法使用!
MyBatis mapper文件中的变量引用方式#{var}与${var}
By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:
ORDER BY ${columnName}
Here MyBatis won’t modify or escape the string.
NOTE It’s not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.
默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。
有时候可能需要直接插入一个不做任何修改的字符串到SQL语句中。这时候应该使用${}语法。比如,ORDER BY字句
ORDER BY ${columnName}
MyBatis会原原本本的将columnName变量的值插入到SQL语句中,不做任何检查和转换。以这种方式将用户的输入直接插入到SQL语句中是不安全的,可能会导致潜在的SQL注入攻击,因此应该禁止直接将用户数据插入这些字段,或者执行必要的转义和检查。
K860i viberom 1351获取root以及安装google服务
总的来说vibe还算凑合,但是不提供root权限,不提供google服务,这样的rom和垃圾有什么两样!
MyBatis Generator产生的Example类
Example类用于构造复杂的筛选条件。
MyBatis传入参数与parameterType
Mybatis的Mapper文件中的select、insert、update、delete元素中有一个parameterType属性,用于对应的mapper接口方法接受的参数类型。
可以接受的参数类型有基本类型和复杂类型。
mapper接口方法一般接受一个参数,可以通过使用@Param注释将多个参数绑定到一个map做为输入参数。
- 简单数据类型
mapper接口方法:
1 | User selectByPrimaryKey(Integer id); |
sql映射:
1 | <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > |
对于简单数据类型,sql映射语句中直接#{变量名}这种方式引用就行了,其实这里的”变量名”可以是任意的。mapper接口方法传递过来的值,至于其叫什么名字其实是不可考也没必要知道的。
而且JAVA反射只能获取方法参数的类型,是无从得知方法参数的名字的。
比如上面这个示例中,使用#{id}来引用只是比较直观而已,使用其他名字来引用也是一样的。所以当在if元素中test传递的参数时,就必须要用_parameter来引用这个参数了。像这样:
1 | <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > |
如果test测试条件中使用id就会提示错误,因为这个参数其实没有名字,只是一个值或引用而已,只能使用_parameter来引用。
- 对象类型
传入JAVA复杂对象类型的话,sql映射语句中就可以直接引用对象的属性名了,这里的属性名是实实在在的真实的名字,不是随意指定的。
mapper接口方法:sql映射:1
int insert(User user);
1
2
3<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into tb_user (name, sex)
values (#{name,jdbcType=CHAR}, #{sex,jdbcType=CHAR})
虽然可以明确的引用对象的属性名了,但如果要在if元素中测试传入的user参数,仍然要使用_parameter来引用传递进来的实际参数,因为传递进来的User对象的名字是不可考的。如果测试对象的属性,则直接引用属性名字就可以了。
测试user对象:
1 | <if test="_parameter != null"> |
测试user对象的属性:
1 | <if test="name != null"> |
- map类型
传入map类型,直接通过#{keyname}就可以引用到键对应的值。使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。
mapper接口:
1 | int updateByExample(@Param("user") User user, @Param("example") UserExample example); |
sql映射:
1 | <update id="updateByExample" parameterType="map" > |
注意这里测试传递进来的map是否为空,仍然使用_parameter
- 集合类型
You can pass a List instance or an Array to MyBatis as a parameter object. When you do, MyBatis will automatically wrap it in a Map, and key it by name. List instances will be keyed to the name “list” and array instances will be keyed to the name “array”.
可以传递一个List或Array类型的对象作为参数,MyBatis会自动的将List或Array对象包装到一个Map对象中,List类型对象会使用list作为键名,而Array对象会用array作为键名。
集合类型通常用于构造IN条件,sql映射文件中使用foreach元素来遍历List或Array元素。
mapper接口:
1 | User selectUserInList(List<Interger> idlist); |
sql动态语句映射:
1 | <select id="selectUserInList" resultType="User"> |
- 对象类型中的集合属性
对于单独传递的List或Array,在SQL映射文件中映射时,只能通过list或array来引用。但是如果对象类型有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。
mapper接口:sql映射文件:1
List<User> selectByExample(UserExample example);
1
2
3<where >
<foreach collection="oredCriteria" item="criteria" separator="or" >
<if test="criteria.valid" >
在这里,UserExample有一个属性叫oredCriteria,其类型为List,所以在foreach元素里直接用属性名oredCriteria引用这个List即可。
item=”criteria”表示使用criteria这个名字引用每一个集合中的每一个List或Array元素